ZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci8uZ2l0aWdub3JlIGIvdHRvcnJlbnQtbWFzdGVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3NzAzYQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjUgQEAKKyMgR2l0IGlnbm9yZSBwYXR0ZXJucworIyBBdXRob3I6IE1heGltZSBQZXRhenpvbmkgPG1wZXRhenpvbmlAdHVybi5jb20+CisKKyMgSWdub3JlIGJ1aWxkIG91dHB1dAorL2J1aWxkLyoKKyovYnVpbGQKKworIyBJZ25vcmUgSmF2YWRvYyBvdXRwdXQKKy9kb2MvKgorCisjIElnbm9yZSBhbnkgZXZlbnR1YWwgRWNsaXBzZSBwcm9qZWN0IGZpbGVzLCB0aGVzZSBkb24ndCBiZWxvbmcgaW4gdGhlCisjIHJlcG9zaXRvcnkuCisvLmNsYXNzcGF0aAorLy5wcm9qZWN0CisvLnNldHRpbmdzCisvLmlkZWEvd29ya3NwYWNlLnhtbAorIyBJZ25vcmUgY29tbW9uIGVkaXRvciBzd2FwIGZpbGVzCisqLnN3cAorKi5iYWsKKyp+CisqfgorCisjaWdub3JlIGlkZWEgd29ya3NwYWNlIGZpbGUgYW5kIGlkZWEgbW9kdWxlIGZpbGVzCisqLmltbAorLmlkZWEvd29ya3NwYWNlLnhtbApkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL0NPUFlJTkcgYi90dG9ycmVudC1tYXN0ZXIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL0NPUFlJTkcKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvSU5TVEFMTCBiL3R0b3JyZW50LW1hc3Rlci9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzEyMWUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvSU5TVEFMTApAQCAtMCwwICsxLDI4IEBACitIb3d0byBidWlsZCBhbmQgdXNlIHRoZSBCaXRUb3JyZW50IGxpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEZXBlbmRlbmNpZXMKKy0tLS0tLS0tLS0tLQorCitUaGlzIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wgaW1wbGVtZW50cyBhIEJpdFRvcnJlbnQKK3RyYWNrZXIgKGFuIEhUVFAgc2VydmljZSksIGFuZCBhIEJpdFRvcnJlbnQgY2xpZW50LiBUaGUgb25seSBkZXBlbmRlbmNpZXMgb2YKK3RoZSBCaXRUb3JyZW50IGxpYnJhcnkgYXJlOgorCisqIHRoZSBsb2c0aiBsaWJyYXJ5CisqIHRoZSBzbGY0aiBsb2dnaW5nIGxpYnJhcnkKKyogdGhlIFNpbXBsZUhUVFBGcmFtZXdvcmsKKworVGhlc2UgbGlicmFyaWVzIGFyZSBwcm92aWRlZCBpbiB0aGUgbGliLyBkaXJlY3RvcnksIGFuZCBhcmUgYXV0b21hdGljYWxseQoraW5jbHVkZWQgaW4gdGhlIEpBUiBmaWxlIGNyZWF0ZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuCisKKworQnVpbGRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBKQVIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbXBseSBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAkIG12biBwYWNrYWdlCisKK1RvIGJ1aWxkIHRoZSBsaWJyYXJ5J3MgSkFSIGZpbGUgKGluIHRoZSB0YXJnZXQvIGRpcmVjdG9yeSkuIFlvdSBjYW4gdGhlbiBpbXBvcnQKK3RoaXMgSkFSIGZpbGUgaW50byB5b3VyIEphdmEgcHJvamVjdCBhbmQgc3RhcnQgdXNpbmcgdGhlIEphdmEgQml0VG9ycmVudAorbGlicmFyeS4KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9SRUFETUUubWQgYi90dG9ycmVudC1tYXN0ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWYzYzgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTUzIEBACitbIVtKZXRCcmFpbnMgdGVhbSBwcm9qZWN0XShodHRwOi8vamIuZ2cvYmFkZ2VzL3RlYW0uc3ZnKV0oaHR0cHM6Ly9jb25mbHVlbmNlLmpldGJyYWlucy5jb20vZGlzcGxheS9BTEwvSmV0QnJhaW5zK29uK0dpdEh1YikKKworVHRvcnJlbnQsIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQml0VG9ycmVudCBwcm90b2NvbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIyMjIE5vdGUKK0l0J3MgVHRvcnJlbnQgbGlicmFyeSB2ZXJzaW9uIDIuMCB3aGljaCBoYXMKK2EgbG90IG9mIGltcHJvdmVtZW50cyBhbmQgbWF5IG5vdCBiZSBjb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbgorKHN0b3JlZCBpbiBbdjEuNiBicmFuY2hdKGh0dHBzOi8vZ2l0aHViLmNvbS9tcGV0YXp6b25pL3R0b3JyZW50L3RyZWUvdjEuNikpCisKK1NlZSBbdGhpcyBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL21wZXRhenpvbmkvdHRvcnJlbnQvaXNzdWVzLzIxMikgZm9yIGRldGFpbHMgCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCisqKlR0b3JyZW50KiogaXMgYSBwdXJlLUphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wsCitwcm92aWRpbmcgYSBCaXRUb3JyZW50IHRyYWNrZXIsIGEgQml0VG9ycmVudCBjbGllbnQgYW5kIHRoZSByZWxhdGVkIFRvcnJlbnQKK21ldGFpbmZvIGZpbGVzIGNyZWF0aW9uIGFuZCBwYXJzaW5nIGNhcGFiaWxpdGllcy4gSXQgaXMgZGVzaWduZWQgdG8gYmUgZW1iZWRkZWQKK2ludG8gbGFyZ2VyIGFwcGxpY2F0aW9ucywgYnV0IGl0cyBjb21wb25lbnRzIGNhbiBhbHNvIGJlIHVzZWQgYXMgc3RhbmRhbG9uZQorcHJvZ3JhbXMuCisKK1R0b3JyZW50IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQkVQcyAoQml0VG9ycmVudCBlbmhhbmNlbWVudCBwcm9wb3NhbHMpOgorCisqIGBCRVAjMDAwM2A6IFRoZSBCaXRUb3JyZW50IHByb3RvY29sIHNwZWNpZmljYXRpb24gIAorICBUaGlzIGlzIHRoZSBiYXNlIG9mZmljaWFsIHByb3RvY29sIHNwZWNpZmljYXRpb24sIHdoaWNoIFR0b3JyZW50IGltcGxlbWVudHMKKyAgZnVsbHkuCisqIGBCRVAjMDAxMmA6IE11bHRpLXRyYWNrZXIgbWV0YWRhdGEgZXh0ZW5zaW9uICAKKyAgRnVsbCBzdXBwb3J0IGZvciB0aGUgYGFubm91bmNlLWxpc3RgIG1ldGEtaW5mbyBrZXkgcHJvdmlkaW5nIGEgdGllcmVkIHRyYWNrZXIKKyAgbGlzdC4KKyogYEJFUCMwMDE1YDogVURQIFRyYWNrZXIgUHJvdG9jb2wgZm9yIEJpdFRvcnJlbnQgIAorICBUaGUgVURQIHRyYWNrZXIgcHJvdG9jb2wgaXMgZnVsbHkgc3VwcG9ydGVkIGluIHRoZSBCaXRUb3JyZW50IGNsaWVudCB0byBtYWtlCisgIGFubm91bmNlIHJlcXVlc3RzIHRvIFVEUCB0cmFja2Vycy4gVURQIHRyYWNrZXIgc3VwcG9ydCBpdHNlbGYgaXMgcGxhbm5lZC4KKyogYEJFUCMwMDIwYDogUGVlciBJRCBjb252ZW50aW9ucyAgCisgIFR0b3JyZW50IHVzZXMgYFRPYCBhcyB0aGUgY2xpZW50IGlkZW50aWZpY2F0aW9uIHN0cmluZywgYW5kIGN1cnJlbnRseSB1c2VzCisgIHRoZSBgLVQwMDA0Mi1gIGNsaWVudCBJRCBwcmVmaXguCisqIGBCRVAjMDAyM2A6IFRyYWNrZXIgUmV0dXJucyBDb21wYWN0IFBlZXIgTGlzdHMgIAorICBDb21wYWN0IHBlZXIgbGlzdHMgYXJlIHN1cHBvcnRlZCBpbiBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSB0cmFja2VyLgorICBDdXJyZW50bHkgdGhlIHRyYWNrZXIgb25seSBzdXBwb3J0cyBzZW5kaW5nIGJhY2sgY29tcGFjdCBwZWVyIGxpc3RzCisgIHRvIGFuIGFubm91bmNlIHJlcXVlc3QuCisKK0hpc3RvcnkKKy0tLS0tLS0KKworVGhpcyB0b29sIHN1aXRlIHdhcyBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFR1cm4ncyAoaHR0cDovL3d3dy50dXJuLmNvbSkgcmVsZWFzZQorZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IHN5c3RlbSBhbmQgaXMgdXNlZCB0byBkaXN0cmlidXRlIG5ldyBidWlsZCB0YXJiYWxscwordG8gYSBsYXJnZSBudW1iZXIgb2YgbWFjaGluZXMgaW5zaWRlIGEgZGF0YWNlbnRlciBhcyBlZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KK0F0IHRoZSB0aW1lIHRoaXMgcHJvamVjdCB3YXMgc3RhcnRlZCwgZmV3IEphdmEgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorQml0VG9ycmVudCBwcm90b2NvbCBleGlzdGVkIGFuZCB1bmZvcnR1bmF0ZWx5IG5vbmUgb2YgdGhlbSBmaXQgb3VyIG5lZWRzOgorCisqIFZ1emUncywgd2hpY2ggaXMgdmVyeSBoYXJkIHRvIGV4dHJhY3QgZnJvbSB0aGVpciBjb2RlYmFzZSwgYW5kIHRodXMgY29tcGxleAordG8gcmUtaW50ZWdyYXRlIGludG8gYW5vdGhlciBhcHBsaWNhdGlvbjsKKyogdG9ycmVudDRqLCB3aGljaCBpcyBsYXJnZWx5IGluY29tcGxldGUgYW5kIG5vdCB1c2FibGU7CisqIFNuYXJrJ3MsIHdoaWNoIGlzIG9sZCwgYW5kIHVuZm9ydHVuYXRlbHkgdW5zdGFibGU7CisqIGJpdGV4dCwgd2hpY2ggd2FzIGFsc28gdW5mb3J0dW5hdGVseSB1bnN0YWJsZSwgYW5kIGV4dHJlbWVseSBzbG93LgorCitUaGlzIGltcGxlbWVudGF0aW9uIGFpbXMgYXQgcHJvdmlkaW5nIGEgZG93bi10by1lYXJ0aCwgc2ltcGxlIHRvIHVzZSBsaWJyYXJ5LgorTm8gZmFuY3kgcHJvdG9jb2wgZXh0ZW5zaW9ucyBhcmUgaW1wbGVtZW50ZWQgaGVyZToganVzdCB0aGUgYmFzaWNzIHRoYXQgYWxsb3dzCitmb3IgdGhlIGV4Y2hhbmdlIGFuZCBkaXN0cmlidXRpb24gb2YgZmlsZXMgdGhyb3VnaCB0aGUgQml0VG9ycmVudCBwcm90b2NvbC4KKworSG93IHRvIHVzZQorLS0tLS0tLS0tLQorCisjIyMgQXMgYSBsaWJyYXJ5CisKKyMjIyMgQ2xpZW50IGNvZGUKKworYGBgamF2YQorLy8gRmlyc3QsIGluc3RhbnRpYXRlIHRoZSBDbGllbnQgb2JqZWN0LgorU2ltcGxlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVDbGllbnQoKTsKKworLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRoZSBjbGllbnQgd2lsbCBsaXN0ZW4gb24gKHlvdSBtaWdodCBuZWVkIHNvbWV0aGluZworLy8gZWxzZSB0aGFuIGxvY2FsaG9zdCBoZXJlIGJlY2F1c2Ugb3RoZXIgcGVlcnMgY2Fubm90IGNvbm5lY3QgdG8gbG9jYWxob3N0KS4KK0luZXRBZGRyZXNzIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKworLy9TdGFydCBkb3dubG9hZC4gVGhyZWFkIGlzIGJsb2NrZWQgaGVyZQordHJ5IHsKKyAgY2xpZW50LmRvd25sb2FkVG9ycmVudCgiL3BhdGgvdG8vZmlsZWQudG9ycmVudCIsCisgICAgICAgICAgIi9wYXRoL3RvL291dHB1dC9kaXJlY3RvcnkiLAorICAgICAgICAgIGFkZHJlc3MpOworICAvL2Rvd25sb2FkIGZpbmlzaGVkCit9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAvL2Rvd25sb2FkIGZhaWxlZCwgc2VlIGV4Y2VwdGlvbiBmb3IgZGV0YWlscworICBlLnByaW50U3RhY2tUcmFjZSgpOworfQorLy9JZiB5b3UgZG9uJ3Qgd2FudCB0byBzZWVkIHRoZSB0b3JyZW50IHlvdSBjYW4gc3RvcCBjbGllbnQKK2NsaWVudC5zdG9wKCk7CitgYGAKKworIyMjIyBUcmFja2VyIGNvZGUKKworYGBgamF2YQorLy8gRmlyc3QsIGluc3RhbnRpYXRlIGEgVHJhY2tlciBvYmplY3Qgd2l0aCB0aGUgcG9ydCB5b3Ugd2FudCBpdCB0byBsaXN0ZW4gb24uCisvLyBUaGUgZGVmYXVsdCB0cmFja2VyIHBvcnQgcmVjb21tZW5kZWQgYnkgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wgaXMgNjk2OS4KK1RyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyKDY5NjkpOworCisvLyBUaGVuLCBmb3IgZWFjaCB0b3JyZW50IHlvdSB3aXNoIHRvIGFubm91bmNlIG9uIHRoaXMgdHJhY2tlciwgc2ltcGx5IGNyZWF0ZWQKKy8vIGEgVHJhY2tlZFRvcnJlbnQgb2JqZWN0IGFuZCBwYXNzIGl0IHRvIHRoZSB0cmFja2VyLmFubm91bmNlKCkgbWV0aG9kOgorRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIudG9ycmVudCIpOworICB9Cit9OworCitmb3IgKEZpbGUgZiA6IG5ldyBGaWxlKCIvcGF0aC90by90b3JyZW50L2ZpbGVzIikubGlzdEZpbGVzKGZpbHRlcikpIHsKKyAgdHJhY2tlci5hbm5vdW5jZShUcmFja2VkVG9ycmVudC5sb2FkKGYpKTsKK30KKworLy9BbHNvIHlvdSBjYW4gZW5hYmxlIGFjY2VwdGluZyBmb3JlaWduIHRvcnJlbnRzLgorLy9pZiB0cmFja2VyIGFjY2VwdHMgcmVxdWVzdCBmb3IgdW5rbm93biB0b3JyZW50IGl0IHN0YXJ0cyB0cmFja2luZyB0aGUgdG9ycmVudCBhdXRvbWF0aWNhbGx5Cit0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworLy8gT25jZSBkb25lLCB5b3UganVzdCBoYXZlIHRvIHN0YXJ0IHRoZSB0cmFja2VyJ3MgbWFpbiBvcGVyYXRpb24gbG9vcDoKK3RyYWNrZXIuc3RhcnQodHJ1ZSk7CisKKy8vIFlvdSBjYW4gc3RvcCB0aGUgdHJhY2tlciB3aGVuIHlvdSdyZSBkb25lIHdpdGg6Cit0cmFja2VyLnN0b3AoKTsKK2BgYAorCitMaWNlbnNlCistLS0tLS0tCisKK1RoaXMgQml0VG9ycmVudCBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlCitMaWNlbnNlIHZlcnNpb24gMi4wLiBTZWUgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCisKKworQXV0aG9ycyBhbmQgY29udHJpYnV0b3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBNYXhpbWUgUGV0YXp6b25pIDw8bXBldGF6em9uaUB0dXJuLmNvbT4+IChQbGF0Zm9ybSBFbmdpbmVlciBhdCBUdXJuLCBJbmMpICAKKyAgT3JpZ2luYWwgYXV0aG9yLCBtYWluIGRldmVsb3BlciBhbmQgbWFpbnRhaW5lcgorKiBEYXZpZCBHaWZmaW4gPDxkYXZpZEBldHN5LmNvbT4+ICAKKyAgQ29udHJpYnV0ZWQgcGFyYWxsZWwgaGFzaGluZyBhbmQgbXVsdGktZmlsZSB0b3JyZW50IHN1cHBvcnQuCisqIFRob21hcyBaaW5rIDw8dGhvbWFzLnppbmtAdW5pLWtvbnN0YW56LmRlPj4gIAorICBGaXhlZCBhIHBpZWNlIGxlbmd0aCBjb21wdXRhdGlvbiBpc3N1ZSB3aGVuIHRoZSB0b3RhbCB0b3JyZW50IHNpemUgaXMgYW4KKyAgZXhhY3QgbXVsdGlwbGUgb2YgdGhlIHBpZWNlIHNpemUuCisqIEpvaGFuIFBhcmVudCA8PHBhcmVudF9qb2hhbkB5YWhvby5jb20+PiAgCisgIEZpeGVkIGEgYnVnIGluIHVuZnJlc2ggcGVlciBjb2xsZWN0aW9uIGFuZCBpc3N1ZXMgb24gZG93bmxvYWQgY29tcGxldGlvbiBvbgorICBXaW5kb3dzIHBsYXRmb3Jtcy4KKyogRG1pdHJpeSBEdW1hbnNraXkgIAorICBDb250cmlidXRlZCB0aGUgc3dpdGNoIGZyb20gQW50IHRvIE1hdmVuLgorKiBBbGV4ZXkgUHRhc2huaXkgIAorICBGaXhlZCBhbiBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbiBvZiBhIHRvcnJlbnQncyBmdWxsIHNpemUuCisKKworQ2F2ZWF0cworLS0tLS0tLQorCisqIENsaWVudCB3cml0ZSBwZXJmb3JtYW5jZSBpcyBhIGJpdCBwb29yLCBtYWlubHkgZHVlIHRvIGEgKHRvbz8pIHNpbXBsZSBwaWVjZQorICBjYWNoaW5nIGFsZ29yaXRobS4KKworQ29udHJpYnV0aW9ucyBhcmUgd2VsY29tZSBpbiBhbGwgYXJlYXMsIGV2ZW4gbW9yZSBzbyBmb3IgdGhlc2UgZmV3IHBvaW50cworYWJvdmUhCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYXNzZW1ibHkueG1sIGIvdHRvcnJlbnQtbWFzdGVyL2Fzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2Fzc2VtYmx5LnhtbApkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTYyOGEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3BvbS54bWwKQEAgLTAsMCArMSwxNyBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPG5hbWU+dHRvcnJlbnQvYmVuY29kaW5nPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1iZW5jb2Rpbmc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JEZWNvZGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JEZWNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyYjNhYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkRlY29kZXIuamF2YQpAQCAtMCwwICsxLDMyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5iY29kZWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEItZW5jb2RpbmcgZGVjb2Rlci4KKyAqCisgKiA8cD4KKyAqIEEgYi1lbmNvZGVkIGJ5dGUgc3RyZWFtIGNhbiByZXByZXNlbnQgYnl0ZSBhcnJheXMsIG51bWJlcnMsIGxpc3RzIGFuZCBtYXBzCisgKiAoZGljdGlvbmFyaWVzKS4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgZGVjb2RlciBvZiBzdWNoIHN0cmVhbXMgaW50bworICoge0BsaW5rIEJFVmFsdWV9cy4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIEluc3BpcmVkIGJ5IFNuYXJrJ3MgaW1wbGVtZW50YXRpb24uCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmVuY29kZSI+Qi1lbmNvZGluZyBzcGVjaWZpY2F0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgQkRlY29kZXIgeworCisgIC8vIFRoZSBJbnB1dFN0cmVhbSB0byBCRGVjb2RlLgorICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGluOworCisgIC8vIFRoZSBsYXN0IGluZGljYXRvciByZWFkLgorICAvLyBaZXJvIGlmIHVua25vd24uCisgIC8vICcwJy4uJzknIGluZGljYXRlcyBhIGJ5dGVbXS4KKyAgLy8gJ2knIGluZGljYXRlcyBhbiBOdW1iZXIuCisgIC8vICdsJyBpbmRpY2F0ZXMgYSBMaXN0LgorICAvLyAnZCcgaW5kaWNhdGVzIGEgTWFwLgorICAvLyAnZScgaW5kaWNhdGVzIGVuZCBvZiBOdW1iZXIsIExpc3Qgb3IgTWFwIChvbmx5IHVzZWQgaW50ZXJuYWxseSkuCisgIC8vIC0xIGluZGljYXRlcyBlbmQgb2Ygc3RyZWFtLgorICAvLyBDYWxsIGdldE5leHRJbmRpY2F0b3IgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlICh3aWxsIG5ldmVyIHJldHVybiB6ZXJvKS4KKyAgcHJpdmF0ZSBpbnQgaW5kaWNhdG9yID0gMDsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQkRlY29kZXIuCisgICAqCisgICAqIDxwPgorICAgKiBOb3RoaW5nIGlzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHlldC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gaW4gVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAqLworICBwdWJsaWMgQkRlY29kZXIoSW5wdXRTdHJlYW0gaW4pIHsKKyAgICB0aGlzLmluID0gaW47CisgIH0KKworICAvKioKKyAgICogRGVjb2RlIGEgQi1lbmNvZGVkIHN0cmVhbS4KKyAgICoKKyAgICogPHA+CisgICAqIEF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGVzIGEgbmV3IEJEZWNvZGVyIGZvciB0aGUgcHJvdmlkZWQgaW5wdXQgc3RyZWFtCisgICAqIGFuZCBkZWNvZGVzIGl0cyByb290IG1lbWJlci4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gaW4gVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJFVmFsdWUgYmRlY29kZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEJEZWNvZGVyKGluKS5iZGVjb2RlKCk7CisgIH0KKworICAvKioKKyAgICogRGVjb2RlIGEgQi1lbmNvZGVkIGJ5dGUgYnVmZmVyLgorICAgKgorICAgKiA8cD4KKyAgICogQXV0b21hdGljYWxseSBpbnN0YW50aWF0ZXMgYSBuZXcgQkRlY29kZXIgZm9yIHRoZSBwcm92aWRlZCBidWZmZXIgYW5kCisgICAqIGRlY29kZXMgaXRzIHJvb3QgbWVtYmVyLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBkYXRhIFRoZSB7QGxpbmsgQnl0ZUJ1ZmZlcn0gdG8gcmVhZCBmcm9tLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCRVZhbHVlIGJkZWNvZGUoQnl0ZUJ1ZmZlciBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBCRGVjb2Rlci5iZGVjb2RlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhLmFycmF5KCkpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoYXQgdGhlIG5leHQgYi1lbmNvZGVkIG9iamVjdCB3aWxsIGJlIG9uIHRoZSBzdHJlYW0gb3IgLTEKKyAgICogd2hlbiB0aGUgZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgKgorICAgKiA8cD4KKyAgICogQ2FuIHJldHVybiBzb21ldGhpbmcgdW5leHBlY3RlZCAobm90ICcwJyAuLiAnOScsICdpJywgJ2wnIG9yICdkJykgd2hlbgorICAgKiB0aGUgc3RyZWFtIGlzbid0IGItZW5jb2RlZC4KKyAgICogPC9wPgorICAgKgorICAgKiBUaGlzIG1pZ2h0IG9yIG1pZ2h0IG5vdCByZWFkIG9uZSBleHRyYSBieXRlIGZyb20gdGhlIHN0cmVhbS4KKyAgICovCisgIHByaXZhdGUgaW50IGdldE5leHRJbmRpY2F0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICh0aGlzLmluZGljYXRvciA9PSAwKSB7CisgICAgICB0aGlzLmluZGljYXRvciA9IGluLnJlYWQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG5leHQgaW5kaWNhdG9yIGFuZCByZXR1cm5zIGVpdGhlciBudWxsIHdoZW4gdGhlIHN0cmVhbQorICAgKiBoYXMgZW5kZWQgb3IgYi1kZWNvZGVzIHRoZSByZXN0IG9mIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgdGhlCisgICAqIGFwcHJvcHJpYXRlIEJFVmFsdWUgZW5jb2RlZCBvYmplY3QuCisgICAqLworICBwdWJsaWMgQkVWYWx1ZSBiZGVjb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodGhpcy5nZXROZXh0SW5kaWNhdG9yKCkgPT0gLTEpCisgICAgICByZXR1cm4gbnVsbDsKKworICAgIGlmICh0aGlzLmluZGljYXRvciA+PSAnMCcgJiYgdGhpcy5pbmRpY2F0b3IgPD0gJzknKQorICAgICAgcmV0dXJuIHRoaXMuYmRlY29kZUJ5dGVzKCk7CisgICAgZWxzZSBpZiAodGhpcy5pbmRpY2F0b3IgPT0gJ2knKQorICAgICAgcmV0dXJuIHRoaXMuYmRlY29kZU51bWJlcigpOworICAgIGVsc2UgaWYgKHRoaXMuaW5kaWNhdG9yID09ICdsJykKKyAgICAgIHJldHVybiB0aGlzLmJkZWNvZGVMaXN0KCk7CisgICAgZWxzZSBpZiAodGhpcy5pbmRpY2F0b3IgPT0gJ2QnKQorICAgICAgcmV0dXJuIHRoaXMuYmRlY29kZU1hcCgpOworICAgIGVsc2UKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICgiVW5rbm93biBpbmRpY2F0b3IgJyIgKyB0aGlzLmluZGljYXRvciArICInIik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmV4dCBiLWVuY29kZWQgdmFsdWUgb24gdGhlIHN0cmVhbSBhbmQgbWFrZXMgc3VyZSBpdCBpcyBhCisgICAqIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiBpdCBpcyBub3QgYSBiLWVuY29kZWQgYnl0ZSBhcnJheS4KKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIGJkZWNvZGVCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IGMgPSB0aGlzLmdldE5leHRJbmRpY2F0b3IoKTsKKyAgICBpbnQgbnVtID0gYyAtICcwJzsKKyAgICBpZiAobnVtIDwgMCB8fCBudW0gPiA5KQorICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIk51bWJlciBleHBlY3RlZCwgbm90ICciCisgICAgICAgICAgICAgICsgKGNoYXIpIGMgKyAiJyIpOworICAgIHRoaXMuaW5kaWNhdG9yID0gMDsKKworICAgIGMgPSB0aGlzLnJlYWQoKTsKKyAgICBpbnQgaSA9IGMgLSAnMCc7CisgICAgd2hpbGUgKGkgPj0gMCAmJiBpIDw9IDkpIHsKKyAgICAgIC8vIFRoaXMgY2FuIG92ZXJmbG93IQorICAgICAgbnVtID0gbnVtICogMTAgKyBpOworICAgICAgYyA9IHRoaXMucmVhZCgpOworICAgICAgaSA9IGMgLSAnMCc7CisgICAgfQorCisgICAgaWYgKGMgIT0gJzonKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiQ29sb24gZXhwZWN0ZWQsIG5vdCAnIiArCisgICAgICAgICAgICAgIChjaGFyKSBjICsgIiciKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEJFVmFsdWUocmVhZChudW0pKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuZXh0IGItZW5jb2RlZCB2YWx1ZSBvbiB0aGUgc3RyZWFtIGFuZCBtYWtlcyBzdXJlIGl0IGlzIGEKKyAgICogbnVtYmVyLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgaXQgaXMgbm90IGEgbnVtYmVyLgorICAgKi8KKyAgcHVibGljIEJFVmFsdWUgYmRlY29kZU51bWJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IGMgPSB0aGlzLmdldE5leHRJbmRpY2F0b3IoKTsKKyAgICBpZiAoYyAhPSAnaScpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJFeHBlY3RlZCAnaScsIG5vdCAnIiArCisgICAgICAgICAgICAgIChjaGFyKSBjICsgIiciKTsKKyAgICB9CisgICAgdGhpcy5pbmRpY2F0b3IgPSAwOworCisgICAgYyA9IHRoaXMucmVhZCgpOworICAgIGlmIChjID09ICcwJykgeworICAgICAgYyA9IHRoaXMucmVhZCgpOworICAgICAgaWYgKGMgPT0gJ2UnKQorICAgICAgICByZXR1cm4gbmV3IEJFVmFsdWUoQmlnSW50ZWdlci5aRVJPKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIidlJyBleHBlY3RlZCBhZnRlciB6ZXJvLCIgKworICAgICAgICAgICAgICAgICIgbm90ICciICsgKGNoYXIpIGMgKyAiJyIpOworICAgIH0KKworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgbW9yZSB0aGUgMjU1IGNoYXIgYmlnIGludGVnZXJzCisgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMjU2XTsKKyAgICBpbnQgb2ZmID0gMDsKKworICAgIGlmIChjID09ICctJykgeworICAgICAgYyA9IHRoaXMucmVhZCgpOworICAgICAgaWYgKGMgPT0gJzAnKQorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiTmVnYXRpdmUgemVybyBub3QgYWxsb3dlZCIpOworICAgICAgY2hhcnNbb2ZmXSA9ICctJzsKKyAgICAgIG9mZisrOworICAgIH0KKworICAgIGlmIChjIDwgJzEnIHx8IGMgPiAnOScpCisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiSW52YWxpZCBJbnRlZ2VyIHN0YXJ0ICciCisgICAgICAgICAgICAgICsgKGNoYXIpIGMgKyAiJyIpOworICAgIGNoYXJzW29mZl0gPSAoY2hhcikgYzsKKyAgICBvZmYrKzsKKworICAgIGMgPSB0aGlzLnJlYWQoKTsKKyAgICBpbnQgaSA9IGMgLSAnMCc7CisgICAgd2hpbGUgKGkgPj0gMCAmJiBpIDw9IDkpIHsKKyAgICAgIGNoYXJzW29mZl0gPSAoY2hhcikgYzsKKyAgICAgIG9mZisrOworICAgICAgYyA9IHJlYWQoKTsKKyAgICAgIGkgPSBjIC0gJzAnOworICAgIH0KKworICAgIGlmIChjICE9ICdlJykKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJJbnRlZ2VyIHNob3VsZCBlbmQgd2l0aCAnZSciKTsKKworICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhjaGFycywgMCwgb2ZmKTsKKyAgICByZXR1cm4gbmV3IEJFVmFsdWUobmV3IEJpZ0ludGVnZXIocykpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5leHQgYi1lbmNvZGVkIHZhbHVlIG9uIHRoZSBzdHJlYW0gYW5kIG1ha2VzIHN1cmUgaXQgaXMgYQorICAgKiBsaXN0LgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgaXQgaXMgbm90IGEgbGlzdC4KKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIGJkZWNvZGVMaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIGlmIChjICE9ICdsJykgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkV4cGVjdGVkICdsJywgbm90ICciICsKKyAgICAgICAgICAgICAgKGNoYXIpIGMgKyAiJyIpOworICAgIH0KKyAgICB0aGlzLmluZGljYXRvciA9IDA7CisKKyAgICBMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QkVWYWx1ZT4oKTsKKyAgICBjID0gdGhpcy5nZXROZXh0SW5kaWNhdG9yKCk7CisgICAgd2hpbGUgKGMgIT0gJ2UnKSB7CisgICAgICByZXN1bHQuYWRkKHRoaXMuYmRlY29kZSgpKTsKKyAgICAgIGMgPSB0aGlzLmdldE5leHRJbmRpY2F0b3IoKTsKKyAgICB9CisgICAgdGhpcy5pbmRpY2F0b3IgPSAwOworCisgICAgcmV0dXJuIG5ldyBCRVZhbHVlKHJlc3VsdCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmV4dCBiLWVuY29kZWQgdmFsdWUgb24gdGhlIHN0cmVhbSBhbmQgbWFrZXMgc3VyZSBpdCBpcyBhCisgICAqIG1hcCAoZGljdGlvbmFyeSkuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiBpdCBpcyBub3QgYSBtYXAuCisgICAqLworICBwdWJsaWMgQkVWYWx1ZSBiZGVjb2RlTWFwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIGlmIChjICE9ICdkJykgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkV4cGVjdGVkICdkJywgbm90ICciICsKKyAgICAgICAgICAgICAgKGNoYXIpIGMgKyAiJyIpOworICAgIH0KKyAgICB0aGlzLmluZGljYXRvciA9IDA7CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIHdoaWxlIChjICE9ICdlJykgeworICAgICAgLy8gRGljdGlvbmFyeSBrZXlzIGFyZSBhbHdheXMgc3RyaW5ncy4KKyAgICAgIFN0cmluZyBrZXkgPSB0aGlzLmJkZWNvZGUoKS5nZXRTdHJpbmcoKTsKKworICAgICAgQkVWYWx1ZSB2YWx1ZSA9IHRoaXMuYmRlY29kZSgpOworICAgICAgcmVzdWx0LnB1dChrZXksIHZhbHVlKTsKKworICAgICAgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIH0KKyAgICB0aGlzLmluZGljYXRvciA9IDA7CisKKyAgICByZXR1cm4gbmV3IEJFVmFsdWUocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBJbnB1dFN0cmVhbSAoYXMgaW50KS4KKyAgICoKKyAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gSWYgSW5wdXRTdHJlYW0ucmVhZCgpIHJldHVybmVkIC0xLgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IGMgPSB0aGlzLmluLnJlYWQoKTsKKyAgICBpZiAoYyA9PSAtMSkKKyAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKKyAgICByZXR1cm4gYzsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgYnl0ZVtdIGNvbnRhaW5pbmcgbGVuZ3RoIHZhbGlkIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCB6ZXJvLgorICAgKgorICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBJZiBJbnB1dFN0cmVhbS5yZWFkKCkgcmV0dXJuZWQgLTEgYmVmb3JlIGFsbAorICAgKiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgYnl0ZXMgY291bGQgYmUgcmVhZC4gIE5vdGUgdGhhdCB0aGUgYnl0ZVtdIHJldHVybmVkIG1pZ2h0IGJlCisgICAqICAgICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGVuIHJlcXVlc3RlZCBidXQgd2lsbCBvbmx5IGNvbnRhaW4gbGVuZ3RoIHZhbGlkIGJ5dGVzLiAgVGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5dGVbXSB3aWxsIGJlIHJldXNlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZ2Fpbi4KKyAgICovCisgIHByaXZhdGUgYnl0ZVtdIHJlYWQoaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKworICAgIGludCByZWFkID0gMDsKKyAgICB3aGlsZSAocmVhZCA8IGxlbmd0aCkgeworICAgICAgaW50IGkgPSB0aGlzLmluLnJlYWQocmVzdWx0LCByZWFkLCBsZW5ndGggLSByZWFkKTsKKyAgICAgIGlmIChpID09IC0xKQorICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisgICAgICByZWFkICs9IGk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRVZhbHVlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JFVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzViY2YxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRVZhbHVlLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEEgdHlwZS1hZ25vc3RpYyBjb250YWluZXIgZm9yIEItZW5jb2RlZCB2YWx1ZXMuCisgKgorICogYuWKoOWvhuaWueazle+8jGJ056eN5a2Q5paH5Lu25Lit5a2Y5YKo5pWw5o2u55qE6KeE5YiZCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEJFVmFsdWUgeworCisgIC8qKgorICAgKiBUaGUgQi1lbmNvZGVkIHZhbHVlIGNhbiBiZSBhIGJ5dGUgYXJyYXksIGEgTnVtYmVyLCBhIExpc3Qgb3IgYSBNYXAuCisgICAqIExpc3RzIGFuZCBNYXBzIGNvbnRhaW5zIEJFVmFsdWVzIHRvby4KKyAgICovCisgIHByaXZhdGUgZmluYWwgT2JqZWN0IHZhbHVlOworCisgIHB1YmxpYyBCRVZhbHVlKGJ5dGVbXSB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBCRVZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgfQorCisgIHB1YmxpYyBCRVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIGVuYykKKyAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlLmdldEJ5dGVzKGVuYyk7CisgIH0KKworICBwdWJsaWMgQkVWYWx1ZShpbnQgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gbmV3IEludGVnZXIodmFsdWUpOworICB9CisKKyAgcHVibGljIEJFVmFsdWUobG9uZyB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSBuZXcgTG9uZyh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgQkVWYWx1ZShOdW1iZXIgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgQkVWYWx1ZShMaXN0PEJFVmFsdWU+IHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgcHVibGljIEJFVmFsdWUoTWFwPFN0cmluZywgQkVWYWx1ZT4gdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgIHJldHVybiB0aGlzLnZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBCRVZhbHVlIGFzIGEgU3RyaW5nLCBpbnRlcnByZXRlZCBhcyBVVEYtOC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBieXRlW10uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoIlVURi04Iik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgYSBTdHJpbmcsIGludGVycHJldGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgKiBlbmNvZGluZy4KKyAgICoKKyAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyB0byBpbnRlcnByZXQgdGhlIGJ5dGVzIGFzIHdoZW4gY29udmVydGluZworICAgKiAgICAgICAgICAgICAgICAgdGhlbSBpbnRvIGEge0BsaW5rIFN0cmluZ30uCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGEgYnl0ZVtdLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKHRoaXMuZ2V0Qnl0ZXMoKSwgZW5jb2RpbmcpOworICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKGNjZS50b1N0cmluZygpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IodWVlLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBhIGJ5dGVbXS4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBieXRlW10uCisgICAqLworICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gKGJ5dGVbXSkgdGhpcy52YWx1ZTsKKyAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbihjY2UudG9TdHJpbmcoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBCRVZhbHVlIGFzIGEgTnVtYmVyLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIHtAbGluayBOdW1iZXJ9LgorICAgKi8KKyAgcHVibGljIE51bWJlciBnZXROdW1iZXIoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAoTnVtYmVyKSB0aGlzLnZhbHVlOworICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKGNjZS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgc2hvcnQuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGEge0BsaW5rIE51bWJlcn0uCisgICAqLworICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkuc2hvcnRWYWx1ZSgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBCRVZhbHVlIGFzIGludC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSB7QGxpbmsgTnVtYmVyfS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0SW50KCkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpLmludFZhbHVlKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgbG9uZy4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSB7QGxpbmsgTnVtYmVyfS4KKyAgICovCisgIHB1YmxpYyBsb25nIGdldExvbmcoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkubG9uZ1ZhbHVlKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgYSBMaXN0IG9mIEJFVmFsdWVzLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhbgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEFycmF5TGlzdH0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIExpc3Q8QkVWYWx1ZT4gZ2V0TGlzdCgpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5TGlzdCkgeworICAgICAgcmV0dXJuIChBcnJheUxpc3Q8QkVWYWx1ZT4pIHRoaXMudmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJFeGNlcHRlZCBMaXN0PEJFdmFsdWU+ICEiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgYSBNYXAgb2YgU3RyaW5nIGtleXMgYW5kIEJFVmFsdWUgdmFsdWVzLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIHtAbGluayBIYXNoTWFwfS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgTWFwPFN0cmluZywgQkVWYWx1ZT4gZ2V0TWFwKCkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgSGFzaE1hcCkgeworICAgICAgcmV0dXJuIChNYXA8U3RyaW5nLCBCRVZhbHVlPikgdGhpcy52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkV4cGVjdGVkIE1hcDxTdHJpbmcsIEJFVmFsdWU+ICEiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkVuY29kZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE5NzIwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBCLWVuY29kaW5nIGVuY29kZXIuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyB0byBlbmNvZGUgb2JqZWN0cyBhbmQKKyAqIHtAbGluayBCRVZhbHVlfXMgdG8gQi1lbmNvZGluZyBpbnRvIGEgcHJvdmlkZWQgb3V0cHV0IHN0cmVhbS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIEluc3BpcmVkIGJ5IFNuYXJrJ3MgaW1wbGVtZW50YXRpb24uCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmVuY29kZSI+Qi1lbmNvZGluZyBzcGVjaWZpY2F0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgQkVuY29kZXIgeworCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShPYmplY3QgbywgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgaWYgKG8gaW5zdGFuY2VvZiBCRVZhbHVlKSB7CisgICAgICBvID0gKChCRVZhbHVlKSBvKS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICBiZW5jb2RlKChTdHJpbmcpIG8sIG91dCk7CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICBiZW5jb2RlKChieXRlW10pIG8sIG91dCk7CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICBiZW5jb2RlKChOdW1iZXIpIG8sIG91dCk7CisgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgYmVuY29kZSgoTGlzdDxCRVZhbHVlPikgbywgb3V0KTsKKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgIGJlbmNvZGUoKE1hcDxTdHJpbmcsIEJFVmFsdWU+KSBvLCBvdXQpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgYmVuY29kZTogIiArCisgICAgICAgICAgICAgIG8uZ2V0Q2xhc3MoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlbmNvZGUoU3RyaW5nIHMsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJzID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICBiZW5jb2RlKGJzLCBvdXQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlbmNvZGUoTnVtYmVyIG4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0LndyaXRlKCdpJyk7CisgICAgU3RyaW5nIHMgPSBuLnRvU3RyaW5nKCk7CisgICAgb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgIG91dC53cml0ZSgnZScpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGJlbmNvZGUoTGlzdDxCRVZhbHVlPiBsLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0LndyaXRlKCdsJyk7CisgICAgZm9yIChCRVZhbHVlIHZhbHVlIDogbCkgeworICAgICAgYmVuY29kZSh2YWx1ZSwgb3V0KTsKKyAgICB9CisgICAgb3V0LndyaXRlKCdlJyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShieXRlW10gYnMsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGwgPSBJbnRlZ2VyLnRvU3RyaW5nKGJzLmxlbmd0aCk7CisgICAgb3V0LndyaXRlKGwuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgIG91dC53cml0ZSgnOicpOworICAgIG91dC53cml0ZShicyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShNYXA8U3RyaW5nLCBCRVZhbHVlPiBtLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgb3V0LndyaXRlKCdkJyk7CisKKyAgICAvLyBLZXlzIG11c3QgYmUgc29ydGVkLgorICAgIFNldDxTdHJpbmc+IHMgPSBtLmtleVNldCgpOworICAgIExpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHMpOworICAgIENvbGxlY3Rpb25zLnNvcnQobCk7CisKKyAgICBmb3IgKFN0cmluZyBrZXkgOiBsKSB7CisgICAgICBPYmplY3QgdmFsdWUgPSBtLmdldChrZXkpOworICAgICAgYmVuY29kZShrZXksIG91dCk7CisgICAgICBiZW5jb2RlKHZhbHVlLCBvdXQpOworICAgIH0KKworICAgIG91dC53cml0ZSgnZScpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGJlbmNvZGUoTWFwPFN0cmluZywgQkVWYWx1ZT4gbSkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIEJFbmNvZGVyLmJlbmNvZGUobSwgYmFvcyk7CisgICAgYmFvcy5jbG9zZSgpOworICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0ludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBkMWRkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBCLWVuY29kZWQgc3RyZWFtIGNhbm5vdCBiZSBkZWNvZGVkLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOworCisgIHB1YmxpYyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL3Rlc3QvamF2YS9CRGVjb2RlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL3Rlc3QvamF2YS9CRGVjb2RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDhlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvdGVzdC9qYXZhL0JEZWNvZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkRlY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBCRGVjb2RlclRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVOdW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIHRlc3ROdW1iZXIoMCk7CisgICAgdGVzdE51bWJlcigxKTsKKyAgICB0ZXN0TnVtYmVyKEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB0ZXN0TnVtYmVyKDEyMzQ1NjcpOworICAgIHRlc3ROdW1iZXIoLTEpOworICAgIHRlc3ROdW1iZXIoLTEwMCk7CisgICAgdGVzdE51bWJlcihJbnRlZ2VyLk1JTl9WQUxVRSk7CisgICAgdGVzdE51bWJlcihMb25nLk1BWF9WQUxVRSk7CisgICAgdGVzdE51bWJlcihMb25nLk1JTl9WQUxVRSk7CisKKyAgICAvL2J5IHNwZWNpZmljYXRpb24gbnVtYmVyIHdpdGggbGVhZCB6ZXJvIGl0J3MgaW5jb3JyZWN0IHZhbHVlCisgICAgdGVzdEJhZE51bWJlcigiMDAiKTsKKyAgICB0ZXN0QmFkTnVtYmVyKCIwMTIzNCIpOworICAgIHRlc3RCYWROdW1iZXIoIjAwMCIpOworICAgIHRlc3RCYWROdW1iZXIoIjAwMDEiKTsKKworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RCYWROdW1iZXIoU3RyaW5nIG51bWJlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgQkRlY29kZXIuYmRlY29kZShudW1iZXJUb0JFUEJ5dGVzKG51bWJlcikpOworICAgIH0gY2F0Y2ggKEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYWlsKCJWYWx1ZSAiICsgbnVtYmVyICsgIiBpcyBpbmNvcnJlY3QgYnkgQkVQIHNwZWNpZmljYXRpb24gYnV0IGlzIHdhcyBwYXJzZWQgY29ycmVjdGx5Iik7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdE51bWJlcihsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhCRGVjb2Rlci5iZGVjb2RlKG51bWJlclRvQkVQQnl0ZXModmFsdWUpKS5nZXRMb25nKCksIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciBudW1iZXJUb0JFUEJ5dGVzKGxvbmcgdmFsdWUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKCgiaSIgKyB2YWx1ZSArICJlIikuZ2V0Qnl0ZXMoIkFTQ0lJIikpOworICB9CisKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIG51bWJlclRvQkVQQnl0ZXMoU3RyaW5nIHZhbHVlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcCgoImkiICsgdmFsdWUgKyAiZSIpLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JlbnQtdG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcmVudC10b3JyZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTNjNGUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JlbnQtdG9ycmVudApAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0VYRUZJTEU9IiR7MCUtdG9ycmVudH0iCitNQUlOQ0xBU1M9ImNvbS50dXJuLnR0b3JyZW50LmNsaS5Ub3JyZW50TWFpbiIgIiR7RVhFRklMRX0iICIkQCIKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQgYi90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JyZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjFkZWEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JyZW50CkBAIC0wLDAgKzEsNzMgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworRVhFQ0pBUj0idHRvcnJlbnQtKi1zaGFkZWQuamFyIgorCityZWFsX3BhdGgoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICAvKikKKyAgICAgICAgICAgIFNDUklQVD0iJDEiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgUFdEPWBwd2RgCisgICAgICAgICAgICBTQ1JJUFQ9IiRQV0QvJDEiCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBDSEFOR0VEPXRydWUKKyAgICB3aGlsZSBbICJYJENIQU5HRUQiICE9ICJYIiBdIDsgZG8KKyAgICAgICAgIyBDaGFuZ2Ugc3BhY2VzIHRvICI6IiBzbyB0aGUgdG9rZW5zIGNhbiBiZSBwYXJzZWQuCisgICAgICAgIFNBRkVTQ1JJUFQ9YGVjaG8gJFNDUklQVCB8IHNlZCAtZSAnczsgOzo7ZydgCisgICAgICAgICMgR2V0IHRoZSByZWFsIHBhdGggdG8gdGhpcyBzY3JpcHQsIHJlc29sdmluZyBhbnkgc3ltYm9saWMgbGlua3MKKyAgICAgICAgVE9LRU5TPWBlY2hvICRTQUZFU0NSSVBUIHwgc2VkIC1lICdzOy87IDtnJ2AKKyAgICAgICAgUkVBTFBBVEg9CisgICAgICAgIGZvciBDIGluICRUT0tFTlM7IGRvCisgICAgICAgICAgICAjIENoYW5nZSBhbnkgIjoiIGluIHRoZSB0b2tlbiBiYWNrIHRvIGEgc3BhY2UuCisgICAgICAgICAgICBDPWBlY2hvICRDIHwgc2VkIC1lICdzOzo7IDtnJ2AKKyAgICAgICAgICAgIFJFQUxQQVRIPSIkUkVBTFBBVEgvJEMiCisgICAgICAgICAgICAjIElmIFJFQUxQQVRIIGlzIGEgc3ltIGxpbmssIHJlc29sdmUgaXQuICBMb29wIGZvciBuZXN0ZWQgbGlua3MuCisgICAgICAgICAgICB3aGlsZSBbIC1oICIkUkVBTFBBVEgiIF0gOyBkbworICAgICAgICAgICAgICAgIExTPSJgbHMgLWxkICIkUkVBTFBBVEgiYCIKKyAgICAgICAgICAgICAgICBMSU5LPSJgZXhwciAiJExTIiA6ICcuKi0+IFwoLipcKSQnYCIKKyAgICAgICAgICAgICAgICBpZiBleHByICIkTElOSyIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAjIExJTksgaXMgYWJzb2x1dGUuCisgICAgICAgICAgICAgICAgICAgIFJFQUxQQVRIPSIkTElOSyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICMgTElOSyBpcyByZWxhdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgUkVBTFBBVEg9ImBkaXJuYW1lICIkUkVBTFBBVEgiYCIiLyRMSU5LIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgIGRvbmUKKyAgICAgICAgaWYgWyAiJFJFQUxQQVRIIiA9ICIkU0NSSVBUIiBdIDsgdGhlbgorICAgICAgICAgICAgQ0hBTkdFRD0iIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBTQ1JJUFQ9IiRSRUFMUEFUSCIKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgZWNobyAiJFJFQUxQQVRIIgorfQorCitiYXNlPSQoZGlybmFtZSAkKHJlYWxfcGF0aCAkMCkpCitDUEFSRz0kKGZpbmQgJHtiYXNlfS8uLi9idWlsZCAtbmFtZSAiJEVYRUNKQVIiIHwgdGFpbCAtbiAxKQoraWYgWyAteiAiJENQQVJHIiBdIDsgdGhlbgorICAgIGVjaG8gIlVuYWJsZSB0byBmaW5kICRFWEVDSkFSIgorICAgIGV4aXQgMQorZmkKK2lmIFsgLXogIiRNQUlOQ0xBU1MiIF0gOyB0aGVuCisgICAgQ1BBUkc9Ii1qYXIgJENQQVJHIgorZWxzZQorICAgIENQQVJHPSItY3AgJENQQVJHICRNQUlOQ0xBU1MiCitmaQorZXhlYyBqYXZhICRDUEFSRyAiJEAiCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JyZW50LXRyYWNrZXIgYi90dG9ycmVudC1tYXN0ZXIvYmluL3R0b3JyZW50LXRyYWNrZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiYWNkNQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQtdHJhY2tlcgpAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0VYRUZJTEU9IiR7MCUtdHJhY2tlcn0iCitNQUlOQ0xBU1M9ImNvbS50dXJuLnR0b3JyZW50LmNsaS5UcmFja2VyTWFpbiIgIiR7RVhFRklMRX0iICIkQCIKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jbGkvcG9tLnhtbCBiL3R0b3JyZW50LW1hc3Rlci9jbGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBiNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9wb20ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworCTxwYXJlbnQ+CisJCTxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJPC9wYXJlbnQ+CisKKwk8bmFtZT5KYXZhIEJpdFRvcnJlbnQgbGlicmFyeSBDTEk8L25hbWU+CisJPGFydGlmYWN0SWQ+dHRvcnJlbnQtY2xpPC9hcnRpZmFjdElkPgorCTxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKwk8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCTwvZGVwZW5kZW5jaWVzPgorCisJPGJ1aWxkPgorCQk8ZGVmYXVsdEdvYWw+cGFja2FnZTwvZGVmYXVsdEdvYWw+CisKKwkJPHBsdWdpbnM+CisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKwkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJPGFyY2hpdmU+CisJCQkJCQk8bWFuaWZlc3Q+CisJCQkJCQkJPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKwkJCQkJCTwvbWFuaWZlc3Q+CisJCQkJCTwvYXJjaGl2ZT4KKwkJCQkJPGluY2x1ZGVzPgorCQkJCQkJPGluY2x1ZGU+Kio8L2luY2x1ZGU+CisJCQkJCTwvaW5jbHVkZXM+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9wbHVnaW4+CisKKwkJCTxwbHVnaW4+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tc2hhZGUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5zaGFkZTwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCQk8b3V0cHV0RmlsZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LXNoYWRlZC5qYXI8L291dHB1dEZpbGU+CisJCQkJCQkJPHRyYW5zZm9ybWVycz4KKwkJCQkJCQkJPHRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuc2hhZGUucmVzb3VyY2UuTWFuaWZlc3RSZXNvdXJjZVRyYW5zZm9ybWVyIj4KKwkJCQkJCQkJCTxtYW5pZmVzdEVudHJpZXM+CisJCQkJCQkJCQkJPE1haW4tQ2xhc3M+Y29tLnR1cm4udHRvcnJlbnQuY2xpLkNsaWVudE1haW48L01haW4tQ2xhc3M+CisJCQkJCQkJCQk8L21hbmlmZXN0RW50cmllcz4KKwkJCQkJCQkJPC90cmFuc2Zvcm1lcj4KKwkJCQkJCQk8L3RyYW5zZm9ybWVycz4KKwkJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisJCTwvcGx1Z2lucz4KKwk8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9DbGllbnRNYWluLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY2xpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpL0NsaWVudE1haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2E2OGQxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9DbGllbnRNYWluLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbW11bmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5TaW1wbGVDbGllbnQ7CitpbXBvcnQgamFyZ3MuZ251LkNtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogQ29tbWFuZC1saW5lIGVudHJ5LXBvaW50IGZvciBzdGFydGluZyBhIHtAbGluayBDb21tdW5pY2F0aW9uTWFuYWdlcn0KKyAqLworcHVibGljIGNsYXNzIENsaWVudE1haW4geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENsaWVudE1haW4uY2xhc3MpOworCisgIC8qKgorICAgKiBEZWZhdWx0IGRhdGEgb3V0cHV0IGRpcmVjdG9yeS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09VVFBVVF9ESVJFQ1RPUlkgPSAiL3RtcCI7CisKKyAgLyoqCisgICAqIFJldHVybnMgYSB1c2FibGUge0BsaW5rIEluZXQ0QWRkcmVzc30gZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UgbmFtZS4KKyAgICoKKyAgICogPHA+CisgICAqIElmIGFuIGludGVyZmFjZSBuYW1lIGlzIGdpdmVuLCByZXR1cm4gdGhlIGZpcnN0IHVzYWJsZSBJUHY0IGFkZHJlc3MgZm9yCisgICAqIHRoYXQgaW50ZXJmYWNlLiBJZiBubyBpbnRlcmZhY2UgbmFtZSBpcyBnaXZlbiBvciBpZiB0aGF0IGludGVyZmFjZQorICAgKiBkb2Vzbid0IGhhdmUgYW4gSVB2NCBhZGRyZXNzLCByZXR1cm4ncyBsb2NhbGhvc3QgYWRkcmVzcyAoaWYgSVB2NCkuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIEl0IGlzIHVuZGVyc3Rvb2QgdGhpcyBtYWtlcyB0aGUgY2xpZW50IElQdjQgb25seSwgYnV0IGl0IGlzIGltcG9ydGFudCB0bworICAgKiByZW1lbWJlciB0aGF0IG1vc3QgQml0VG9ycmVudCBleHRlbnNpb25zIChsaWtlIGNvbXBhY3QgcGVlciBsaXN0cyBmcm9tCisgICAqIHRyYWNrZXJzIGFuZCBVRFAgdHJhY2tlciBzdXBwb3J0KSBhcmUgSVB2NC1vbmx5IGFueXdheS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gaWZhY2UgVGhlIG5ldHdvcmsgaW50ZXJmYWNlIG5hbWUuCisgICAqIEByZXR1cm4gQSB1c2FibGUgSVB2NCBhZGRyZXNzIGFzIGEge0BsaW5rIEluZXQ0QWRkcmVzc30uCisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbiBJZiBubyBJUHY0IGFkZHJlc3Mgd2FzIGF2YWlsYWJsZQorICAgKiB0byBiaW5kIG9uLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgSW5ldDRBZGRyZXNzIGdldElQdjRBZGRyZXNzKFN0cmluZyBpZmFjZSkKKyAgICAgICAgICB0aHJvd3MgU29ja2V0RXhjZXB0aW9uLCBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uLAorICAgICAgICAgIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgRW51bWVyYXRpb248SW5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9CisgICAgICAgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGlmYWNlKS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBhZGRyZXNzZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKGFkZHIgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpIHsKKyAgICAgICAgICByZXR1cm4gKEluZXQ0QWRkcmVzcykgYWRkcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEluZXRBZGRyZXNzIGxvY2FsaG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworICAgIGlmIChsb2NhbGhvc3QgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpIHsKKyAgICAgIHJldHVybiAoSW5ldDRBZGRyZXNzKSBsb2NhbGhvc3Q7CisgICAgfQorCisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24oKTsKKyAgfQorCisgIC8qKgorICAgKiBEaXNwbGF5IHByb2dyYW0gdXNhZ2Ugb24gdGhlIGdpdmVuIHtAbGluayBQcmludFN0cmVhbX0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKFByaW50U3RyZWFtIHMpIHsKKyAgICBzLnByaW50bG4oInVzYWdlOiBDbGllbnQgW29wdGlvbnNdIDx0b3JyZW50PiIpOworICAgIHMucHJpbnRsbigpOworICAgIHMucHJpbnRsbigiQXZhaWxhYmxlIG9wdGlvbnM6Iik7CisgICAgcy5wcmludGxuKCIgIC1oLC0taGVscCAgICAgICAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIGFuZCBleGl0LiIpOworICAgIHMucHJpbnRsbigiICAtbywtLW91dHB1dCBESVIgICAgICAgICAgICBSZWFkL3dyaXRlIGRhdGEgdG8gZGlyZWN0b3J5IERJUi4iKTsKKyAgICBzLnByaW50bG4oIiAgLWksLS1pZmFjZSBJRkFDRSAgICAgICAgICAgQmluZCB0byBpbnRlcmZhY2UgSUZBQ0UuIik7CisgICAgcy5wcmludGxuKCIgIC1zLC0tc2VlZCBTRUNPTkRTICAgICAgICAgIFRpbWUgdG8gc2VlZCBhZnRlciBkb3dubG9hZGluZyAoZGVmYXVsdDogaW5maW5pdGVseSkuIik7CisgICAgcy5wcmludGxuKCIgIC1kLC0tbWF4LWRvd25sb2FkIEtCL1NFQyAgIE1heCBkb3dubG9hZCByYXRlIChkZWZhdWx0OiB1bmxpbWl0ZWQpLiIpOworICAgIHMucHJpbnRsbigiICAtdSwtLW1heC11cGxvYWQgS0IvU0VDICAgICBNYXggdXBsb2FkIHJhdGUgKGRlZmF1bHQ6IHVubGltaXRlZCkuIik7CisgICAgcy5wcmludGxuKCk7CisgIH0KKworICAvKioKKyAgICogTWFpbiBjbGllbnQgZW50cnkgcG9pbnQgZm9yIHN0YW5kLWFsb25lIG9wZXJhdGlvbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcigKKyAgICAgICAgICAgIG5ldyBQYXR0ZXJuTGF5b3V0KCIlZCBbJS0yNXRdICUtNXA6ICVtJW4iKSkpOworCisgICAgQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgQ21kTGluZVBhcnNlcigpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIGhlbHAgPSBwYXJzZXIuYWRkQm9vbGVhbk9wdGlvbignaCcsICJoZWxwIik7CisgICAgQ21kTGluZVBhcnNlci5PcHRpb24gb3V0cHV0ID0gcGFyc2VyLmFkZFN0cmluZ09wdGlvbignbycsICJvdXRwdXQiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBpZmFjZSA9IHBhcnNlci5hZGRTdHJpbmdPcHRpb24oJ2knLCAiaWZhY2UiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBzZWVkVGltZSA9IHBhcnNlci5hZGRJbnRlZ2VyT3B0aW9uKCdzJywgInNlZWQiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBtYXhVcGxvYWQgPSBwYXJzZXIuYWRkRG91YmxlT3B0aW9uKCd1JywgIm1heC11cGxvYWQiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBtYXhEb3dubG9hZCA9IHBhcnNlci5hZGREb3VibGVPcHRpb24oJ2QnLCAibWF4LWRvd25sb2FkIik7CisKKyAgICB0cnkgeworICAgICAgcGFyc2VyLnBhcnNlKGFyZ3MpOworICAgIH0gY2F0Y2ggKENtZExpbmVQYXJzZXIuT3B0aW9uRXhjZXB0aW9uIG9lKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ob2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHVzYWdlKFN5c3RlbS5lcnIpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgLy8gRGlzcGxheSBoZWxwIGFuZCBleGl0IGlmIHJlcXVlc3RlZAorICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKChCb29sZWFuKSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoaGVscCkpKSB7CisgICAgICB1c2FnZShTeXN0ZW0ub3V0KTsKKyAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIFN0cmluZyBvdXRwdXRWYWx1ZSA9IChTdHJpbmcpIHBhcnNlci5nZXRPcHRpb25WYWx1ZShvdXRwdXQsCisgICAgICAgICAgICBERUZBVUxUX09VVFBVVF9ESVJFQ1RPUlkpOworICAgIFN0cmluZyBpZmFjZVZhbHVlID0gKFN0cmluZykgcGFyc2VyLmdldE9wdGlvblZhbHVlKGlmYWNlKTsKKyAgICBpbnQgc2VlZFRpbWVWYWx1ZSA9IChJbnRlZ2VyKSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoc2VlZFRpbWUsIC0xKTsKKworICAgIFN0cmluZ1tdIG90aGVyQXJncyA9IHBhcnNlci5nZXRSZW1haW5pbmdBcmdzKCk7CisgICAgaWYgKG90aGVyQXJncy5sZW5ndGggIT0gMSkgeworICAgICAgdXNhZ2UoU3lzdGVtLmVycik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICBTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudCgpOworICAgIHRyeSB7CisgICAgICBJbmV0NEFkZHJlc3MgaVB2NEFkZHJlc3MgPSBnZXRJUHY0QWRkcmVzcyhpZmFjZVZhbHVlKTsKKyAgICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShvdGhlckFyZ3NbMF0pOworICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0VmFsdWUpOworCisgICAgICBjbGllbnQuZG93bmxvYWRUb3JyZW50KAorICAgICAgICAgICAgICB0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgb3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgaVB2NEFkZHJlc3MpOworICAgICAgaWYgKHNlZWRUaW1lVmFsdWUgPiAwKSB7CisgICAgICAgIFRocmVhZC5zbGVlcChzZWVkVGltZVZhbHVlICogMTAwMCk7CisgICAgICB9CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJGYXRhbCBlcnJvcjoge30iLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICBTeXN0ZW0uZXhpdCgyKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgY2xpZW50LnN0b3AoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jbGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGkvVG9ycmVudE1haW4uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jbGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGkvVG9ycmVudE1haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI2MzUzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9Ub3JyZW50TWFpbi5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBUdXJuLCBJbmMuCisgIDxwPgorICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgPHA+CisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICA8cD4KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGk7CisKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50Q3JlYXRvcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50UGFyc2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50U2VyaWFsaXplcjsKK2ltcG9ydCBqYXJncy5nbnUuQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLlRydWVGaWxlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQ29tbWFuZC1saW5lIGVudHJ5LXBvaW50IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHtAbGluayBUb3JyZW50TWV0YWRhdGF9LgorICovCitwdWJsaWMgY2xhc3MgVG9ycmVudE1haW4geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvcnJlbnRNYWluLmNsYXNzKTsKKworICAvKioKKyAgICogRGlzcGxheSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBnaXZlbiB7QGxpbmsgUHJpbnRTdHJlYW19LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1c2FnZShQcmludFN0cmVhbSBzKSB7CisgICAgdXNhZ2UocywgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogRGlzcGxheSBhIG1lc3NhZ2UgYW5kIHByb2dyYW0gdXNhZ2Ugb24gdGhlIGdpdmVuIHtAbGluayBQcmludFN0cmVhbX0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKFByaW50U3RyZWFtIHMsIFN0cmluZyBtc2cpIHsKKyAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgIHMucHJpbnRsbihtc2cpOworICAgICAgcy5wcmludGxuKCk7CisgICAgfQorCisgICAgcy5wcmludGxuKCJ1c2FnZTogVG9ycmVudCBbb3B0aW9uc10gW2ZpbGV8ZGlyZWN0b3J5XSIpOworICAgIHMucHJpbnRsbigpOworICAgIHMucHJpbnRsbigiQXZhaWxhYmxlIG9wdGlvbnM6Iik7CisgICAgcy5wcmludGxuKCIgIC1oLC0taGVscCAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBhbmQgZXhpdC4iKTsKKyAgICBzLnByaW50bG4oIiAgLXQsLS10b3JyZW50IEZJTEUgICAgIFVzZSBGSUxFIHRvIHJlYWQvd3JpdGUgdG9ycmVudCBmaWxlLiIpOworICAgIHMucHJpbnRsbigpOworICAgIHMucHJpbnRsbigiICAtYywtLWNyZWF0ZSAgICAgICAgICAgQ3JlYXRlIGEgbmV3IHRvcnJlbnQgZmlsZSB1c2luZyAiICsKKyAgICAgICAgICAgICJ0aGUgZ2l2ZW4gYW5ub3VuY2UgVVJMIGFuZCBkYXRhLiIpOworICAgIHMucHJpbnRsbigiICAtbCwtLWxlbmd0aCAgICAgICAgICAgRGVmaW5lIHRoZSBwaWVjZSBsZW5ndGggZm9yIGhhc2hpbmcgZGF0YSIpOworICAgIHMucHJpbnRsbigiICAtYSwtLWFubm91bmNlICAgICAgICAgVHJhY2tlciBVUkwgKGNhbiBiZSByZXBlYXRlZCkuIik7CisgICAgcy5wcmludGxuKCk7CisgIH0KKworICAvKioKKyAgICogVG9ycmVudCByZWFkZXIgYW5kIGNyZWF0b3IuCisgICAqCisgICAqIDxwPgorICAgKiBZb3UgY2FuIHVzZSB0aGUge0Bjb2RlIG1haW4oKX0gZnVuY3Rpb24gb2YgdGhpcyBjbGFzcyB0byByZWFkIG9yIGNyZWF0ZQorICAgKiB0b3JyZW50IGZpbGVzLiBTZWUgdXNhZ2UgZm9yIGRldGFpbHMuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcigKKyAgICAgICAgICAgIG5ldyBQYXR0ZXJuTGF5b3V0KCIlLTVwOiAlbSVuIikpKTsKKworICAgIENtZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IENtZExpbmVQYXJzZXIoKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBoZWxwID0gcGFyc2VyLmFkZEJvb2xlYW5PcHRpb24oJ2gnLCAiaGVscCIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIGZpbGVuYW1lID0gcGFyc2VyLmFkZFN0cmluZ09wdGlvbigndCcsICJ0b3JyZW50Iik7CisgICAgQ21kTGluZVBhcnNlci5PcHRpb24gY3JlYXRlID0gcGFyc2VyLmFkZEJvb2xlYW5PcHRpb24oJ2MnLCAiY3JlYXRlIik7CisgICAgQ21kTGluZVBhcnNlci5PcHRpb24gcGllY2VMZW5ndGggPSBwYXJzZXIuYWRkSW50ZWdlck9wdGlvbignbCcsICJsZW5ndGgiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBhbm5vdW5jZSA9IHBhcnNlci5hZGRTdHJpbmdPcHRpb24oJ2EnLCAiYW5ub3VuY2UiKTsKKworICAgIHRyeSB7CisgICAgICBwYXJzZXIucGFyc2UoYXJncyk7CisgICAgfSBjYXRjaCAoQ21kTGluZVBhcnNlci5PcHRpb25FeGNlcHRpb24gb2UpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihvZS5nZXRNZXNzYWdlKCkpOworICAgICAgdXNhZ2UoU3lzdGVtLmVycik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBEaXNwbGF5IGhlbHAgYW5kIGV4aXQgaWYgcmVxdWVzdGVkCisgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMocGFyc2VyLmdldE9wdGlvblZhbHVlKGhlbHApKSkgeworICAgICAgdXNhZ2UoU3lzdGVtLm91dCk7CisgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZmlsZW5hbWVWYWx1ZSA9IChTdHJpbmcpIHBhcnNlci5nZXRPcHRpb25WYWx1ZShmaWxlbmFtZSk7CisgICAgaWYgKGZpbGVuYW1lVmFsdWUgPT0gbnVsbCkgeworICAgICAgdXNhZ2UoU3lzdGVtLmVyciwgIlRvcnJlbnQgZmlsZSBtdXN0IGJlIHByb3ZpZGVkISIpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgSW50ZWdlciBwaWVjZUxlbmd0aFZhbCA9IChJbnRlZ2VyKSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWUocGllY2VMZW5ndGgpOworICAgIGlmIChwaWVjZUxlbmd0aFZhbCA9PSBudWxsKSB7CisgICAgICBwaWVjZUxlbmd0aFZhbCA9IFRvcnJlbnRDcmVhdG9yLkRFRkFVTFRfUElFQ0VfTEVOR1RIOworICAgIH0gZWxzZSB7CisgICAgICBwaWVjZUxlbmd0aFZhbCA9IHBpZWNlTGVuZ3RoVmFsICogMTAyNDsKKyAgICB9CisgICAgbG9nZ2VyLmluZm8oIlVzaW5nIHBpZWNlIGxlbmd0aCBvZiB7fSBieXRlcy4iLCBwaWVjZUxlbmd0aFZhbCk7CisKKyAgICBCb29sZWFuIGNyZWF0ZUZsYWcgPSAoQm9vbGVhbikgcGFyc2VyLmdldE9wdGlvblZhbHVlKGNyZWF0ZSk7CisKKyAgICAvL0ZvciByZXBlYXRlZCBhbm5vdW5jZSB1cmxzCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgVmVjdG9yPFN0cmluZz4gYW5ub3VuY2VVUkxzID0gKFZlY3RvcjxTdHJpbmc+KSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWVzKGFubm91bmNlKTsKKworICAgIFN0cmluZ1tdIG90aGVyQXJncyA9IHBhcnNlci5nZXRSZW1haW5pbmdBcmdzKCk7CisKKyAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjcmVhdGVGbGFnKSAmJgorICAgICAgICAgICAgKG90aGVyQXJncy5sZW5ndGggIT0gMSB8fCBhbm5vdW5jZVVSTHMuaXNFbXB0eSgpKSkgeworICAgICAgdXNhZ2UoU3lzdGVtLmVyciwgIkFubm91bmNlIFVSTCBhbmQgYSBmaWxlIG9yIGRpcmVjdG9yeSBtdXN0IGJlICIgKworICAgICAgICAgICAgICAicHJvdmlkZWQgdG8gY3JlYXRlIGEgdG9ycmVudCBmaWxlISIpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorCisgICAgT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNyZWF0ZUZsYWcpKSB7CisgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lVmFsdWUpOworCisgICAgICAgIC8vUHJvY2VzcyB0aGUgYW5ub3VuY2UgVVJMcyBpbnRvIFVSSXMKKyAgICAgICAgTGlzdDxVUkk+IGFubm91bmNlVVJJcyA9IG5ldyBBcnJheUxpc3Q8VVJJPigpOworICAgICAgICBmb3IgKFN0cmluZyB1cmwgOiBhbm5vdW5jZVVSTHMpIHsKKyAgICAgICAgICBhbm5vdW5jZVVSSXMuYWRkKG5ldyBVUkkodXJsKSk7CisgICAgICAgIH0KKworICAgICAgICAvL0NyZWF0ZSB0aGUgYW5ub3VuY2UtbGlzdCBhcyBhIGxpc3Qgb2YgbGlzdHMgb2YgVVJJcworICAgICAgICAvL0Fzc3VtZSBhbGwgdGhlIFVSSSdzIGFyZSBmaXJzdCB0aWVyIHRyYWNrZXJzCisgICAgICAgIExpc3Q8TGlzdDxVUkk+PiBhbm5vdW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3Q8VVJJPj4oKTsKKyAgICAgICAgYW5ub3VuY2VMaXN0LmFkZChhbm5vdW5jZVVSSXMpOworCisgICAgICAgIEZpbGUgc291cmNlID0gbmV3IEZpbGUob3RoZXJBcmdzWzBdKTsKKyAgICAgICAgaWYgKCFzb3VyY2UuZXhpc3RzKCkgfHwgIXNvdXJjZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3Mgc291cmNlIGZpbGUgb3IgZGlyZWN0b3J5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjcmVhdG9yID0gU3RyaW5nLmZvcm1hdCgiJXMgKHR0b3JyZW50KSIsCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSk7CisKKyAgICAgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQ7CisgICAgICAgIGlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgIExpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KEZpbGVVdGlscy5saXN0RmlsZXMoc291cmNlLCBUcnVlRmlsZUZpbHRlci5UUlVFLCBUcnVlRmlsZUZpbHRlci5UUlVFKSk7CisgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChmaWxlcyk7CisgICAgICAgICAgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShzb3VyY2UsIGZpbGVzLCBhbm5vdW5jZUxpc3QuZ2V0KDApLmdldCgwKSwgYW5ub3VuY2VMaXN0LCBjcmVhdG9yLCBwaWVjZUxlbmd0aFZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShzb3VyY2UsIG51bGwsIGFubm91bmNlTGlzdC5nZXQoMCkuZ2V0KDApLCBhbm5vdW5jZUxpc3QsIGNyZWF0b3IsIHBpZWNlTGVuZ3RoVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcy53cml0ZShuZXcgVG9ycmVudFNlcmlhbGl6ZXIoKS5zZXJpYWxpemUodG9ycmVudCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKG5ldyBGaWxlKGZpbGVuYW1lVmFsdWUpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJ7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIFN5c3RlbS5leGl0KDIpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoZm9zICE9IFN5c3RlbS5vdXQpIHsKKyAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoZm9zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jbGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGkvVHJhY2tlck1haW4uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jbGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGkvVHJhY2tlck1haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTU2ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9UcmFja2VyTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKKworaW1wb3J0IGphcmdzLmdudS5DbWRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQ29tbWFuZC1saW5lIGVudHJ5LXBvaW50IGZvciBzdGFydGluZyBhIHtAbGluayBUcmFja2VyfQorICovCitwdWJsaWMgY2xhc3MgVHJhY2tlck1haW4geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisJCUxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNrZXJNYWluLmNsYXNzKTsKKworCS8qKgorCSAqIERpc3BsYXkgcHJvZ3JhbSB1c2FnZSBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFByaW50U3RyZWFtfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKFByaW50U3RyZWFtIHMpIHsKKwkJcy5wcmludGxuKCJ1c2FnZTogVHJhY2tlciBbb3B0aW9uc10gW2RpcmVjdG9yeV0iKTsKKwkJcy5wcmludGxuKCk7CisJCXMucHJpbnRsbigiQXZhaWxhYmxlIG9wdGlvbnM6Iik7CisJCXMucHJpbnRsbigiICAtaCwtLWhlbHAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgYW5kIGV4aXQuIik7CisJCXMucHJpbnRsbigiICAtcCwtLXBvcnQgUE9SVCAgICAgICAgQmluZCB0byBwb3J0IFBPUlQuIik7CisJCXMucHJpbnRsbigpOworCX0KKworCS8qKgorCSAqIE1haW4gZnVuY3Rpb24gdG8gc3RhcnQgYSB0cmFja2VyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIoCisJCQluZXcgUGF0dGVybkxheW91dCgiJWQgWyUtMjV0XSAlLTVwOiAlbSVuIikpKTsKKworCQlDbWRMaW5lUGFyc2VyIHBhcnNlciA9IG5ldyBDbWRMaW5lUGFyc2VyKCk7CisJCUNtZExpbmVQYXJzZXIuT3B0aW9uIGhlbHAgPSBwYXJzZXIuYWRkQm9vbGVhbk9wdGlvbignaCcsICJoZWxwIik7CisJCUNtZExpbmVQYXJzZXIuT3B0aW9uIHBvcnQgPSBwYXJzZXIuYWRkSW50ZWdlck9wdGlvbigncCcsICJwb3J0Iik7CisKKwkJdHJ5IHsKKwkJCXBhcnNlci5wYXJzZShhcmdzKTsKKwkJfSBjYXRjaCAoQ21kTGluZVBhcnNlci5PcHRpb25FeGNlcHRpb24gb2UpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihvZS5nZXRNZXNzYWdlKCkpOworCQkJdXNhZ2UoU3lzdGVtLmVycik7CisJCQlTeXN0ZW0uZXhpdCgxKTsKKwkJfQorCisJCS8vIERpc3BsYXkgaGVscCBhbmQgZXhpdCBpZiByZXF1ZXN0ZWQKKwkJaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoKEJvb2xlYW4pcGFyc2VyLmdldE9wdGlvblZhbHVlKGhlbHApKSkgeworCQkJdXNhZ2UoU3lzdGVtLm91dCk7CisJCQlTeXN0ZW0uZXhpdCgwKTsKKwkJfQorCisJCUludGVnZXIgcG9ydFZhbHVlID0gKEludGVnZXIpcGFyc2VyLmdldE9wdGlvblZhbHVlKHBvcnQsCisJCQlJbnRlZ2VyLnZhbHVlT2YoVHJhY2tlci5ERUZBVUxUX1RSQUNLRVJfUE9SVCkpOworCisJCVN0cmluZ1tdIG90aGVyQXJncyA9IHBhcnNlci5nZXRSZW1haW5pbmdBcmdzKCk7CisKKwkJaWYgKG90aGVyQXJncy5sZW5ndGggPiAxKSB7CisJCQl1c2FnZShTeXN0ZW0uZXJyKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJLy8gR2V0IGRpcmVjdG9yeSBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudCBvciBkZWZhdWx0IHRvIGN1cnJlbnQKKwkJLy8gZGlyZWN0b3J5CisJCVN0cmluZyBkaXJlY3RvcnkgPSBvdGhlckFyZ3MubGVuZ3RoID4gMAorCQkJPyBvdGhlckFyZ3NbMF0KKwkJCTogIi4iOworCisJCUZpbGVuYW1lRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworCQkJCXJldHVybiBuYW1lLmVuZHNXaXRoKCIudG9ycmVudCIpOworCQkJfQorCQl9OworCisJCXRyeSB7CisJCQlUcmFja2VyIHQgPSBuZXcgVHJhY2tlcihwb3J0VmFsdWUpOworCisJCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGRpcmVjdG9yeSk7CisJCQlmb3IgKEZpbGUgZiA6IHBhcmVudC5saXN0RmlsZXMoZmlsdGVyKSkgeworCQkJCWxvZ2dlci5pbmZvKCJMb2FkaW5nIHRvcnJlbnQgZnJvbSAiICsgZi5nZXROYW1lKCkpOworCQkJCXQuYW5ub3VuY2UoVHJhY2tlZFRvcnJlbnQubG9hZChmKSk7CisJCQl9CisKKwkJCWxvZ2dlci5pbmZvKCJTdGFydGluZyB0cmFja2VyIHdpdGgge30gYW5ub3VuY2VkIHRvcnJlbnRzLi4uIiwKKwkJCQl0LmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSk7CisJCQl0LnN0YXJ0KHRydWUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKCJ7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCVN5c3RlbS5leGl0KDIpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWMzYjgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3BvbS54bWwKQEAgLTAsMCArMSwyNiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPG5hbWU+dHRvcnJlbnQvY29tbW9uPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1iZW5jb2Rpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0NvbnN0YW50cy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWJkYTIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTMgSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogQGF1dGhvciBTZXJnZXkuUGFrCisgKiBEYXRlOiA5LzE5LzEzCisgKiBUaW1lOiAyOjU3IFBNCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FOTk9VTkNFX0lOVEVSVkFMX1NFQyA9IDE1OworCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU09DS0VUX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAxMDAwMDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyA9IDEwMDAwOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0NPTk5FQ1RJT05fQ09VTlQgPSAxMDA7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIEVNUFRZX0JVRkZFUiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TRUxFQ1RPUl9TRUxFQ1RfVElNRU9VVF9NSUxMSVMgPSAxMDAwMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DTEVBTlVQX1JVTl9USU1FT1VUX01JTExJUyA9IDEyMDAwMDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJRUNFX0hBU0hfU0laRSA9IDIwOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0Fubm91bmNlYWJsZUluZm9ybWF0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0Fubm91bmNlYWJsZUluZm9ybWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0YTRkMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGV4dGVuZHMgVG9ycmVudEhhc2ggeworCisgIC8qKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB1cGxvYWRlZCBieSB0aGUgY2xpZW50IGZvciB0aGlzIHRvcnJlbnQKKyAgICovCisgIGxvbmcgZ2V0VXBsb2FkZWQoKTsKKworICAvKioKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgZG93bmxvYWRlZCBieSB0aGUgY2xpZW50IGZvciB0aGlzIHRvcnJlbnQKKyAgICovCisgIGxvbmcgZ2V0RG93bmxvYWRlZCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGRvd25sb2FkIGJ5IHRoZSBjbGllbnQgZm9yIHRoaXMgdG9ycmVudAorICAgKi8KKyAgbG9uZyBnZXRMZWZ0KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gYWxsIHRyYWNrZXIgZm9yIGFubm91bmNlCisgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTIuaHRtbCI+PC9hPgorICAgKi8KKyAgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFubm91bmNlTGlzdCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIG1haW4gYW5ub3VuY2UgdXJsIGZvciB0cmFja2VyCisgICAqLworICBTdHJpbmcgZ2V0QW5ub3VuY2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9JbW11dGFibGVUb3JyZW50SGFzaC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9JbW11dGFibGVUb3JyZW50SGFzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDA5OGMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0ltbXV0YWJsZVRvcnJlbnRIYXNoLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgSW1tdXRhYmxlVG9ycmVudEhhc2ggaW1wbGVtZW50cyBUb3JyZW50SGFzaCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaGFzaDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGV4SGFzaDsKKworICBwdWJsaWMgSW1tdXRhYmxlVG9ycmVudEhhc2goYnl0ZVtdIGhhc2gpIHsKKyAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgIHRoaXMuaGV4SGFzaCA9IFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhoYXNoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiBBcnJheXMuY29weU9mKGhhc2gsIGhhc2gubGVuZ3RoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleEluZm9IYXNoKCkgeworICAgIHJldHVybiBoZXhIYXNoOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0xvZ2dlclV0aWxzLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0xvZ2dlclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyZTNmNAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vTG9nZ2VyVXRpbHMuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2dnZXJVdGlscyB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdhcm5BbmREZWJ1Z0RldGFpbHMoTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7CisgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7CisgICAgbG9nZ2VyLmRlYnVnKCIiLCB0KTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuQW5kRGVidWdEZXRhaWxzKExvZ2dlciBsb2dnZXIsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYXJnLCBUaHJvd2FibGUgdCkgeworICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UsIGFyZyk7CisgICAgbG9nZ2VyLmRlYnVnKCIiLCB0KTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuV2l0aE1lc3NhZ2VBbmREZWJ1Z0RldGFpbHMoTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBhcmcsIFRocm93YWJsZSB0KSB7CisgICAgbG9nZ2VyLndhcm4obWVzc2FnZSArICI6ICIgKyAodC5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IHQuZ2V0TWVzc2FnZSgpIDogdC5nZXRDbGFzcygpLmdldE5hbWUoKSksIGFyZyk7CisgICAgbG9nZ2VyLmRlYnVnKCIiLCB0KTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvckFuZERlYnVnRGV0YWlscyhMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGFyZywgVGhyb3dhYmxlIHQpIHsKKyAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSwgYXJnKTsKKyAgICBsb2dnZXIuZGVidWcoIiIsIHQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yQW5kRGVidWdEZXRhaWxzKExvZ2dlciBsb2dnZXIsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTsKKyAgICBsb2dnZXIuZGVidWcoIiIsIHQpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vT3B0aW9uYWwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vT3B0aW9uYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTliODRiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9PcHRpb25hbC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworcHVibGljIGZpbmFsIGNsYXNzIE9wdGlvbmFsPFQ+IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPcHRpb25hbDw/PiBFTVBUWSA9IG5ldyBPcHRpb25hbCgpOworCisgIEBOdWxsYWJsZQorICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisKKyAgcHVibGljIE9wdGlvbmFsKEBOb3ROdWxsIFQgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIE9wdGlvbmFsKCkgeworICAgIHRoaXMudmFsdWUgPSBudWxsOworICB9CisKKyAgQE5vdE51bGwKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbmFsPFQ+IG9mKEBOdWxsYWJsZSBUIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAoT3B0aW9uYWw8VD4pIEVNUFRZIDogbmV3IE9wdGlvbmFsPFQ+KHZhbHVlKTsKKyAgfQorCisgIEBOb3ROdWxsCisgIHB1YmxpYyBUIGdldCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk5vIHZhbHVlIHByZXNlbnQiKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkgeworICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOworICB9CisKKyAgQE5vdE51bGwKKyAgcHVibGljIFQgb3JFbHNlKEBOb3ROdWxsIFQgZGVmYXVsdFZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BhaXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzI1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BhaXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworcHVibGljIGNsYXNzIFBhaXI8QSwgQj4geworCisgIHByaXZhdGUgZmluYWwgQSBteUZpcnN0OworICBwcml2YXRlIGZpbmFsIEIgbXlTZWNvbmQ7CisKKyAgcHVibGljIFBhaXIoQSBmaXJzdCwgQiBzZWNvbmQpIHsKKyAgICBteUZpcnN0ID0gZmlyc3Q7CisgICAgbXlTZWNvbmQgPSBzZWNvbmQ7CisgIH0KKworICBwdWJsaWMgQSBmaXJzdCgpIHsKKyAgICByZXR1cm4gbXlGaXJzdDsKKyAgfQorCisgIHB1YmxpYyBCIHNlY29uZCgpIHsKKyAgICByZXR1cm4gbXlTZWNvbmQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgUGFpcjw/LCA/PiBwYWlyID0gKFBhaXI8PywgPz4pIG87CisKKyAgICBpZiAoIW15Rmlyc3QuZXF1YWxzKHBhaXIubXlGaXJzdCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbXlTZWNvbmQuZXF1YWxzKHBhaXIubXlTZWNvbmQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgaW50IHJlc3VsdCA9IG15Rmlyc3QuaGFzaENvZGUoKTsKKyAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG15U2Vjb25kLmhhc2hDb2RlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiUGFpcnsiICsKKyAgICAgICAgICAgICJteUZpcnN0PSIgKyBteUZpcnN0ICsKKyAgICAgICAgICAgICIsIG15U2Vjb25kPSIgKyBteVNlY29uZCArCisgICAgICAgICAgICAnfSc7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGVlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QZWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmMDBjMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGVlci5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKworLyoqCisgKiBBIGJhc2ljIEJpdFRvcnJlbnQgcGVlci4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgYSBjb21tb24gYmFzZSBmb3IgdGhlIHRyYWNrZXIgYW5kIGNsaWVudCwgd2hpY2gKKyAqIHdvdWxkIHByZXN1bWFibHkgc3ViY2xhc3MgaXQgdG8gZXh0ZW5kIGl0cyBmdW5jdGlvbmFsaXR5IGFuZCBmaWVsZHMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KKworLy8gUGVlcu+8iOWvueetieiKgueCue+8ieexu++8jOeUqOS6juihqOekuuWPguS4juaWh+S7tuWFseS6q+eahOWNleS4quWuouaIt+err+aIluacjeWKoeWZqOiKgueCuQorLy8g5Z+656GAcGVlcuexu++8jOiiq3RyYWNrZWQgcGVlcue7p+aJvworLy8g5a6e546w5Yqf6IO977yaIOiOt+WPluWQhOS4quexu+Wei+eahHBlZXJpZAorcHVibGljIGNsYXNzIFBlZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGVlci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzOy8v5Zyw5Z2A5ZKM56uv5Y+jCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3RJZDsvLyDmoLzlvI/ljJbkuLogIklQOuerr+WPoyIg55qE5a2X56ym5LiyCisKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHBlZXJJZDsvLyDkuLvplK7vvIzllK/kuIDmoIfor4YKKyAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgaGV4UGVlcklkOworICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBoZXhJbmZvSGFzaDsKKworICAvKioKKyAgICogSW5zdGFudGlhdGUgYSBuZXcgcGVlci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgVGhlIHBlZXIncyBhZGRyZXNzLCB3aXRoIHBvcnQuCisgICAqLworICBwdWJsaWMgUGVlcihJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzKSB7CisgICAgdGhpcyhhZGRyZXNzLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gaXAgICBUaGUgcGVlcidzIElQIGFkZHJlc3MuCisgICAqIEBwYXJhbSBwb3J0IFRoZSBwZWVyJ3MgcG9ydC4KKyAgICovCisgIHB1YmxpYyBQZWVyKFN0cmluZyBpcCwgaW50IHBvcnQpIHsKKyAgICB0aGlzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpcCwgcG9ydCksIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEluc3RhbnRpYXRlIGEgbmV3IHBlZXIuCisgICAqCisgICAqIEBwYXJhbSBpcCAgICAgVGhlIHBlZXIncyBJUCBhZGRyZXNzLgorICAgKiBAcGFyYW0gcG9ydCAgIFRoZSBwZWVyJ3MgcG9ydC4KKyAgICogQHBhcmFtIHBlZXJJZCBUaGUgYnl0ZS1lbmNvZGVkIHBlZXIgSUQuCisgICAqLworICBwdWJsaWMgUGVlcihTdHJpbmcgaXAsIGludCBwb3J0LCBCeXRlQnVmZmVyIHBlZXJJZCkgeworICAgIHRoaXMobmV3IEluZXRTb2NrZXRBZGRyZXNzKGlwLCBwb3J0KSwgcGVlcklkKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgcGVlcidzIGFkZHJlc3MsIHdpdGggcG9ydC4KKyAgICogQHBhcmFtIHBlZXJJZCAgVGhlIGJ5dGUtZW5jb2RlZCBwZWVyIElELgorICAgKi8KKyAgcHVibGljIFBlZXIoSW5ldFNvY2tldEFkZHJlc3MgYWRkcmVzcywgQnl0ZUJ1ZmZlciBwZWVySWQpIHsKKyAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIHRoaXMuaG9zdElkID0gU3RyaW5nLmZvcm1hdCgiJXM6JWQiLAorICAgICAgICAgICAgdGhpcy5hZGRyZXNzLmdldEFkZHJlc3MoKSwKKyAgICAgICAgICAgIHRoaXMuYWRkcmVzcy5nZXRQb3J0KCkpOworCisgICAgdGhpcy5zZXRQZWVySWQocGVlcklkKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGVlciBoYXMgYSBrbm93biBwZWVyIElEIHlldCBvciBub3QuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcklkICE9IG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmF3IHBlZXIgSUQgYXMgYSB7QGxpbmsgQnl0ZUJ1ZmZlcn0uCisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcklkOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXRQZWVySWRBcnJheSgpIHsKKyAgICByZXR1cm4gcGVlcklkID09IG51bGwgPyBudWxsIDogcGVlcklkLmFycmF5KCk7CisgIH0KKworICAvKioKKyAgICogU2V0IGEgcGVlciBJRCBmb3IgdGhpcyBwZWVyICh1c3VhbGx5IGR1cmluZyBoYW5kc2hha2UpLgorICAgKgorICAgKiBAcGFyYW0gcGVlcklkIFRoZSBuZXcgcGVlciBJRCBmb3IgdGhpcyBwZWVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UGVlcklkKEJ5dGVCdWZmZXIgcGVlcklkKSB7CisgICAgaWYgKHBlZXJJZCAhPSBudWxsKSB7CisgICAgICB0aGlzLnBlZXJJZCA9IHBlZXJJZDsKKyAgICAgIHRoaXMuaGV4UGVlcklkID0gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHBlZXJJZC5hcnJheSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5wZWVySWQgPSBudWxsOworICAgICAgdGhpcy5oZXhQZWVySWQgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUGVlcklkKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZyhwZWVySWQuYXJyYXkoKSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJjYW4gbm90IGdldCBwZWVyIGlkIGFzIHN0cmluZyIsIGUpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGhleGFkZWNpbWFsLWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVlcidzIElELgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRIZXhQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaGV4UGVlcklkOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgc2hvcnRlbmVkIGhleGFkZWNpbWFsLWVuY29kZWQgcGVlciBJRC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRIZXhQZWVySWQoKSB7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIi4uJXMiLAorICAgICAgICAgICAgdGhpcy5oZXhQZWVySWQuc3Vic3RyaW5nKHRoaXMuaGV4UGVlcklkLmxlbmd0aCgpIC0gNikudG9VcHBlckNhc2UoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIHBlZXIncyBJUCBhZGRyZXNzLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKKyAgICByZXR1cm4gdGhpcy5hZGRyZXNzLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBwZWVyJ3MgSW5ldEFkZHJlc3MuCisgICAqLworICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICByZXR1cm4gdGhpcy5hZGRyZXNzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBwZWVyJ3MgcG9ydCBudW1iZXIuCisgICAqLworICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgcmV0dXJuIHRoaXMuYWRkcmVzcy5nZXRQb3J0KCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIHBlZXIncyBob3N0IGlkZW50aWZpZXIgKCJob3N0OnBvcnQiKS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdElkZW50aWZpZXIoKSB7CisgICAgcmV0dXJuIHRoaXMuaG9zdElkOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBlZXIncyBJUC4KKyAgICovCisgIHB1YmxpYyBieXRlW10gZ2V0UmF3SXAoKSB7CisgICAgZmluYWwgSW5ldEFkZHJlc3MgYWRkcmVzcyA9IHRoaXMuYWRkcmVzcy5nZXRBZGRyZXNzKCk7CisgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIGFkZHJlc3MuZ2V0QWRkcmVzcygpOworICB9CisKKworICAvKioKKyAgICogVGVsbHMgaWYgdHdvIHBlZXJzIHNlZW0gdG8gbG9vayBhbGlrZSAoaS5lLiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAsIHBvcnQKKyAgICogYW5kIHBlZXIgSUQgaWYgdGhleSBoYXZlIG9uZSkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBsb29rc0xpa2UoUGVlciBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuaG9zdElkLmVxdWFscyhvdGhlci5ob3N0SWQpICYmIHRoaXMuZ2V0UG9ydCgpID09IG90aGVyLmdldFBvcnQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRvcnJlbnRIYXNoKFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIHRoaXMuaGV4SW5mb0hhc2ggPSBoZXhJbmZvSGFzaDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIGhleEluZm9IYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgIFBlZXIgcGVlciA9IChQZWVyKSBvOworCisgICAgaWYgKGhleFBlZXJJZCA9PSBudWxsICYmIHBlZXIuaGV4UGVlcklkID09IG51bGwpIHJldHVybiBzdXBlci5lcXVhbHMobyk7CisKKyAgICBpZiAoaGV4UGVlcklkICE9IG51bGwgPyAhaGV4UGVlcklkLmVxdWFscyhwZWVyLmhleFBlZXJJZCkgOiBwZWVyLmhleFBlZXJJZCAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGhleEluZm9IYXNoICE9IG51bGwgPyBoZXhJbmZvSGFzaC5lcXVhbHMocGVlci5oZXhJbmZvSGFzaCkgOiBwZWVyLmhleEluZm9IYXNoID09IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKworICAgIGlmIChoZXhQZWVySWQgPT0gbnVsbCkgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisKKyAgICBpbnQgcmVzdWx0ID0gaGV4UGVlcklkICE9IG51bGwgPyBoZXhQZWVySWQuaGFzaENvZGUoKSA6IDA7CisgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoaGV4SW5mb0hhc2ggIT0gbnVsbCA/IGhleEluZm9IYXNoLmhhc2hDb2RlKCkgOiAwKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlZXIuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIlBlZXIgIiArIGFkZHJlc3MgKyAiIGZvciB0b3JyZW50ICIgKyBoZXhJbmZvSGFzaDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QZWVyVUlELmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BlZXJVSUQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWMxYjAyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QZWVyVUlELmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKKworLyog5L+d5a2Y55So5oi355qE5Zyw5Z2A55u45YWz5L+h5oGvCisqIOagh+ivhuWUr+S4gOS4gOS4queUqOaIt+WSjOeUqOaIt+ebuOWFs+eahHRvcnJlbnTlnLDlnYAKKyogKi8KK3B1YmxpYyBjbGFzcyBQZWVyVUlEIHsKKworICBwcml2YXRlIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIG15QWRkcmVzczsvLyDkv53lrZhpcOWcsOWdgO+8jOerr+WPo+WPt++8jOS4u+acuuWQjQorICBwcml2YXRlIGZpbmFsIFN0cmluZyBteVRvcnJlbnRIYXNoOy8vIOagh+ivhuWUr+S4gOeahHRvcnJlbnTmlofku7YKKworICBwdWJsaWMgUGVlclVJRChJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzLCBTdHJpbmcgdG9ycmVudEhhc2gpIHsKKyAgICBteUFkZHJlc3MgPSBhZGRyZXNzOworICAgIG15VG9ycmVudEhhc2ggPSB0b3JyZW50SGFzaDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VG9ycmVudEhhc2goKSB7CisgICAgcmV0dXJuIG15VG9ycmVudEhhc2g7CisgIH0KKworICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICByZXR1cm4gbXlBZGRyZXNzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgIFBlZXJVSUQgcGVlclVJRCA9IChQZWVyVUlEKSBvOworCisgICAgaWYgKCFteUFkZHJlc3MuZXF1YWxzKHBlZXJVSUQubXlBZGRyZXNzKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBteVRvcnJlbnRIYXNoLmVxdWFscyhwZWVyVUlELm15VG9ycmVudEhhc2gpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgaW50IHJlc3VsdCA9IG15QWRkcmVzcy5oYXNoQ29kZSgpOworICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbXlUb3JyZW50SGFzaC5oYXNoQ29kZSgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIlBlZXJVSUR7IiArCisgICAgICAgICAgICAiYWRkcmVzcz0iICsgbXlBZGRyZXNzICsKKyAgICAgICAgICAgICIsIHRvcnJlbnQgaGFzaD0nIiArIG15VG9ycmVudEhhc2ggKyAnXCcnICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9TeXN0ZW1UaW1lU2VydmljZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9TeXN0ZW1UaW1lU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTVjZDEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1N5c3RlbVRpbWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK3B1YmxpYyBjbGFzcyBTeXN0ZW1UaW1lU2VydmljZSBpbXBsZW1lbnRzIFRpbWVTZXJ2aWNlIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgbm93KCkgeworICAgIHJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgfQorICAvLyDov5Tlm57oh6ogVW5peCDnuqrlhYPvvIgxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQ++8iSDku6XmnaXnmoTmr6vnp5LmlbDvvIhsb25nIOexu+Wei++8iQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9UaW1lU2VydmljZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9UaW1lU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RpbWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKKy8qKgorICogQWJzdHJhY3QgdGltZSBzZXJ2aWNlLiBQcm92aWRlcyBjdXJyZW50IHRpbWUgbWlsbGlzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRpbWVTZXJ2aWNlIHsKKyAgLyoqCisgICAqIFByb3ZpZGVzIGN1cnJlbnQgdGltZSBtaWxsaXMuCisgICAqCisgICAqIEByZXR1cm4gY3VycmVudCB0aW1lLgorICAgKi8KKyAgbG9uZyBub3coKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50Q3JlYXRvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50Q3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGUxZWYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwzNzYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRW5jb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb24uTWV0YWRhdGFCdWlsZGVyOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YUtleXMuKjsKKworLyoqCisgKiBPbGQgQVBJIGZvciBjcmVhdGluZyAudG9ycmVudCBmaWxlcywgdXNlIHtAbGluayBNZXRhZGF0YUJ1aWxkZXJ9CisgKiBAZGVwcmVjYXRlZAorICovCitARGVwcmVjYXRlZAorcHVibGljIGNsYXNzIFRvcnJlbnRDcmVhdG9yIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvcnJlbnRDcmVhdG9yLmNsYXNzKTsKKworICAvKioKKyAgICogVG9ycmVudCBmaWxlIHBpZWNlIGxlbmd0aCAoaW4gYnl0ZXMpLCB3ZSB1c2UgNTEyIGtCLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSUVDRV9MRU5HVEggPSA1MTIgKiAxMDI0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSElOR19USU1FT1VUX1NFQyA9IDE1OworICBwdWJsaWMgc3RhdGljIGludCBIQVNISU5HX1RIUkVBRFNfQ09VTlQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7CisKKyAgc3RhdGljIHsKKyAgICBTdHJpbmcgdGhyZWFkcyA9IFN5c3RlbS5nZXRlbnYoIlRUT1JSRU5UX0hBU0hJTkdfVEhSRUFEUyIpOworCisgICAgaWYgKHRocmVhZHMgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW50IGNvdW50ID0gSW50ZWdlci5wYXJzZUludCh0aHJlYWRzKTsKKyAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgIFRvcnJlbnRDcmVhdG9yLkhBU0hJTkdfVEhSRUFEU19DT1VOVCA9IGNvdW50OworICAgICAgICB9CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgIC8vIFBhc3MKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgSEFTSElOR19FWEVDVVRPUiA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woSEFTSElOR19USFJFQURTX0NPVU5ULCBuZXcgVGhyZWFkRmFjdG9yeSgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChATm90TnVsbCBmaW5hbCBSdW5uYWJsZSByKSB7CisgICAgICBmaW5hbCBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChyKTsKKyAgICAgIHRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKyAgfSk7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdCBmb3IgYSBmaWxlLgorICAgKgorICAgKiA8cD4KKyAgICogSGFzaCB0aGUgZ2l2ZW4gZmlsZSB0byBjcmVhdGUgdGhlIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdCByZXByZXNlbnRpbmcKKyAgICogdGhlIFRvcnJlbnQgbWV0YSBpbmZvIGFib3V0IHRoaXMgZmlsZSwgbmVlZGVkIGZvciBhbm5vdW5jaW5nIGFuZC9vcgorICAgKiBzaGFyaW5nIHNhaWQgZmlsZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gc291cmNlICAgIFRoZSBmaWxlIHRvIHVzZSBpbiB0aGUgdG9ycmVudC4KKyAgICogQHBhcmFtIGFubm91bmNlICBUaGUgYW5ub3VuY2UgVVJJIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBjcmVhdGVkQnkgVGhlIGNyZWF0b3IncyBuYW1lLCBvciBhbnkgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgIHRvcnJlbnQncyBjcmVhdG9yLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUb3JyZW50TWV0YWRhdGEgY3JlYXRlKEZpbGUgc291cmNlLCBVUkkgYW5ub3VuY2UsIFN0cmluZyBjcmVhdGVkQnkpCisgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShzb3VyY2UsIG51bGwsIGFubm91bmNlLCBjcmVhdGVkQnkpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdCBmb3IgYSBzZXQgb2YgZmlsZXMuCisgICAqCisgICAqIDxwPgorICAgKiBIYXNoIHRoZSBnaXZlbiBmaWxlcyB0byBjcmVhdGUgdGhlIG11bHRpLWZpbGUge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0CisgICAqIHJlcHJlc2VudGluZyB0aGUgVG9ycmVudCBtZXRhLWluZm8gYWJvdXQgdGhlbSwgbmVlZGVkIGZvciBhbm5vdW5jaW5nCisgICAqIGFuZC9vciBzaGFyaW5nIHRoZXNlIGZpbGVzLiBTaW5jZSB3ZSBjcmVhdGVkIHRoZSB0b3JyZW50LCB3ZSdyZQorICAgKiBjb25zaWRlcmluZyB3ZSdsbCBiZSBhIGZ1bGwgaW5pdGlhbCBzZWVkZXIgZm9yIGl0LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb3IgbG9jYXRpb24gb2YgdGhlIHRvcnJlbnQgZmlsZXMsCisgICAqICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIGFzIHRoZSB0b3JyZW50J3MgbmFtZS4KKyAgICogQHBhcmFtIGZpbGVzICAgICBUaGUgZmlsZXMgdG8gYWRkIGludG8gdGhpcyB0b3JyZW50LgorICAgKiBAcGFyYW0gYW5ub3VuY2UgIFRoZSBhbm5vdW5jZSBVUkkgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGNyZWF0ZWRCeSBUaGUgY3JlYXRvcidzIG5hbWUsIG9yIGFueSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlCisgICAqICAgICAgICAgICAgICAgICAgdG9ycmVudCdzIGNyZWF0b3IuCisgICAqLworICBwdWJsaWMgc3RhdGljIFRvcnJlbnRNZXRhZGF0YSBjcmVhdGUoRmlsZSBwYXJlbnQsIExpc3Q8RmlsZT4gZmlsZXMsIFVSSSBhbm5vdW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVhdGVkQnkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiBjcmVhdGUocGFyZW50LCBmaWxlcywgYW5ub3VuY2UsIG51bGwsIGNyZWF0ZWRCeSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IGZvciBhIGZpbGUuCisgICAqCisgICAqIDxwPgorICAgKiBIYXNoIHRoZSBnaXZlbiBmaWxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IHJlcHJlc2VudGluZworICAgKiB0aGUgVG9ycmVudCBtZXRhaW5mbyBhYm91dCB0aGlzIGZpbGUsIG5lZWRlZCBmb3IgYW5ub3VuY2luZyBhbmQvb3IKKyAgICogc2hhcmluZyBzYWlkIGZpbGUuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgZmlsZSB0byB1c2UgaW4gdGhlIHRvcnJlbnQuCisgICAqIEBwYXJhbSBhbm5vdW5jZUxpc3QgVGhlIGFubm91bmNlIFVSSXMgb3JnYW5pemVkIGFzIHRpZXJzIHRoYXQgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudAorICAgKiBAcGFyYW0gY3JlYXRlZEJ5ICAgIFRoZSBjcmVhdG9yJ3MgbmFtZSwgb3IgYW55IHN0cmluZyBpZGVudGlmeWluZyB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICB0b3JyZW50J3MgY3JlYXRvci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZShGaWxlIHNvdXJjZSwgTGlzdDxMaXN0PFVSST4+IGFubm91bmNlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVhdGVkQnkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiBjcmVhdGUoc291cmNlLCBudWxsLCBudWxsLCBhbm5vdW5jZUxpc3QsIGNyZWF0ZWRCeSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IGZvciBhIHNldCBvZiBmaWxlcy4KKyAgICoKKyAgICogPHA+CisgICAqIEhhc2ggdGhlIGdpdmVuIGZpbGVzIHRvIGNyZWF0ZSB0aGUgbXVsdGktZmlsZSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QKKyAgICogcmVwcmVzZW50aW5nIHRoZSBUb3JyZW50IG1ldGEtaW5mbyBhYm91dCB0aGVtLCBuZWVkZWQgZm9yIGFubm91bmNpbmcKKyAgICogYW5kL29yIHNoYXJpbmcgdGhlc2UgZmlsZXMuIFNpbmNlIHdlIGNyZWF0ZWQgdGhlIHRvcnJlbnQsIHdlJ3JlCisgICAqIGNvbnNpZGVyaW5nIHdlJ2xsIGJlIGEgZnVsbCBpbml0aWFsIHNlZWRlciBmb3IgaXQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvciBsb2NhdGlvbiBvZiB0aGUgdG9ycmVudCBmaWxlcywKKyAgICogICAgICAgICAgICAgICAgICAgICBhbHNvIHVzZWQgYXMgdGhlIHRvcnJlbnQncyBuYW1lLgorICAgKiBAcGFyYW0gZmlsZXMgICAgICAgIFRoZSBmaWxlcyB0byBhZGQgaW50byB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBhbm5vdW5jZUxpc3QgVGhlIGFubm91bmNlIFVSSXMgb3JnYW5pemVkIGFzIHRpZXJzIHRoYXQgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudAorICAgKiBAcGFyYW0gY3JlYXRlZEJ5ICAgIFRoZSBjcmVhdG9yJ3MgbmFtZSwgb3IgYW55IHN0cmluZyBpZGVudGlmeWluZyB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICB0b3JyZW50J3MgY3JlYXRvci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZShGaWxlIHNvdXJjZSwgTGlzdDxGaWxlPiBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TGlzdDxVUkk+PiBhbm5vdW5jZUxpc3QsIFN0cmluZyBjcmVhdGVkQnkpCisgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShzb3VyY2UsIGZpbGVzLCBudWxsLCBhbm5vdW5jZUxpc3QsIGNyZWF0ZWRCeSk7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QgZm9yIGEgc2V0IG9mIGZpbGVzLgorICAgKgorICAgKiA8cD4KKyAgICogSGFzaCB0aGUgZ2l2ZW4gZmlsZXMgdG8gY3JlYXRlIHRoZSBtdWx0aS1maWxlIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdAorICAgKiByZXByZXNlbnRpbmcgdGhlIFRvcnJlbnQgbWV0YS1pbmZvIGFib3V0IHRoZW0sIG5lZWRlZCBmb3IgYW5ub3VuY2luZworICAgKiBhbmQvb3Igc2hhcmluZyB0aGVzZSBmaWxlcy4gU2luY2Ugd2UgY3JlYXRlZCB0aGUgdG9ycmVudCwgd2UncmUKKyAgICogY29uc2lkZXJpbmcgd2UnbGwgYmUgYSBmdWxsIGluaXRpYWwgc2VlZGVyIGZvciBpdC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGFyZW50ICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9yIGxvY2F0aW9uIG9mIHRoZSB0b3JyZW50IGZpbGVzLAorICAgKiAgICAgICAgICAgICAgICAgICAgIGFsc28gdXNlZCBhcyB0aGUgdG9ycmVudCdzIG5hbWUuCisgICAqIEBwYXJhbSBmaWxlcyAgICAgICAgVGhlIGZpbGVzIHRvIGFkZCBpbnRvIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGFubm91bmNlICAgICBUaGUgYW5ub3VuY2UgVVJJIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBhbm5vdW5jZUxpc3QgVGhlIGFubm91bmNlIFVSSXMgb3JnYW5pemVkIGFzIHRpZXJzIHRoYXQgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudAorICAgKiBAcGFyYW0gY3JlYXRlZEJ5ICAgIFRoZSBjcmVhdG9yJ3MgbmFtZSwgb3IgYW55IHN0cmluZyBpZGVudGlmeWluZyB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICB0b3JyZW50J3MgY3JlYXRvci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZShGaWxlIHBhcmVudCwgTGlzdDxGaWxlPiBmaWxlcywgVVJJIGFubm91bmNlLCBMaXN0PExpc3Q8VVJJPj4gYW5ub3VuY2VMaXN0LCBTdHJpbmcgY3JlYXRlZEJ5KQorICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiBjcmVhdGUocGFyZW50LCBmaWxlcywgYW5ub3VuY2UsIGFubm91bmNlTGlzdCwgY3JlYXRlZEJ5LCBERUZBVUxUX1BJRUNFX0xFTkdUSCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRvcnJlbnRNZXRhZGF0YSBjcmVhdGUoRmlsZSBwYXJlbnQsIExpc3Q8RmlsZT4gZmlsZXMsIFVSSSBhbm5vdW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TGlzdDxVUkk+PiBhbm5vdW5jZUxpc3QsIFN0cmluZyBjcmVhdGVkQnksIGZpbmFsIGludCBwaWVjZVNpemUpCisgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShwYXJlbnQsIGZpbGVzLCBhbm5vdW5jZSwgYW5ub3VuY2VMaXN0LCBjcmVhdGVkQnksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCwgcGllY2VTaXplKTsKKyAgfQorCisgIC8vZm9yIHRlc3RzCisgIC8qcGFja2FnZSBsb2NhbCovCisgIHN0YXRpYyBUb3JyZW50TWV0YWRhdGEgY3JlYXRlKEZpbGUgcGFyZW50LCBMaXN0PEZpbGU+IGZpbGVzLCBVUkkgYW5ub3VuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TGlzdDxVUkk+PiBhbm5vdW5jZUxpc3QsIFN0cmluZyBjcmVhdGVkQnksIGxvbmcgY3JlYXRpb25UaW1lU2VjcywgZmluYWwgaW50IHBpZWNlU2l6ZSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiB0b3JyZW50ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworCisgICAgaWYgKGFubm91bmNlICE9IG51bGwpIHsKKyAgICAgIHRvcnJlbnQucHV0KEFOTk9VTkNFLCBuZXcgQkVWYWx1ZShhbm5vdW5jZS50b1N0cmluZygpKSk7CisgICAgfQorICAgIGlmIChhbm5vdW5jZUxpc3QgIT0gbnVsbCkgeworICAgICAgTGlzdDxCRVZhbHVlPiB0aWVycyA9IG5ldyBMaW5rZWRMaXN0PEJFVmFsdWU+KCk7CisgICAgICBmb3IgKExpc3Q8VVJJPiB0cmFja2VycyA6IGFubm91bmNlTGlzdCkgeworICAgICAgICBMaXN0PEJFVmFsdWU+IHRpZXJJbmZvID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICAgICAgZm9yIChVUkkgdHJhY2tlclVSSSA6IHRyYWNrZXJzKSB7CisgICAgICAgICAgdGllckluZm8uYWRkKG5ldyBCRVZhbHVlKHRyYWNrZXJVUkkudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgICAgIHRpZXJzLmFkZChuZXcgQkVWYWx1ZSh0aWVySW5mbykpOworICAgICAgfQorICAgICAgdG9ycmVudC5wdXQoQU5OT1VOQ0VfTElTVCwgbmV3IEJFVmFsdWUodGllcnMpKTsKKyAgICB9CisgICAgdG9ycmVudC5wdXQoQ1JFQVRJT05fREFURV9TRUMsIG5ldyBCRVZhbHVlKGNyZWF0aW9uVGltZVNlY3MpKTsKKyAgICB0b3JyZW50LnB1dChDUkVBVEVEX0JZLCBuZXcgQkVWYWx1ZShjcmVhdGVkQnkpKTsKKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm8gPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgaW5mby5wdXQoTkFNRSwgbmV3IEJFVmFsdWUocGFyZW50LmdldE5hbWUoKSkpOworICAgIGluZm8ucHV0KFBJRUNFX0xFTkdUSCwgbmV3IEJFVmFsdWUocGllY2VTaXplKSk7CisKKyAgICBpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgIGluZm8ucHV0KEZJTEVfTEVOR1RILCBuZXcgQkVWYWx1ZShwYXJlbnQubGVuZ3RoKCkpKTsKKyAgICAgIGluZm8ucHV0KFBJRUNFUywgbmV3IEJFVmFsdWUoaGFzaEZpbGUocGFyZW50LCBwaWVjZVNpemUpLAorICAgICAgICAgICAgICBDb25zdGFudHMuQllURV9FTkNPRElORykpOworICAgIH0gZWxzZSB7CisgICAgICBMaXN0PEJFVmFsdWU+IGZpbGVJbmZvID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gZmlsZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICAgICAgZmlsZU1hcC5wdXQoRklMRV9MRU5HVEgsIG5ldyBCRVZhbHVlKGZpbGUubGVuZ3RoKCkpKTsKKworICAgICAgICBMaW5rZWRMaXN0PEJFVmFsdWU+IGZpbGVQYXRoID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICAgICAgd2hpbGUgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChmaWxlLmVxdWFscyhwYXJlbnQpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmaWxlUGF0aC5hZGRGaXJzdChuZXcgQkVWYWx1ZShmaWxlLmdldE5hbWUoKSkpOworICAgICAgICAgIGZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVNYXAucHV0KEZJTEVfUEFUSCwgbmV3IEJFVmFsdWUoZmlsZVBhdGgpKTsKKyAgICAgICAgZmlsZUluZm8uYWRkKG5ldyBCRVZhbHVlKGZpbGVNYXApKTsKKyAgICAgIH0KKyAgICAgIGluZm8ucHV0KEZJTEVTLCBuZXcgQkVWYWx1ZShmaWxlSW5mbykpOworICAgICAgaW5mby5wdXQoUElFQ0VTLCBuZXcgQkVWYWx1ZShoYXNoRmlsZXMoZmlsZXMsIHBpZWNlU2l6ZSksCisgICAgICAgICAgICAgIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfQorICAgIHRvcnJlbnQucHV0KElORk9fVEFCTEUsIG5ldyBCRVZhbHVlKGluZm8pKTsKKworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIEJFbmNvZGVyLmJlbmNvZGUobmV3IEJFVmFsdWUodG9ycmVudCksIGJhb3MpOworICAgIHJldHVybiBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBTSEEtMSBoYXNoZXMgb2YgYSBmaWxlJ3MgcGllY2VzLgorICAgKgorICAgKiA8cD4KKyAgICogSGFzaGVzIHRoZSBnaXZlbiBmaWxlIHBpZWNlIGJ5IHBpZWNlIHVzaW5nIHRoZSBkZWZhdWx0IFRvcnJlbnQgcGllY2UKKyAgICogbGVuZ3RoIChzZWUge0BsaW5rICNERUZBVUxUX1BJRUNFX0xFTkdUSH0pIGFuZCByZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mCisgICAqIHRoZXNlIGhhc2hlcywgYXMgYSBzdHJpbmcuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaXMgdXNlZCBmb3IgY3JlYXRpbmcgVG9ycmVudCBtZXRhLWluZm8gc3RydWN0dXJlcyBmcm9tIGEgZmlsZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBoYXNoLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhhc2hGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgaW50IHBpZWNlU2l6ZSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gaGFzaEZpbGVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZmlsZSksIHBpZWNlU2l6ZSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGFzaEZpbGVzKGZpbmFsIExpc3Q8RmlsZT4gZmlsZXMsIGZpbmFsIGludCBwaWVjZVNpemUpCisgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGZpbGVzLnNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdHMgPSBuZXcgTGlua2VkTGlzdDxGdXR1cmU8U3RyaW5nPj4oKTsKKyAgICBsb25nIGxlbmd0aCA9IDBMOworCisgICAgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHBpZWNlU2l6ZSk7CisKKworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgdGhyZWFkSWR4ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgZmluYWwgU3RyaW5nIGZpcnN0RmlsZU5hbWUgPSBmaWxlcy5nZXQoMCkuZ2V0TmFtZSgpOworCisgICAgU3RyaW5nQnVpbGRlciBoYXNoZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQW5hbHl6aW5nIGxvY2FsIGRhdGEgZm9yIHt9IHdpdGgge30gdGhyZWFkcy4uLiIsCisgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLCBIQVNISU5HX1RIUkVBRFNfQ09VTlQpOworCisgICAgICBsZW5ndGggKz0gZmlsZS5sZW5ndGgoKTsKKworICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gZmlzLmdldENoYW5uZWwoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKGNoYW5uZWwucmVhZChidWZmZXIpID4gMCkgeworICAgICAgICAgIGlmIChidWZmZXIucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBwcmVwYXJlRGF0YUZyb21CdWZmZXIoYnVmZmVyKTsKKworICAgICAgICAgICAgcmVzdWx0cy5hZGQoSEFTSElOR19FWEVDVVRPUi5zdWJtaXQobmV3IENhbGxhYmxlPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldE5hbWUoU3RyaW5nLmZvcm1hdCgiJXMgaGFzaGVyICMlZCIsIGZpcnN0RmlsZU5hbWUsIHRocmVhZElkeC5pbmNyZW1lbnRBbmRHZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbGFibGVDaHVua0hhc2hlcihkYXRhKS5jYWxsKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmVzdWx0cy5zaXplKCkgPj0gSEFTSElOR19USFJFQURTX0NPVU5UKSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIGhhc2hlcnMsIG90aGVyd2lzZSB0aGV5IHdpbGwgc3BlbmQgdG9vIG11Y2ggbWVtb3J5CisgICAgICAgICAgICB3YWl0Rm9ySGFzaGVzVG9DYWxjdWxhdGUocmVzdWx0cywgaGFzaGVzKTsKKyAgICAgICAgICAgIHJlc3VsdHMuY2xlYXIoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSGFzaCB0aGUgbGFzdCBiaXQsIGlmIGFueQorICAgIGlmIChidWZmZXIucG9zaXRpb24oKSA+IDApIHsKKyAgICAgIGJ1ZmZlci5saW1pdChidWZmZXIucG9zaXRpb24oKSk7CisgICAgICBidWZmZXIucG9zaXRpb24oMCk7CisgICAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBwcmVwYXJlRGF0YUZyb21CdWZmZXIoYnVmZmVyKTsKKyAgICAgIHJlc3VsdHMuYWRkKEhBU0hJTkdfRVhFQ1VUT1Iuc3VibWl0KG5ldyBDYWxsYWJsZUNodW5rSGFzaGVyKGRhdGEpKSk7CisgICAgfQorICAgIC8vIGhlcmUgd2UgaGF2ZSBvbmx5IGEgZmV3IGhhc2hlcyB0byB3YWl0IGZvciBjYWxjdWxhdGlvbgorICAgIHdhaXRGb3JIYXNoZXNUb0NhbGN1bGF0ZShyZXN1bHRzLCBoYXNoZXMpOworCisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKKworICAgIGludCBleHBlY3RlZFBpZWNlcyA9IChpbnQpIChNYXRoLmNlaWwoCisgICAgICAgICAgICAoZG91YmxlKSBsZW5ndGggLyBwaWVjZVNpemUpKTsKKyAgICBsb2dnZXIuZGVidWcoIkhhc2hlZCB7fSBmaWxlKHMpICh7fSBieXRlcykgaW4ge30gcGllY2VzICh7fSBleHBlY3RlZCkgaW4ge31tcy4iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICBmaWxlcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUGllY2VzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlLjFmIiwgZWxhcHNlZCAvIDFlNiksCisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiBoYXNoZXMudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgcHJlcGFyZURhdGFGcm9tQnVmZmVyKEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgZmluYWwgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShidWZmZXIucmVtYWluaW5nKCkpOworICAgIGJ1ZmZlci5tYXJrKCk7CisgICAgZGF0YS5wdXQoYnVmZmVyKTsKKyAgICBkYXRhLmNsZWFyKCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JIYXNoZXNUb0NhbGN1bGF0ZShMaXN0PEZ1dHVyZTxTdHJpbmc+PiByZXN1bHRzLCBTdHJpbmdCdWlsZGVyIGhhc2hlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoRnV0dXJlPFN0cmluZz4gY2h1bmsgOiByZXN1bHRzKSB7CisgICAgICAgIGhhc2hlcy5hcHBlbmQoY2h1bmsuZ2V0KEhBU0hJTkdfVElNRU9VVF9TRUMsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3Igd2hpbGUgaGFzaGluZyB0aGUgdG9ycmVudCBkYXRhISIsIGVlKTsKKyAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoInZlcnkgc2xvdyBoYXNoaW5nOiB0b29rIG1vcmUgdGhhbiAlZCBzZWNvbmRzIHRvIGNhbGN1bGF0ZSBzZXZlcmFsIHBpZWNlcy4gQ2FuY2VsbGluZyIsIEhBU0hJTkdfVElNRU9VVF9TRUMpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSB7QGxpbmsgQ2FsbGFibGV9IHRvIGhhc2ggYSBkYXRhIGNodW5rLgorICAgKgorICAgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxhYmxlQ2h1bmtIYXNoZXIgaW1wbGVtZW50cyBDYWxsYWJsZTxTdHJpbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBkYXRhOworCisgICAgQ2FsbGFibGVDaHVua0hhc2hlcihmaW5hbCBCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBjYWxsKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgYnl0ZVtdIHNoYTFIYXNoID0gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKHRoaXMuZGF0YS5hcnJheSgpKTsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKHNoYTFIYXNoLCBDb25zdGFudHMuQllURV9FTkNPRElORyk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRGaWxlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0M2I1NAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEZpbGUuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgZGdpZmZpbgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBUb3JyZW50RmlsZSB7CisKKyAgQE5vdE51bGwKKyAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiByZWxhdGl2ZVBhdGg7CisgIHB1YmxpYyBmaW5hbCBsb25nIHNpemU7CisgIEBOb3ROdWxsCisgIHB1YmxpYyBmaW5hbCBPcHRpb25hbDxTdHJpbmc+IG1kNUhhc2g7CisKKyAgcHVibGljIFRvcnJlbnRGaWxlKEBOb3ROdWxsIExpc3Q8U3RyaW5nPiByZWxhdGl2ZVBhdGgsIGxvbmcgc2l6ZSwgQE51bGxhYmxlIFN0cmluZyBtZDVIYXNoKSB7CisgICAgdGhpcy5yZWxhdGl2ZVBhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocmVsYXRpdmVQYXRoKTsKKyAgICB0aGlzLnNpemUgPSBzaXplOworICAgIHRoaXMubWQ1SGFzaCA9IE9wdGlvbmFsLm9mKG1kNUhhc2gpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhBc1N0cmluZygpIHsKKyAgICBTdHJpbmcgZGVsaW1pdGVyID0gRmlsZS5zZXBhcmF0b3I7CisgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHJlbGF0aXZlUGF0aC5pdGVyYXRvcigpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgIHNiLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOworICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKS5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50SGFzaC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50SGFzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWUzNDUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRIYXNoLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudEhhc2ggeworICAvKioKKyAgICogUmV0dXJuIHRoZSBoYXNoIG9mIHRoZSBCLWVuY29kZWQgbWV0YS1pbmZvIHN0cnVjdHVyZSBvZiBhIHRvcnJlbnQuCisgICAqLworICBieXRlW10gZ2V0SW5mb0hhc2goKTsKKworICAvKioKKyAgICogR2V0IHRvcnJlbnQncyBpbmZvIGhhc2ggKGFzIGFuIGhleGFkZWNpbWFsLWNvZGVkIHN0cmluZykuCisgICAqLworICBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKTsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEluZm8uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM1ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCisvKioKKyAqIEBhdXRob3IgU2VyZ2V5LlBhaworICogRGF0ZTogOC85LzEzCisgKiBUaW1lOiA2OjAwIFBNCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudEluZm8gZXh0ZW5kcyBUb3JyZW50SGFzaCB7CisKKyAgLyoKKyAgKiBOdW1iZXIgb2YgYnl0ZXMgdXBsb2FkZWQgYnkgdGhlIGNsaWVudCBmb3IgdGhpcyB0b3JyZW50CisgICogKi8KKyAgbG9uZyBnZXRVcGxvYWRlZCgpOworCisgIC8qCisgICogTnVtYmVyIG9mIGJ5dGVzIGRvd25sb2FkZWQgYnkgdGhlIGNsaWVudCBmb3IgdGhpcyB0b3JyZW50CisgICogKi8KKyAgbG9uZyBnZXREb3dubG9hZGVkKCk7CisKKyAgLyoKKyAgKiBOdW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBkb3dubG9hZCBieSB0aGUgY2xpZW50IGZvciB0aGlzIHRvcnJlbnQKKyAgKiAqLworICBsb25nIGdldExlZnQoKTsKKworICBpbnQgZ2V0UGllY2VDb3VudCgpOworCisgIGxvbmcgZ2V0UGllY2VTaXplKGludCBwaWVjZUlkeCk7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRMb2dnZXJGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRMb2dnZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1YTU0NQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudExvZ2dlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUb3JyZW50TG9nZ2VyRmFjdG9yeSB7CisKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFN0cmluZyBzdGF0aWNMb2dnZXJzTmFtZSA9IG51bGw7CisKKyAgcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKENsYXNzPD8+IGNsYXp6KSB7CisgICAgU3RyaW5nIG5hbWUgPSBzdGF0aWNMb2dnZXJzTmFtZTsKKyAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICBuYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIobmFtZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljTG9nZ2Vyc05hbWUoQE51bGxhYmxlIFN0cmluZyBzdGF0aWNMb2dnZXJzTmFtZSkgeworICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LnN0YXRpY0xvZ2dlcnNOYW1lID0gc3RhdGljTG9nZ2Vyc05hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDZkMWUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBQcm92aWRlZCBhY2Nlc3MgdG8gYWxsIHN0b3JlZCBpbmZvIGluIC50b3JyZW50IGZpbGUKKyAqCisgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vd2lraS50aGVvcnkub3JnL2luZGV4LnBocC9CaXRUb3JyZW50U3BlY2lmaWNhdGlvbiNNZXRhaW5mb19GaWxlX1N0cnVjdHVyZSI+PC9hPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRNZXRhZGF0YSBleHRlbmRzIFRvcnJlbnRIYXNoIHsKKworICAvKioKKyAgICogQHJldHVybiBhbGwgdHJhY2tlciBmb3IgYW5ub3VuY2UKKyAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sIj48L2E+CisgICAqLworICBATnVsbGFibGUKKyAgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFubm91bmNlTGlzdCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIG1haW4gYW5ub3VuY2UgdXJsIGZvciB0cmFja2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG1haW4gYW5ub3VuY2UgaXMgbm90IHNwZWNpZmllZAorICAgKi8KKyAgQE51bGxhYmxlCisgIFN0cmluZyBnZXRBbm5vdW5jZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGNyZWF0aW9uIGRhdGUgb2YgdGhlIHRvcnJlbnQgaW4gdW5peCBmb3JtYXQKKyAgICovCisgIE9wdGlvbmFsPExvbmc+IGdldENyZWF0aW9uRGF0ZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGZyZWUtZm9ybSB0ZXh0IGNvbW1lbnQgb2YgdGhlIGF1dGhvcgorICAgKi8KKyAgT3B0aW9uYWw8U3RyaW5nPiBnZXRDb21tZW50KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSB1c2VkIHRvIGNyZWF0ZSAudG9ycmVudAorICAgKi8KKyAgT3B0aW9uYWw8U3RyaW5nPiBnZXRDcmVhdGVkQnkoKTsKKworICAvKioKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCBwaWVjZQorICAgKi8KKyAgaW50IGdldFBpZWNlTGVuZ3RoKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY29uY2F0ZW5hdGlvbiBvZiBhbGwgMjAtYnl0ZSBTSEExIGhhc2ggdmFsdWVzLCBvbmUgcGVyIHBpZWNlLgorICAgKiBTbyB0aGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIwCisgICAqLworICBieXRlW10gZ2V0UGllY2VzSGFzaGVzKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIHByaXZhdGUgdG9ycmVudC4gSW4gdGhpcyBjYXNlIGNsaWVudCBtdXN0IGdldCBwZWVycyBvbmx5IGZyb20gdHJhY2tlciBhbmQKKyAgICogbXVzdCBpbml0aWF0ZSBjb25uZWN0aW9ucyB0byBwZWVycyByZXR1cm5lZCBmcm9tIHRoZSB0cmFja2VyLgorICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDI3Lmh0bWwiPjwvYT4KKyAgICovCisgIGJvb2xlYW4gaXNQcml2YXRlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY291bnQgb2YgcGllY2VzIGluIHRvcnJlbnQKKyAgICovCisgIGludCBnZXRQaWVjZXNDb3VudCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIFRoZSBmaWxlbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIGFsbCB0aGUgZmlsZXMKKyAgICovCisgIFN0cmluZyBnZXREaXJlY3RvcnlOYW1lKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbGlzdCBvZiBmaWxlcywgc3RvcmVkIGluIHRoaXMgdG9ycmVudAorICAgKi8KKyAgTGlzdDxUb3JyZW50RmlsZT4gZ2V0RmlsZXMoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50TWV0YWRhdGFJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjgzMWQwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50TWV0YWRhdGFJbXBsLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRvcnJlbnRNZXRhZGF0YUltcGwgaW1wbGVtZW50cyBUb3JyZW50TWV0YWRhdGEgeworCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG15SW5mb0hhc2g7CisgIEBOdWxsYWJsZQorICBwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBteUFubm91bmNlTGlzdDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlNYWluQW5ub3VuY2U7CisgIHByaXZhdGUgZmluYWwgbG9uZyBteUNyZWF0aW9uRGF0ZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlDb21tZW50OworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteUNyZWF0ZWRCeTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlOYW1lOworICBwcml2YXRlIGZpbmFsIExpc3Q8VG9ycmVudEZpbGU+IG15RmlsZXM7CisgIHByaXZhdGUgZmluYWwgaW50IG15UGllY2VDb3VudDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlQaWVjZUxlbmd0aDsKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbXlQaWVjZXNIYXNoZXM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15SGV4U3RyaW5nOworCisgIFRvcnJlbnRNZXRhZGF0YUltcGwoYnl0ZVtdIGluZm9IYXNoLAorICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VMaXN0LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtYWluQW5ub3VuY2UsCisgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZWRCeSwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBMaXN0PFRvcnJlbnRGaWxlPiBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBpZWNlc0hhc2hlcykgeworICAgIG15SW5mb0hhc2ggPSBpbmZvSGFzaDsKKyAgICBteUFubm91bmNlTGlzdCA9IGFubm91bmNlTGlzdDsKKyAgICBteU1haW5Bbm5vdW5jZSA9IG1haW5Bbm5vdW5jZTsKKyAgICBteUNyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKKyAgICBteUNvbW1lbnQgPSBjb21tZW50OworICAgIG15Q3JlYXRlZEJ5ID0gY3JlYXRlZEJ5OworICAgIG15TmFtZSA9IG5hbWU7CisgICAgbXlGaWxlcyA9IGZpbGVzOworICAgIG15UGllY2VDb3VudCA9IHBpZWNlQ291bnQ7CisgICAgbXlQaWVjZUxlbmd0aCA9IHBpZWNlTGVuZ3RoOworICAgIG15UGllY2VzSGFzaGVzID0gcGllY2VzSGFzaGVzOworICAgIG15SGV4U3RyaW5nID0gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG15SW5mb0hhc2gpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKKyAgICByZXR1cm4gbXlOYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFRvcnJlbnRGaWxlPiBnZXRGaWxlcygpIHsKKyAgICByZXR1cm4gbXlGaWxlczsKKyAgfQorCisgIEBOdWxsYWJsZQorICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8TGlzdDxTdHJpbmc+PiBnZXRBbm5vdW5jZUxpc3QoKSB7CisgICAgcmV0dXJuIG15QW5ub3VuY2VMaXN0OworICB9CisKKyAgQE51bGxhYmxlCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEFubm91bmNlKCkgeworICAgIHJldHVybiBteU1haW5Bbm5vdW5jZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3B0aW9uYWw8TG9uZz4gZ2V0Q3JlYXRpb25EYXRlKCkgeworICAgIHJldHVybiBPcHRpb25hbC5vZihteUNyZWF0aW9uRGF0ZSA9PSAtMSA/IG51bGwgOiBteUNyZWF0aW9uRGF0ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0Q29tbWVudCgpIHsKKyAgICByZXR1cm4gT3B0aW9uYWwub2YobXlDb21tZW50KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRDcmVhdGVkQnkoKSB7CisgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG15Q3JlYXRlZEJ5KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBpZWNlTGVuZ3RoKCkgeworICAgIHJldHVybiBteVBpZWNlTGVuZ3RoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0UGllY2VzSGFzaGVzKCkgeworICAgIHJldHVybiBteVBpZWNlc0hhc2hlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGUoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UGllY2VzQ291bnQoKSB7CisgICAgcmV0dXJuIG15UGllY2VDb3VudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiBteUluZm9IYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIG15SGV4U3RyaW5nOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YUtleXMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhS2V5cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGEzM2YKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YUtleXMuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworQFN1cHByZXNzV2FybmluZ3MoIldlYWtlckFjY2VzcyIpCitwdWJsaWMgZmluYWwgY2xhc3MgVG9ycmVudE1ldGFkYXRhS2V5cyB7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUQ1X1NVTSA9ICJtZDVzdW0iOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX0xFTkdUSCA9ICJsZW5ndGgiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFUyA9ICJmaWxlcyI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfUEFUSCA9ICJwYXRoIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9QQVRIX1VURjggPSAicGF0aC51dGYtOCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1FTlQgPSAiY29tbWVudCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENSRUFURURfQlkgPSAiY3JlYXRlZCBieSI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9VTkNFID0gImFubm91bmNlIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUElFQ0VfTEVOR1RIID0gInBpZWNlIGxlbmd0aCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBJRUNFUyA9ICJwaWVjZXMiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDUkVBVElPTl9EQVRFX1NFQyA9ICJjcmVhdGlvbiBkYXRlIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJJVkFURSA9ICJwcml2YXRlIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT19UQUJMRSA9ICJpbmZvIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1VOQ0VfTElTVCA9ICJhbm5vdW5jZS1saXN0IjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX0xJU1QgPSAidXJsLWxpc3QiOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRQYXJzZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWE1MTkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJEZWNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRW5jb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhS2V5cy4qOworCitwdWJsaWMgY2xhc3MgVG9ycmVudFBhcnNlciB7CisKKyAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBwYXJzZUZyb21GaWxlKEZpbGUgdG9ycmVudEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGZpbGVDb250ZW50ID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkodG9ycmVudEZpbGUpOworICAgIHJldHVybiBwYXJzZShmaWxlQ29udGVudCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIG1ldGFkYXRhIGJpbmFyeSAudG9ycmVudCBjb250ZW50CisgICAqIEByZXR1cm4gcGFyc2VkIG1ldGFkYXRhIG9iamVjdC4gVGhpcyBwYXJzZXIgYWxzbyB3cmFwcyBzaW5nbGUgdG9ycmVudCBhcyBtdWx0aSB0b3JyZW50IHdpdGggb25lIGZpbGUKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGlmIG1ldGFkYXRhIGhhcyBpbmNvcnJlY3QgQkVQIGZvcm1hdCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcworICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gICAgICAgICAgSXQncyB3cmFwcGVkIGlvIGV4Y2VwdGlvbiBmcm9tIGJlcCBkZWNvZGVyLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBleGNlcHRpb24gZG9lc24ndCBtdXN0IHRvIHRocm93IGlvIGV4Y2VwdGlvbiBiZWNhdXNlIHJlYWRpbmcgZnJvbQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBhcnJheSBpbnB1dCBzdHJlYW0gY2Fubm90IHRocm93IHRoZSBleGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBUb3JyZW50TWV0YWRhdGEgcGFyc2UoYnl0ZVtdIG1ldGFkYXRhKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiwgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFwPFN0cmluZywgQkVWYWx1ZT4gZGljdGlvbmFyeU1ldGFkYXRhOworICAgIHRyeSB7CisgICAgICBkaWN0aW9uYXJ5TWV0YWRhdGEgPSBCRGVjb2Rlci5iZGVjb2RlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtZXRhZGF0YSkpLmdldE1hcCgpOworICAgIH0gY2F0Y2ggKEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvVGFibGUgPSBnZXRSZXF1aXJlZFZhbHVlT3JUaHJvd0V4Y2VwdGlvbihkaWN0aW9uYXJ5TWV0YWRhdGEsIElORk9fVEFCTEUpLmdldE1hcCgpOworCisgICAgZmluYWwgQkVWYWx1ZSBjcmVhdGlvbkRhdGVWYWx1ZSA9IGRpY3Rpb25hcnlNZXRhZGF0YS5nZXQoQ1JFQVRJT05fREFURV9TRUMpOworICAgIGZpbmFsIGxvbmcgY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlVmFsdWUgPT0gbnVsbCA/IC0xIDogY3JlYXRpb25EYXRlVmFsdWUuZ2V0TG9uZygpOworCisgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQgPSBnZXRTdHJpbmdPck51bGwoZGljdGlvbmFyeU1ldGFkYXRhLCBDT01NRU5UKTsKKyAgICBmaW5hbCBTdHJpbmcgY3JlYXRlZEJ5ID0gZ2V0U3RyaW5nT3JOdWxsKGRpY3Rpb25hcnlNZXRhZGF0YSwgQ1JFQVRFRF9CWSk7CisgICAgZmluYWwgU3RyaW5nIGFubm91bmNlVXJsID0gZ2V0U3RyaW5nT3JOdWxsKGRpY3Rpb25hcnlNZXRhZGF0YSwgQU5OT1VOQ0UpOworICAgIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiB0cmFja2VycyA9IGdldFRyYWNrZXJzKGRpY3Rpb25hcnlNZXRhZGF0YSk7CisgICAgZmluYWwgaW50IHBpZWNlTGVuZ3RoID0gZ2V0UmVxdWlyZWRWYWx1ZU9yVGhyb3dFeGNlcHRpb24oaW5mb1RhYmxlLCBQSUVDRV9MRU5HVEgpLmdldEludCgpOworICAgIGZpbmFsIGJ5dGVbXSBwaWVjZXNIYXNoZXMgPSBnZXRSZXF1aXJlZFZhbHVlT3JUaHJvd0V4Y2VwdGlvbihpbmZvVGFibGUsIFBJRUNFUykuZ2V0Qnl0ZXMoKTsKKworICAgIGZpbmFsIGJvb2xlYW4gdG9ycmVudENvbnRhaW5zTWFueUZpbGVzID0gaW5mb1RhYmxlLmdldChGSUxFUykgIT0gbnVsbDsKKworICAgIGZpbmFsIFN0cmluZyBkaXJOYW1lID0gZ2V0UmVxdWlyZWRWYWx1ZU9yVGhyb3dFeGNlcHRpb24oaW5mb1RhYmxlLCBOQU1FKS5nZXRTdHJpbmcoKTsKKworICAgIGZpbmFsIExpc3Q8VG9ycmVudEZpbGU+IGZpbGVzID0gcGFyc2VGaWxlcyhpbmZvVGFibGUsIHRvcnJlbnRDb250YWluc01hbnlGaWxlcywgZGlyTmFtZSk7CisKKyAgICBpZiAocGllY2VzSGFzaGVzLmxlbmd0aCAlIENvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkUgIT0gMCkKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJJbmNvcnJlY3Qgc2l6ZSBvZiBwaWVjZXMgaGFzaGVzIik7CisKKyAgICBmaW5hbCBpbnQgcGllY2VzQ291bnQgPSBwaWVjZXNIYXNoZXMubGVuZ3RoIC8gQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRTsKKworICAgIGJ5dGVbXSBpbmZvVGFibGVCeXRlczsKKyAgICB0cnkgeworICAgICAgaW5mb1RhYmxlQnl0ZXMgPSBCRW5jb2Rlci5iZW5jb2RlKGluZm9UYWJsZSkuYXJyYXkoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFRvcnJlbnRNZXRhZGF0YUltcGwoCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2goaW5mb1RhYmxlQnl0ZXMpLAorICAgICAgICAgICAgdHJhY2tlcnMsCisgICAgICAgICAgICBhbm5vdW5jZVVybCwKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSwKKyAgICAgICAgICAgIGNvbW1lbnQsCisgICAgICAgICAgICBjcmVhdGVkQnksCisgICAgICAgICAgICBkaXJOYW1lLAorICAgICAgICAgICAgZmlsZXMsCisgICAgICAgICAgICBwaWVjZXNDb3VudCwKKyAgICAgICAgICAgIHBpZWNlTGVuZ3RoLAorICAgICAgICAgICAgcGllY2VzSGFzaGVzCisgICAgKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxUb3JyZW50RmlsZT4gcGFyc2VGaWxlcyhNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvVGFibGUsIGJvb2xlYW4gdG9ycmVudENvbnRhaW5zTWFueUZpbGVzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIGlmICghdG9ycmVudENvbnRhaW5zTWFueUZpbGVzKSB7CisgICAgICBmaW5hbCBCRVZhbHVlIG1kNVN1bSA9IGluZm9UYWJsZS5nZXQoTUQ1X1NVTSk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgVG9ycmVudEZpbGUoCisgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmFtZSksCisgICAgICAgICAgICAgIGdldFJlcXVpcmVkVmFsdWVPclRocm93RXhjZXB0aW9uKGluZm9UYWJsZSwgRklMRV9MRU5HVEgpLmdldExvbmcoKSwKKyAgICAgICAgICAgICAgbWQ1U3VtID09IG51bGwgPyBudWxsIDogbWQ1U3VtLmdldFN0cmluZygpCisgICAgICApKTsKKyAgICB9CisKKyAgICBMaXN0PFRvcnJlbnRGaWxlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFRvcnJlbnRGaWxlPigpOworICAgIGZvciAoQkVWYWx1ZSBmaWxlIDogaW5mb1RhYmxlLmdldChGSUxFUykuZ2V0TGlzdCgpKSB7CisgICAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBmaWxlSW5mbyA9IGZpbGUuZ2V0TWFwKCk7CisgICAgICBMaXN0PFN0cmluZz4gcGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgQkVWYWx1ZSBmaWxlUGF0aExpc3QgPSBmaWxlSW5mby5nZXQoRklMRV9QQVRIX1VURjgpOworICAgICAgaWYgKGZpbGVQYXRoTGlzdCA9PSBudWxsKSB7CisgICAgICAgIGZpbGVQYXRoTGlzdCA9IGZpbGVJbmZvLmdldChGSUxFX1BBVEgpOworICAgICAgfQorICAgICAgZm9yIChCRVZhbHVlIHBhdGhFbGVtZW50IDogZmlsZVBhdGhMaXN0LmdldExpc3QoKSkgeworICAgICAgICBwYXRoLmFkZChwYXRoRWxlbWVudC5nZXRTdHJpbmcoKSk7CisgICAgICB9CisgICAgICBmaW5hbCBCRVZhbHVlIG1kNVN1bSA9IGluZm9UYWJsZS5nZXQoTUQ1X1NVTSk7CisgICAgICByZXN1bHQuYWRkKG5ldyBUb3JyZW50RmlsZSgKKyAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgZmlsZUluZm8uZ2V0KEZJTEVfTEVOR1RIKS5nZXRMb25nKCksCisgICAgICAgICAgICAgIG1kNVN1bSA9PSBudWxsID8gbnVsbCA6IG1kNVN1bS5nZXRTdHJpbmcoKSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ09yTnVsbChNYXA8U3RyaW5nLCBCRVZhbHVlPiBkaWN0aW9uYXJ5TWV0YWRhdGEsIFN0cmluZyBrZXkpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBCRVZhbHVlIHZhbHVlID0gZGljdGlvbmFyeU1ldGFkYXRhLmdldChrZXkpOworICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gdmFsdWUuZ2V0U3RyaW5nKCk7CisgIH0KKworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0VHJhY2tlcnMoTWFwPFN0cmluZywgQkVWYWx1ZT4gZGljdGlvbmFyeU1ldGFkYXRhKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgZmluYWwgQkVWYWx1ZSBhbm5vdW5jZUxpc3RWYWx1ZSA9IGRpY3Rpb25hcnlNZXRhZGF0YS5nZXQoQU5OT1VOQ0VfTElTVCk7CisgICAgaWYgKGFubm91bmNlTGlzdFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOworICAgIExpc3Q8QkVWYWx1ZT4gYW5ub3VuY2VMaXN0ID0gYW5ub3VuY2VMaXN0VmFsdWUuZ2V0TGlzdCgpOworICAgIExpc3Q8TGlzdDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PExpc3Q8U3RyaW5nPj4oKTsKKyAgICBTZXQ8U3RyaW5nPiBhbGxUcmFja2VycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBmb3IgKEJFVmFsdWUgdHYgOiBhbm5vdW5jZUxpc3QpIHsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gdHJhY2tlcnMgPSB0di5nZXRMaXN0KCk7CisgICAgICBpZiAodHJhY2tlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBMaXN0PFN0cmluZz4gdGllciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgZm9yIChCRVZhbHVlIHRyYWNrZXIgOiB0cmFja2VycykgeworICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gdHJhY2tlci5nZXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKCFhbGxUcmFja2Vycy5jb250YWlucyh1cmwpKSB7CisgICAgICAgICAgdGllci5hZGQodXJsKTsKKyAgICAgICAgICBhbGxUcmFja2Vycy5hZGQodXJsKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIXRpZXIuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hZGQodGllcik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBATm90TnVsbAorICBwcml2YXRlIEJFVmFsdWUgZ2V0UmVxdWlyZWRWYWx1ZU9yVGhyb3dFeGNlcHRpb24oTWFwPFN0cmluZywgQkVWYWx1ZT4gbWFwLCBTdHJpbmcga2V5KSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgZmluYWwgQkVWYWx1ZSB2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJJbnZhbGlkIG1ldGFkYXRhIGZvcm1hdC4gTWFwIGRvZXNuJ3QgY29udGFpbiByZXF1aXJlZCBmaWVsZCAiICsga2V5KTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFNlcmlhbGl6ZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWEyODdhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhS2V5cy4qOworCitwdWJsaWMgY2xhc3MgVG9ycmVudFNlcmlhbGl6ZXIgeworCisgIHB1YmxpYyBieXRlW10gc2VyaWFsaXplKFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBtYXBNZXRhZGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisKKyAgICBTdHJpbmcgYW5ub3VuY2UgPSBtZXRhZGF0YS5nZXRBbm5vdW5jZSgpOworICAgIGlmIChhbm5vdW5jZSAhPSBudWxsKSBtYXBNZXRhZGF0YS5wdXQoQU5OT1VOQ0UsIG5ldyBCRVZhbHVlKGFubm91bmNlKSk7CisKKyAgICBwdXRPcHRpb25hbElmUHJlc2VudChtYXBNZXRhZGF0YSwgQ09NTUVOVCwgbWV0YWRhdGEuZ2V0Q29tbWVudCgpKTsKKyAgICBwdXRPcHRpb25hbElmUHJlc2VudChtYXBNZXRhZGF0YSwgQ1JFQVRFRF9CWSwgbWV0YWRhdGEuZ2V0Q3JlYXRlZEJ5KCkpOworCisgICAgaWYgKG1ldGFkYXRhLmdldENyZWF0aW9uRGF0ZSgpLmlzUHJlc2VudCgpKQorICAgICAgbWFwTWV0YWRhdGEucHV0KENSRUFUSU9OX0RBVEVfU0VDLCBuZXcgQkVWYWx1ZShtZXRhZGF0YS5nZXRDcmVhdGlvbkRhdGUoKS5nZXQoKSkpOworCisgICAgTGlzdDxCRVZhbHVlPiBhbm5vdW5jZUxpc3QgPSBnZXRBbm5vdW5jZUxpc3RBc0JFVmFsdWVzKG1ldGFkYXRhLmdldEFubm91bmNlTGlzdCgpKTsKKyAgICBpZiAoYW5ub3VuY2VMaXN0ICE9IG51bGwpIHsKKyAgICAgIG1hcE1ldGFkYXRhLnB1dChBTk5PVU5DRV9MSVNULCBuZXcgQkVWYWx1ZShhbm5vdW5jZUxpc3QpKTsKKyAgICB9CisgICAgaW5mb1RhYmxlLnB1dChQSUVDRV9MRU5HVEgsIG5ldyBCRVZhbHVlKG1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCkpKTsKKyAgICBpbmZvVGFibGUucHV0KFBJRUNFUywgbmV3IEJFVmFsdWUobWV0YWRhdGEuZ2V0UGllY2VzSGFzaGVzKCkpKTsKKyAgICBpZiAobWV0YWRhdGEuaXNQcml2YXRlKCkpIHsKKyAgICAgIGluZm9UYWJsZS5wdXQoUFJJVkFURSwgbmV3IEJFVmFsdWUoMSkpOworICAgIH0KKworICAgIGluZm9UYWJsZS5wdXQoTkFNRSwgbmV3IEJFVmFsdWUobWV0YWRhdGEuZ2V0RGlyZWN0b3J5TmFtZSgpKSk7CisgICAgaWYgKG1ldGFkYXRhLmdldEZpbGVzKCkuc2l6ZSgpID09IDEpIHsKKyAgICAgIGZpbmFsIFRvcnJlbnRGaWxlIHRvcnJlbnRGaWxlID0gbWV0YWRhdGEuZ2V0RmlsZXMoKS5nZXQoMCk7CisgICAgICBpbmZvVGFibGUucHV0KEZJTEVfTEVOR1RILCBuZXcgQkVWYWx1ZSh0b3JyZW50RmlsZS5zaXplKSk7CisgICAgICBwdXRPcHRpb25hbElmUHJlc2VudChpbmZvVGFibGUsIE1ENV9TVU0sIHRvcnJlbnRGaWxlLm1kNUhhc2gpOworICAgIH0gZWxzZSB7CisgICAgICBMaXN0PEJFVmFsdWU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgICAgZm9yIChUb3JyZW50RmlsZSB0b3JyZW50RmlsZSA6IG1ldGFkYXRhLmdldEZpbGVzKCkpIHsKKyAgICAgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gZW50cnkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgICAgIGVudHJ5LnB1dChGSUxFX0xFTkdUSCwgbmV3IEJFVmFsdWUodG9ycmVudEZpbGUuc2l6ZSkpOworICAgICAgICBwdXRPcHRpb25hbElmUHJlc2VudChlbnRyeSwgTUQ1X1NVTSwgdG9ycmVudEZpbGUubWQ1SGFzaCk7CisgICAgICAgIGVudHJ5LnB1dChGSUxFX1BBVEgsIG5ldyBCRVZhbHVlKG1hcFN0cmluZ0xpc3RUb0JFVmFsdWVMaXN0KHRvcnJlbnRGaWxlLnJlbGF0aXZlUGF0aCkpKTsKKyAgICAgICAgZmlsZXMuYWRkKG5ldyBCRVZhbHVlKGVudHJ5KSk7CisgICAgICB9CisgICAgICBpbmZvVGFibGUucHV0KEZJTEVTLCBuZXcgQkVWYWx1ZShmaWxlcykpOworICAgIH0KKworICAgIG1hcE1ldGFkYXRhLnB1dChJTkZPX1RBQkxFLCBuZXcgQkVWYWx1ZShpbmZvVGFibGUpKTsKKworICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyID0gQkVuY29kZXIuYmVuY29kZShtYXBNZXRhZGF0YSk7CisgICAgcmV0dXJuIGJ1ZmZlci5hcnJheSgpOworICB9CisKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgTGlzdDxCRVZhbHVlPiBnZXRBbm5vdW5jZUxpc3RBc0JFVmFsdWVzKEBOdWxsYWJsZSBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VMaXN0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgaWYgKGFubm91bmNlTGlzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICBMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QkVWYWx1ZT4oKTsKKworICAgIGZvciAoTGlzdDxTdHJpbmc+IGFubm91bmNlVGllciA6IGFubm91bmNlTGlzdCkgeworICAgICAgTGlzdDxCRVZhbHVlPiB0aWVyID0gbWFwU3RyaW5nTGlzdFRvQkVWYWx1ZUxpc3QoYW5ub3VuY2VUaWVyKTsKKyAgICAgIGlmICghdGllci5pc0VtcHR5KCkpIHJlc3VsdC5hZGQobmV3IEJFVmFsdWUodGllcikpOworICAgIH0KKworICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8QkVWYWx1ZT4gbWFwU3RyaW5nTGlzdFRvQkVWYWx1ZUxpc3QoTGlzdDxTdHJpbmc+IGxpc3QpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QkVWYWx1ZT4oKTsKKyAgICBmb3IgKFN0cmluZyBzIDogbGlzdCkgeworICAgICAgcmVzdWx0LmFkZChuZXcgQkVWYWx1ZShzKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHV0T3B0aW9uYWxJZlByZXNlbnQoTWFwPFN0cmluZywgQkVWYWx1ZT4gbWFwLCBTdHJpbmcga2V5LCBPcHRpb25hbDxTdHJpbmc+IG9wdGlvbmFsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgaWYgKCFvcHRpb25hbC5pc1ByZXNlbnQoKSkgcmV0dXJuOworICAgIG1hcC5wdXQoa2V5LCBuZXcgQkVWYWx1ZShvcHRpb25hbC5nZXQoKSkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFN0YXRpc3RpYy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U3RhdGlzdGljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2NTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFN0YXRpc3RpYy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKKy8qKgorICogQ2xhc3Mgc3RvcmUgc3RhdGlzdGljIGZvciBkb3dubG9hZGVkLCB1cGxvYWRlZCBhbmQgbGVmdCBieXRlcyBjb3VudC4KKyAqLworcHVibGljIGNsYXNzIFRvcnJlbnRTdGF0aXN0aWMgeworCisgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBteVVwbG9hZGVkQnl0ZXM7CisgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBteURvd25sb2FkZWRCeXRlczsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG15TGVmdEJ5dGVzOworCisgIHB1YmxpYyBUb3JyZW50U3RhdGlzdGljKCkgeworICAgIG15RG93bmxvYWRlZEJ5dGVzID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICBteVVwbG9hZGVkQnl0ZXMgPSBuZXcgQXRvbWljTG9uZygpOworICAgIG15TGVmdEJ5dGVzID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgfQorCisgIHB1YmxpYyBUb3JyZW50U3RhdGlzdGljKFRvcnJlbnRTdGF0aXN0aWMgdG9ycmVudFN0YXRpc3RpYyl7CisgICAgbXlEb3dubG9hZGVkQnl0ZXMgPSBuZXcgQXRvbWljTG9uZyh0b3JyZW50U3RhdGlzdGljLmdldERvd25sb2FkZWRCeXRlcygpKTsKKyAgICBteVVwbG9hZGVkQnl0ZXMgPSBuZXcgQXRvbWljTG9uZyh0b3JyZW50U3RhdGlzdGljLmdldFVwbG9hZGVkQnl0ZXMoKSk7CisgICAgbXlMZWZ0Qnl0ZXMgPSBuZXcgQXRvbWljTG9uZyh0b3JyZW50U3RhdGlzdGljLmdldExlZnRCeXRlcygpKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldFVwbG9hZGVkQnl0ZXMoKSB7CisgICAgcmV0dXJuIG15VXBsb2FkZWRCeXRlcy5nZXQoKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldERvd25sb2FkZWRCeXRlcygpIHsKKyAgICByZXR1cm4gbXlEb3dubG9hZGVkQnl0ZXMuZ2V0KCk7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRMZWZ0Qnl0ZXMoKSB7CisgICAgcmV0dXJuIG15TGVmdEJ5dGVzLmdldCgpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkVXBsb2FkZWQobG9uZyBkZWx0YSkgeworICAgIG15VXBsb2FkZWRCeXRlcy5hZGRBbmRHZXQoZGVsdGEpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkRG93bmxvYWRlZChsb25nIGRlbHRhKSB7CisgICAgbXlEb3dubG9hZGVkQnl0ZXMuYWRkQW5kR2V0KGRlbHRhKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZExlZnQobG9uZyBkZWx0YSkgeworICAgIG15TGVmdEJ5dGVzLmFkZEFuZEdldChkZWx0YSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRMZWZ0KGxvbmcgdmFsdWUpIHsKKyAgICBteUxlZnRCeXRlcy5zZXQodmFsdWUpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXBsb2FkZWQobG9uZyB2YWx1ZSkgeworICAgIG15VXBsb2FkZWRCeXRlcy5zZXQodmFsdWUpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RG93bmxvYWRlZChsb25nIHZhbHVlKSB7CisgICAgbXlEb3dubG9hZGVkQnl0ZXMuc2V0KHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldFBlcmNlbnRhZ2VEb3dubG9hZGVkKCl7CisgICAgbG9uZyBkb3dubG9hZGVkQnl0ZXMgPSBnZXREb3dubG9hZGVkQnl0ZXMoKTsKKyAgICBsb25nIHRvdGFsQnl0ZXMgPSBnZXRUb3RhbEJ5dGVzKCk7CisgICAgcmV0dXJuIChkb3dubG9hZGVkQnl0ZXMgKiAxMDApIC8gdG90YWxCeXRlczsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKXsKKyAgICByZXR1cm4gZ2V0RG93bmxvYWRlZEJ5dGVzKCkgKyBnZXRMZWZ0Qnl0ZXMoKTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VXRpbHMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFV0aWxzLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuZGlnZXN0LkRpZ2VzdFV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRvcnJlbnRVdGlscyB7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2hhcltdIEhFWF9TWU1CT0xTID0gIjAxMjM0NTY3ODlBQkNERUYiLnRvQ2hhckFycmF5KCk7CisKKyAgLyoqCisgICAqIEBwYXJhbSBkYXRhIGZvciBoYXNoaW5nCisgICAqIEByZXR1cm4gc2hhIDEgaGFzaCBvZiBzcGVjaWZpZWQgZGF0YQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBieXRlW10gY2FsY3VsYXRlU2hhMUhhc2goYnl0ZVtdIGRhdGEpIHsKKyAgICByZXR1cm4gRGlnZXN0VXRpbHMuc2hhMShkYXRhKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0IGEgYnl0ZSBzdHJpbmcgdG8gYSBzdHJpbmcgY29udGFpbmluZyBhbiBoZXhhZGVjaW1hbAorICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBieXRlIGFycmF5IHRvIGNvbnZlcnQuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBieXRlQXJyYXlUb0hleFN0cmluZyhieXRlW10gYnl0ZXMpIHsKKyAgICBjaGFyW10gaGV4Q2hhcnMgPSBuZXcgY2hhcltieXRlcy5sZW5ndGggKiAyXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSB7CisgICAgICBpbnQgdiA9IGJ5dGVzW2pdICYgMHhGRjsKKyAgICAgIGhleENoYXJzW2ogKiAyXSA9IEhFWF9TWU1CT0xTW3YgPj4+IDRdOworICAgICAgaGV4Q2hhcnNbaiAqIDIgKyAxXSA9IEhFWF9TWU1CT0xTW3YgJiAweDBGXTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoaGV4Q2hhcnMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2tlckxlc3NJbmZvKEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGluZm9ybWF0aW9uKSB7CisgICAgcmV0dXJuIGluZm9ybWF0aW9uLmdldEFubm91bmNlKCkgPT0gbnVsbCAmJiBpbmZvcm1hdGlvbi5nZXRBbm5vdW5jZUxpc3QoKSA9PSBudWxsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0VG9ycmVudEZpbGVOYW1lcyhUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICBmb3IgKFRvcnJlbnRGaWxlIHRvcnJlbnRGaWxlIDogbWV0YWRhdGEuZ2V0RmlsZXMoKSkgeworICAgICAgcmVzdWx0LmFkZCh0b3JyZW50RmlsZS5nZXRSZWxhdGl2ZVBhdGhBc1N0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vQ29tbW9uSGFzaGluZ0NhbGN1bGF0b3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vQ29tbW9uSGFzaGluZ0NhbGN1bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZjZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9Db21tb25IYXNoaW5nQ2FsY3VsYXRvci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgQ29tbW9uSGFzaGluZ0NhbGN1bGF0b3IgeworCisgIHN0YXRpYyBmaW5hbCBDb21tb25IYXNoaW5nQ2FsY3VsYXRvciBJTlNUQU5DRSA9IG5ldyBDb21tb25IYXNoaW5nQ2FsY3VsYXRvcigpOworCisgIExpc3Q8TG9uZz4gcHJvY2Vzc0RhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZUhvbGRlcj4gc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZWNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc29yIHByb2Nlc3NvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PExvbmc+IHNvdXJjZXNTaXplcyA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKKyAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbcGllY2VTaXplXTsKKyAgICBpbnQgcmVhZCA9IDA7CisgICAgZm9yIChEYXRhU291cmNlSG9sZGVyIHNvdXJjZSA6IHNvdXJjZXMpIHsKKyAgICAgIGxvbmcgc3RyZWFtU2l6ZSA9IDA7CisgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBzb3VyY2UuZ2V0U3RyZWFtKCk7CisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIGludCByZWFkRnJvbVN0cmVhbSA9IHN0cmVhbS5yZWFkKGJ1ZmZlciwgcmVhZCwgYnVmZmVyLmxlbmd0aCAtIHJlYWQpOworICAgICAgICAgIGlmIChyZWFkRnJvbVN0cmVhbSA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBzdHJlYW1TaXplICs9IHJlYWRGcm9tU3RyZWFtOworICAgICAgICAgIHJlYWQgKz0gcmVhZEZyb21TdHJlYW07CisgICAgICAgICAgaWYgKHJlYWQgPT0gYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlYWQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgc291cmNlLmNsb3NlKCk7CisgICAgICAgIHNvdXJjZXNTaXplcy5hZGQoc3RyZWFtU2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChyZWFkID4gMCkgeworICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoQXJyYXlzLmNvcHlPZihidWZmZXIsIHJlYWQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc291cmNlc1NpemVzOworICB9CisKKyAgaW50ZXJmYWNlIFByb2Nlc3NvciB7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gbmV4dCBwaWVjZSBpcyByZWNlaXZlZCBmcm9tIGRhdGEgc291cmNlLiBBcnJheSB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICogYWZ0ZXIgaW52b2NhdGlvbiB0aGlzIG1ldGhvZCAobmV4dCBwaWVjZSB3aWxsIGJlIHJlYWQgaW4gc2FtZSBhcnJheSkuIFNvIG11bHRpLXRocmVhZGluZworICAgICAqIGltcGxlbWVudGF0aW9ucyBtdXN0IGNyZWF0ZSBjb3B5IG9mIGFycmF5IGFuZCB3b3JrIHdpdGggdGhlIGNvcHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIGJ5dGUgYXJyYXkgd2hpY2ggY29udGFpbnMgYnl0ZXMgZnJvbSBkYXRhIHNvdXJjZXMuCisgICAgICogICAgICAgICAgICAgICBsZW5ndGggb2YgYXJyYXkgZXF1YWxzIHBpZWNlIHNpemUgZXhjbHVkaW5nIGxhc3QgcGllY2UKKyAgICAgKi8KKyAgICB2b2lkIHByb2Nlc3MoYnl0ZVtdIGJ1ZmZlcik7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9EYXRhU291cmNlSG9sZGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0RhdGFTb3VyY2VIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIxMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9EYXRhU291cmNlSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK3B1YmxpYyBpbnRlcmZhY2UgRGF0YVNvdXJjZUhvbGRlciBleHRlbmRzIENsb3NlYWJsZSB7CisKKyAgLyoqCisgICAqIHByb3ZpZGVzIHtAbGluayBJbnB1dFN0cmVhbX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkZXIuIEhvbGRlciBjYW4ganVzdCBzdG9yZSByZWZlcmVuY2UgdG8gc3RyZWFtIG9yIGNyZWF0ZQorICAgKiBuZXcgc3RyZWFtIGZyb20gc29tZSBzb3VyY2UgKGUuZy4ge0BsaW5rIGphdmEuaW8uRmlsZUlucHV0U3RyZWFtfSBmcm9tIHtAbGluayBqYXZhLmlvLkZpbGV9KSBvbiBmaXJzdCBpbnZvY2F0aW9uLgorICAgKgorICAgKiBAcmV0dXJuIHtAbGluayBJbnB1dFN0cmVhbX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkZXIuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgaW8gZXJyb3Igb2NjdXJzIGluIGNyZWF0aW5nIG5ldyBzdHJlYW0gZnJvbSBzb3VyY2UuCisgICAqICAgICAgICAgICAgICAgICAgICAgSU8gZXhjZXB0aW9uIGNhbiBiZSB0aHJvd24gb25seSBvbiBmaXJzdCBpbnZvY2F0aW9uCisgICAqLworICBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vSGFzaGluZ1Jlc3VsdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9IYXNoaW5nUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZTNiMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vSGFzaGluZ1Jlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBIYXNoaW5nUmVzdWx0IHsKKworICBwcml2YXRlIGZpbmFsIExpc3Q8Ynl0ZVtdPiBoYXNoZXM7CisgIHByaXZhdGUgZmluYWwgTGlzdDxMb25nPiBzb3VyY2VTaXplczsKKworICBwdWJsaWMgSGFzaGluZ1Jlc3VsdChMaXN0PGJ5dGVbXT4gaGFzaGVzLCBMaXN0PExvbmc+IHNvdXJjZVNpemVzKSB7CisgICAgdGhpcy5oYXNoZXMgPSBoYXNoZXM7CisgICAgdGhpcy5zb3VyY2VTaXplcyA9IHNvdXJjZVNpemVzOworICB9CisKKyAgcHVibGljIExpc3Q8Ynl0ZVtdPiBnZXRIYXNoZXMoKSB7CisgICAgcmV0dXJuIGhhc2hlczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PExvbmc+IGdldFNvdXJjZVNpemVzKCkgeworICAgIHJldHVybiBzb3VyY2VTaXplczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NZXRhZGF0YUJ1aWxkZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vTWV0YWRhdGFCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkMDdkYQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vTWV0YWRhdGFCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRW5jb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFBhcnNlcjsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGFLZXlzLio7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsidW51c2VkIiwgIldlYWtlckFjY2VzcyJ9KQorcHVibGljIGNsYXNzIE1ldGFkYXRhQnVpbGRlciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNZXRhZGF0YUJ1aWxkZXIuY2xhc3MpOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DUkVBVEVEX0JZID0gInR0b3JyZW50IGxpYnJhcnkiOworCisgIC8vcm9vdCBkaWN0aW9uYXJ5CisgIEBOb3ROdWxsCisgIHByaXZhdGUgU3RyaW5nIGFubm91bmNlID0gIiI7CisgIEBOb3ROdWxsCisgIHByaXZhdGUgTGlzdDxMaXN0PFN0cmluZz4+IGFubm91bmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOworICBwcml2YXRlIGxvbmcgY3JlYXRpb25EYXRlID0gLTE7CisgIEBOb3ROdWxsCisgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSAiIjsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlZEJ5ID0gREVGQVVMVF9DUkVBVEVEX0JZOworICBATm90TnVsbAorICBwcml2YXRlIExpc3Q8U3RyaW5nPiB3ZWJTZWVkVXJsTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAvL2VuZCByb290IGRpY3Rpb25hcnkKKworICAvL2luZm8gZGljdGlvbmFyeQorICBwcml2YXRlIGludCBwaWVjZUxlbmd0aCA9IDUxMiAqIDEwMjQ7Ly81MTJrYiBieSBkZWZhdWx0CisgIHByaXZhdGUgYm9vbGVhbiBpc1ByaXZhdGUgPSBmYWxzZTsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsZXNQYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBIYXNoaW5nUmVzdWx0IGhhc2hpbmdSZXN1bHQgPSBudWxsOworICBATm90TnVsbAorICBwcml2YXRlIExpc3Q8RGF0YVNvdXJjZUhvbGRlcj4gZGF0YVNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PERhdGFTb3VyY2VIb2xkZXI+KCk7CisgIEBOb3ROdWxsCisgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeU5hbWUgPSAiIjsKKyAgLy9lbmQgaW5mbyBkaWN0aW9uYXJ5CisKKyAgLy9maWVsZHMgd2hpY2ggc3RvcmUgc29tZSBpbnRlcm5hbCBpbmZvcm1hdGlvbgorICBATm90TnVsbAorICBwcml2YXRlIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgcGllY2VzSGFzaGVzQ2FsY3VsYXRvciA9IG5ldyBTaW5nbGVUaHJlYWRIYXNoZXNDYWxjdWxhdG9yKCk7CisgIC8vZW5kCisKKyAgLyoqCisgICAqIHNldCBtYWluIGFubm91bmNlIHRyYWNrZXIgVVJMIGlmIHlvdSB1c2Ugc2luZ2xlIHRyYWNrZXIuCisgICAqIEluIGNhc2Ugd2l0aCBtYW55IHRyYWNrZXJzIHVzZSB7QGxpbmsgI2FkZFRyYWNrZXIoU3RyaW5nKX0KKyAgICogYW5kIHtAbGluayAjbmV3VGllcigpfS4gVGhlbiBhcyBtYWluIGFubm91bmNlIHdpbGwgYmUgc2VsZWN0ZWQgZmlyc3QgdHJhY2tlci4KKyAgICogWW91IGNhbiBzcGVjaWZ5IG1haW4gYW5ub3VuY2UgdXNpbmcgdGhpcyBtZXRob2QgZm9yIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3VyCisgICAqIFRvcnJlbnQgY2xpZW50cyB3aGljaCBzdXBwb3J0IEJFUDEyIGV4dGVuc2lvbiB3aWxsIGlnbm9yZSBtYWluIGFubm91bmNlLgorICAgKgorICAgKiBAcGFyYW0gYW5ub3VuY2UgYW5ub3VuY2UgVVJMIGZvciB0aGUgdHJhY2tlcgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBzZXRUcmFja2VyKFN0cmluZyBhbm5vdW5jZSkgeworICAgIHRoaXMuYW5ub3VuY2UgPSBhbm5vdW5jZTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisKKyAgLyoqCisgICAqIE11bHRpLXRyYWNrZXIgTWV0YWRhdGEgRXh0ZW5zaW9uLiBBZGQgbmV3IHRyYWNrZXIgVVJMIHRvIGN1cnJlbnQgdGllci4KKyAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgZmlyc3QgdGllciBhdXRvbWF0aWNhbGx5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICogWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleHRlbnNpb24gaW4gZG9jdW1lbnRhdGlvbgorICAgKiA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sIj5odHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sPC9hPgorICAgKgorICAgKiBAcGFyYW0gdXJsIHRyYWNrZXIgdXJsCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIGFkZFRyYWNrZXIoU3RyaW5nIHVybCkgeworICAgIGluaXRGaXJzdFRpZXIoKTsKKyAgICBhbm5vdW5jZUxpc3QuZ2V0KGFubm91bmNlTGlzdC5zaXplKCkgLSAxKS5hZGQodXJsKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBNdWx0aS10cmFja2VyIE1ldGFkYXRhIEV4dGVuc2lvbi4gQWRkIGFsbCB0cmFja2VycyB0byBjdXJyZW50IHRpZXIuCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGZpcnN0IHRpZXIgYXV0b21hdGljYWxseSBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAqIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXh0ZW5zaW9uIGluIGRvY3VtZW50YXRpb24KKyAgICogPGEgaHJlZj0iaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTIuaHRtbCI+aHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTIuaHRtbDwvYT4KKyAgICoKKyAgICogQHBhcmFtIHRyYWNrZXJzIGNvbGxlY3Rpb25zIG9mIHRyYWNrZXJzIFVSTHMKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgYWRkVHJhY2tlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IHRyYWNrZXJzKSB7CisgICAgaW5pdEZpcnN0VGllcigpOworICAgIGFubm91bmNlTGlzdC5nZXQoYW5ub3VuY2VMaXN0LnNpemUoKSAtIDEpLmFkZEFsbCh0cmFja2Vycyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogTXVsdGktdHJhY2tlciBNZXRhZGF0YSBFeHRlbnNpb24uIENyZWF0ZSBuZXcgdGllciBmb3IgYWRkaW5nIHRyYWNrZXIgdXNpbmcge0BsaW5rICNhZGRUcmFja2VyKFN0cmluZyl9IG1ldGhvZAorICAgKiBJZiB5b3UgZG9uJ3QgYWRkIGF0IGxlYXN0IG9uZSB0cmFja2VyIG9uIHRoZSB0aWVyIHRoaXMgdGllciB3aWxsIGJlIHJlbW92ZWQgaW4gYnVpbGRpbmcgbWV0YWRhdGEKKyAgICogWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleHRlbnNpb24gaW4gZG9jdW1lbnRhdGlvbgorICAgKiA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sIj5odHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sPC9hPgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBuZXdUaWVyKCkgeworICAgIGFubm91bmNlTGlzdC5hZGQobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFdlYiBTZWVkaW5nIE1ldGFkYXRhLgorICAgKiBXZWIgc2VlZGluZyB1cmwgYXMgZGVmaW5lZCBieSA8YSBocmVmPSdodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxOS5odG1sJz5iZXAgMDAxOTwvYT4KKyAgICogQHBhcmFtIHVybCBVUkwgdG8gYWRkIGZvciB3ZWIgc2VlZGluZworICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBhZGRXZWJTZWVkVXJsKFN0cmluZyB1cmwpICB7CisgICAgd2ViU2VlZFVybExpc3QuYWRkKHVybCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSB0b3JyZW50IGluIHN0YW5kYXJkIFVOSVggZXBvY2ggZm9ybWF0LgorICAgKgorICAgKiBAcGFyYW0gY3JlYXRpb25UaW1lIHRoZSBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgVVRDLgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBzZXRDcmVhdGlvblRpbWUoaW50IGNyZWF0aW9uVGltZSkgeworICAgIHRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25UaW1lOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFNldCBmcmVlLWZvcm0gdGV4dHVhbCBjb21tZW50IG9mIHRoZSBhdXRob3IKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogU2V0IHByb2dyYW0gbmFtZSB3aGljaCBpcyB1c2VkIGZvciBjcmVhdGluZyB0b3JyZW50IGZpbGUuCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIHNldENyZWF0ZWRCeShTdHJpbmcgY3JlYXRlZEJ5KSB7CisgICAgdGhpcy5jcmVhdGVkQnkgPSBjcmVhdGVkQnk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogU2V0IHtAbGluayBQaWVjZXNIYXNoZXNDYWxjdWxhdG9yfSBpbnN0YW5jZSBmb3IgY2FsY3VsYXRpbmcgaGFzaGVzLiBJbiByYXJlIGNhc2VzIHVzZXIncworICAgKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgaW5jcmVhc2luZyBoYXNoaW5nIHBlcmZvcm1hbmNlCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIHNldFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IoQE5vdE51bGwgUGllY2VzSGFzaGVzQ2FsY3VsYXRvciBwaWVjZXNIYXNoZXNDYWxjdWxhdG9yKSB7CisgICAgdGhpcy5waWVjZXNIYXNoZXNDYWxjdWxhdG9yID0gcGllY2VzSGFzaGVzQ2FsY3VsYXRvcjsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgbGVuZ3RoIGludCBieXRlcyBvZiBvbmUgcGllY2UuIEJ5IGRlZmF1bHQgaXMgdXNlZCA1MTJLQi4KKyAgICogTGFyZ2VyIHBpZWNlIHNpemUgcmVkdWNlcyBzaXplIG9mIC50b3JyZW50IGZpbGUgYnV0IGNhdXNlIGluZWZmaWNpZW5jeQorICAgKiAodG9ycmVudC1jbGllbnQgbmVlZCB0byBkb3dubG9hZCBmdWxsIHBpZWNlIGZyb20gcGVlciBmb3IgdmFsaWRhdGluZykKKyAgICogYW5kIHRvby1zbWFsbCBwaWVjZSBzaXplcyBjYXVzZSBsYXJnZSAudG9ycmVudCBtZXRhZGF0YSBmaWxlLgorICAgKiBSZWNvbW1lbmRlZCBzaXplIGlzIGJldHdlZW4gMjU2S0IgYW5kIDFNQi4KKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0UGllY2VMZW5ndGgoaW50IHBpZWNlTGVuZ3RoKSB7CisgICAgdGhpcy5waWVjZUxlbmd0aCA9IHBpZWNlTGVuZ3RoOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIGFsbCB0aGUgZmlsZXMuCisgICAqIElmIHtAbGluayAjZGlyZWN0b3J5TmFtZX0gaXNuJ3QgZW1wdHkgdGhlbiBtdWx0aS1maWxlIHRvcnJlbnQgd2lsbCBiZSBjcmVhdGVkLCBvdGhlcndpc2Ugc2luZ2xlLWZpbGUKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0RGlyZWN0b3J5TmFtZShATm90TnVsbCBTdHJpbmcgZGlyZWN0b3J5TmFtZSkgeworICAgIHRoaXMuZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeU5hbWU7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogYWRkIGN1c3RvbSBzb3VyY2UgaW4gdG9ycmVudCB3aXRoIGN1c3RvbSBwYXRoLiBQYXRoIGNhbiBiZSBzZXBhcmF0ZWQgd2l0aCBhbnkgc2xhc2guCisgICAqCisgICAqIEBwYXJhbSBjbG9zZUFmdGVyQnVpbGQgaWYgdHJ1ZSB0aGVuIHNvdXJjZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYWZ0ZXIge0BsaW5rICNidWlsZCgpfSBpbnZvY2F0aW9uCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIGFkZERhdGFTb3VyY2UoQE5vdE51bGwgSW5wdXRTdHJlYW0gZGF0YVNvdXJjZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gY2xvc2VBZnRlckJ1aWxkKSB7CisgICAgY2hlY2tIYXNoaW5nUmVzdWx0SXNOb3RTZXQoKTsKKyAgICBmaWxlc1BhdGhzLmFkZChwYXRoKTsKKyAgICBkYXRhU291cmNlcy5hZGQobmV3IFN0cmVhbUJhc2VkSG9sZGVySW1wbChkYXRhU291cmNlLCBjbG9zZUFmdGVyQnVpbGQpKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBhZGQgY3VzdG9tIHNvdXJjZSBpbiB0b3JyZW50IHdpdGggY3VzdG9tIHBhdGguIFBhdGggY2FuIGJlIHNlcGFyYXRlZCB3aXRoIGFueSBzbGFzaC4KKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgYWRkRGF0YVNvdXJjZShATm90TnVsbCBJbnB1dFN0cmVhbSBkYXRhU291cmNlLCBTdHJpbmcgcGF0aCkgeworICAgIGFkZERhdGFTb3VyY2UoZGF0YVNvdXJjZSwgcGF0aCwgdHJ1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogYWRkIHNwZWNpZmllZCBmaWxlIGluIHRvcnJlbnQgd2l0aCBjdXN0b20gcGF0aC4gVGhlIGZpbGUgd2lsbCBiZSBzdG9yZWQgaW4gLnRvcnJlbnQKKyAgICogYnkgc3BlY2lmaWVkIHBhdGguIFBhdGggY2FuIGJlIHNlcGFyYXRlZCB3aXRoIGFueSBzbGFzaC4gSW4gY2FzZSBvZiBzaW5nbGUtZmlsZSB0b3JyZW50CisgICAqIHRoaXMgcGF0aCB3aWxsIGJlIHVzZWQgYXMgbmFtZSBvZiBzb3VyY2UgZmlsZQorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBhZGRGaWxlKEBOb3ROdWxsIEZpbGUgc291cmNlLCBATm90TnVsbCBTdHJpbmcgcGF0aCkgeworICAgIGlmICghc291cmNlLmlzRmlsZSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNvdXJjZSArICIgaXMgbm90IGV4aXN0Iik7CisgICAgfQorICAgIGNoZWNrSGFzaGluZ1Jlc3VsdElzTm90U2V0KCk7CisgICAgZmlsZXNQYXRocy5hZGQocGF0aCk7CisgICAgZGF0YVNvdXJjZXMuYWRkKG5ldyBGaWxlU291cmNlSG9sZGVyKHNvdXJjZSkpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrSGFzaGluZ1Jlc3VsdElzTm90U2V0KCkgeworICAgIGlmIChoYXNoaW5nUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBhZGQgbmV3IHNvdXJjZSB3aGVuIGhhc2hlcyBhcmUgc2V0IG1hbnVhbGx5Iik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIGFkZCBzcGVjaWZpZWQgZmlsZSBpbiB0b3JyZW50LiBJbiBjYXNlIG9mIG11bHRpLXRvcnJlbnQgdGhpcyBmaWxlIHdpbGwgYmUgZG93bmxvYWRlZCB0bworICAgKiB7QGxpbmsgI2RpcmVjdG9yeU5hbWV9LiBJbiBzaW5nbGUtZmlsZSB0b3JyZW50IHRoaXMgZmlsZSB3aWxsIGJlIGRvd25sb2FkZWQgaW4gZG93bmxvYWQgZm9sZGVyCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIGFkZEZpbGUoQE5vdE51bGwgRmlsZSBzb3VyY2UpIHsKKyAgICByZXR1cm4gYWRkRmlsZShzb3VyY2UsIHNvdXJjZS5nZXROYW1lKCkpOworICB9CisKKyAgLyoqCisgICAqIGFsbG93IHRvIGNyZWF0ZSBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB2aWEgc3BlaWNpZmllZCBoYXNoZXMsIGZpbGVzIHBhdGhzIGFuZCBmaWxlcyBsZW5ndGhzLgorICAgKiBVc2luZyBvZiB0aGlzIG1ldGhvZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHVzaW5nIHNvdXJjZS1iYXNlZCBtZXRob2RzCisgICAqICh7QGxpbmsgI2FkZEZpbGUoRmlsZSl9LCB7QGxpbmsgI2FkZERhdGFTb3VyY2UoSW5wdXRTdHJlYW0sIFN0cmluZywgYm9vbGVhbil9LCBldGMKKyAgICogYmVjYXVzZSBpdCdzIG5vdCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgY29uY2F0IHRoaXMgaGFzaGVzIGFuZCBjYWxjdWxhdGVkIGhhc2hlcy4KKyAgICogZWFjaCBieXRlIGFycmF5IGluIGhhc2hlcyBsaXN0IHNob3VsZCBoYXZlIHt7QGxpbmsgQ29uc3RhbnRzI1BJRUNFX0hBU0hfU0laRX19IGxlbmd0aAorICAgKgorICAgKiBAcGFyYW0gaGFzaGVzICAgICAgIGxpc3Qgb2YgZmlsZXMgaGFzaGVzIGluIHNhbWUgb3JkZXIgYXMgZmlsZXMgaW4gZmlsZXMgcGF0aHMgbGlzdAorICAgKiBAcGFyYW0gZmlsZXNQYXRocyAgIGxpc3Qgb2YgZmlsZXMgcGF0aHMKKyAgICogQHBhcmFtIGZpbGVzTGVuZ3RocyBsaXN0IG9mIGZpbGVzIGxlbmd0aHMgaW4gc2FtZSBvcmRlciBhcyBmaWxlcyBpbiBmaWxlcyBwYXRocyBsaXN0CisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIHNldEZpbGVzSW5mbyhATm90TnVsbCBMaXN0PGJ5dGVbXT4gaGFzaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBMaXN0PFN0cmluZz4gZmlsZXNQYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vdE51bGwgTGlzdDxMb25nPiBmaWxlc0xlbmd0aHMpIHsKKyAgICBpZiAoZGF0YVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBhZGQgaGFzaGVzLWJhc2VkIGZpbGVzIGluZm8uIFNvbWUgZGF0YSBzb3VyY2VzIGFscmVhZHkgYWRkZWQiKTsKKyAgICB9CisgICAgdGhpcy5maWxlc1BhdGhzLmNsZWFyKCk7CisgICAgdGhpcy5maWxlc1BhdGhzLmFkZEFsbChmaWxlc1BhdGhzKTsKKyAgICB0aGlzLmhhc2hpbmdSZXN1bHQgPSBuZXcgSGFzaGluZ1Jlc3VsdChoYXNoZXMsIGZpbGVzTGVuZ3Rocyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogbWFya3MgdG9ycmVudCBhcyBwcml2YXRlCisgICAqCisgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMjcuaHRtbCI+aHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMjcuaHRtbDwvYT4KKyAgICovCisgIHB1YmxpYyB2b2lkIGRvUHJpdmF0ZSgpIHsKKyAgICBpc1ByaXZhdGUgPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIG1hcmtzIHRvcnJlbnQgYXMgcHVibGljCisgICAqCisgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMjcuaHRtbCI+aHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMjcuaHRtbDwvYT4KKyAgICovCisgIHB1YmxpYyB2b2lkIGRvUHVibGljKCkgeworICAgIGlzUHJpdmF0ZSA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gbmV3IHtAbGluayBUb3JyZW50TWV0YWRhdGF9IGluc3RhbmNlIHdpdGggYnVpbGRlcidzIGZpZWxkcworICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICBpZiBJTyBlcnJvciBvY2N1cnMgb24gcmVhZGluZyBmcm9tIHNvdXJjZSBzdHJlYW1zIGFuZCBmaWxlcworICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBidWlsZGVyJ3Mgc3RhdGUgaXMgaW5jb3JyZWN0IChlLmcuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKQorICAgKi8KKyAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBidWlsZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2UoYnVpbGRCaW5hcnkoKSk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgbWV0YWRhdGEKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgaWYgSU8gZXJyb3Igb2NjdXJzIG9uIHJlYWRpbmcgZnJvbSBzb3VyY2Ugc3RyZWFtcyBhbmQgZmlsZXMKKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYnVpbGRlcidzIHN0YXRlIGlzIGluY29ycmVjdCAoZS5nLiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcykKKyAgICovCisgIHB1YmxpYyBieXRlW10gYnVpbGRCaW5hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgQkVuY29kZXIuYmVuY29kZShidWlsZEJFUCgpLCBvdXQpOworICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIEJFUC1lbmNvZGVkIGRpY3Rpb25hcnkgb2YgbWV0YWRhdGEKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgaWYgSU8gZXJyb3Igb2NjdXJzIG9uIHJlYWRpbmcgZnJvbSBzb3VyY2Ugc3RyZWFtcyBhbmQgZmlsZXMKKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYnVpbGRlcidzIHN0YXRlIGlzIGluY29ycmVjdCAoZS5nLiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcykKKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIGJ1aWxkQkVQKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYnVpbGRBbmRDbG9zZVJlc291cmNlcygpOworICB9CisKKyAgcHJpdmF0ZSBCRVZhbHVlIGJ1aWxkQW5kQ2xvc2VSZXNvdXJjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gZG9CdWlsZCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBjbG9zZUFsbFNvdXJjZXMoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEJFVmFsdWUgZG9CdWlsZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZHJvcEVtcHR5VGllcnNGcm9tQW5ub3VuY2UoKTsKKworICAgIGlmIChhbm5vdW5jZS5pc0VtcHR5KCkgJiYgIWFubm91bmNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgYW5ub3VuY2UgPSBhbm5vdW5jZUxpc3QuZ2V0KDApLmdldCgwKTsKKyAgICB9CisgICAgaWYgKGZpbGVzUGF0aHMuc2l6ZSgpID09IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgbWV0YWRhdGEgd2l0aG91dCBzb3VyY2VzLiBVc2UgYWRkU291cmNlKCkgbWV0aG9kIGZvciBhZGRpbmcgc291cmNlcyIpOworICAgIH0KKyAgICBmaW5hbCBib29sZWFuIGlzU2luZ2xlTW9kZSA9IGZpbGVzUGF0aHMuc2l6ZSgpID09IDEgJiYgZGlyZWN0b3J5TmFtZS5pc0VtcHR5KCk7CisgICAgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgaWYgKCFkaXJlY3RvcnlOYW1lLmlzRW1wdHkoKSkgeworICAgICAgbmFtZSA9IGRpcmVjdG9yeU5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc1NpbmdsZU1vZGUpIHsKKyAgICAgICAgbmFtZSA9IGZpbGVzUGF0aHMuZ2V0KDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyByZXF1aXJlZCBmaWVsZCAnbmFtZScuIFVzZSBzZXREaXJlY3RvcnlOYW1lKCkgbWV0aG9kIGZvciBzcGVjaWZ5aW5nIG5hbWUgb2YgdG9ycmVudCIpOworICAgICAgfQorICAgIH0KKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHRvcnJlbnQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgaWYgKCFhbm5vdW5jZS5pc0VtcHR5KCkpIHRvcnJlbnQucHV0KEFOTk9VTkNFLCBuZXcgQkVWYWx1ZShhbm5vdW5jZSkpOworICAgIGlmICghYW5ub3VuY2VMaXN0LmlzRW1wdHkoKSkgdG9ycmVudC5wdXQoQU5OT1VOQ0VfTElTVCwgd3JhcEFubm91bmNlTGlzdCgpKTsKKyAgICBpZiAoY3JlYXRpb25EYXRlID4gMCkgeworICAgICAgdG9ycmVudC5wdXQoQ1JFQVRJT05fREFURV9TRUMsIG5ldyBCRVZhbHVlKGNyZWF0aW9uRGF0ZSkpOworICAgIH0KKworICAgIGlmICghY29tbWVudC5pc0VtcHR5KCkpIHRvcnJlbnQucHV0KENPTU1FTlQsIG5ldyBCRVZhbHVlKGNvbW1lbnQpKTsKKyAgICBpZiAoIWNyZWF0ZWRCeS5pc0VtcHR5KCkpIHRvcnJlbnQucHV0KENSRUFURURfQlksIG5ldyBCRVZhbHVlKGNyZWF0ZWRCeSkpOworICAgIGlmICghd2ViU2VlZFVybExpc3QuaXNFbXB0eSgpKSB0b3JyZW50LnB1dChVUkxfTElTVCwgd3JhcFN0cmluZ0xpc3Qod2ViU2VlZFVybExpc3QpKTsKKworICAgIEhhc2hpbmdSZXN1bHQgaGFzaGluZ1Jlc3VsdCA9IHRoaXMuaGFzaGluZ1Jlc3VsdCA9PSBudWxsID8KKyAgICAgICAgICAgIHBpZWNlc0hhc2hlc0NhbGN1bGF0b3IuY2FsY3VsYXRlSGFzaGVzKGRhdGFTb3VyY2VzLCBwaWVjZUxlbmd0aCkgOgorICAgICAgICAgICAgdGhpcy5oYXNoaW5nUmVzdWx0OworCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBpbmZvLnB1dChQSUVDRV9MRU5HVEgsIG5ldyBCRVZhbHVlKHBpZWNlTGVuZ3RoKSk7CisgICAgaW5mby5wdXQoUElFQ0VTLCBjb25jYXRIYXNoZXMoaGFzaGluZ1Jlc3VsdC5nZXRIYXNoZXMoKSkpOworICAgIGluZm8ucHV0KFBSSVZBVEUsIG5ldyBCRVZhbHVlKGlzUHJpdmF0ZSA/IDEgOiAwKSk7CisgICAgaW5mby5wdXQoTkFNRSwgbmV3IEJFVmFsdWUobmFtZSkpOworICAgIGlmIChpc1NpbmdsZU1vZGUpIHsKKyAgICAgIExvbmcgc291cmNlU2l6ZSA9IGhhc2hpbmdSZXN1bHQuZ2V0U291cmNlU2l6ZXMoKS5nZXQoMCk7CisgICAgICBpbmZvLnB1dChGSUxFX0xFTkdUSCwgbmV3IEJFVmFsdWUoc291cmNlU2l6ZSkpOworICAgIH0gZWxzZSB7CisgICAgICBMaXN0PEJFVmFsdWU+IGZpbGVzID0gZ2V0RmlsZXNMaXN0KGhhc2hpbmdSZXN1bHQpOworICAgICAgaW5mby5wdXQoRklMRVMsIG5ldyBCRVZhbHVlKGZpbGVzKSk7CisgICAgfQorICAgIHRvcnJlbnQucHV0KElORk9fVEFCTEUsIG5ldyBCRVZhbHVlKGluZm8pKTsKKworICAgIHJldHVybiBuZXcgQkVWYWx1ZSh0b3JyZW50KTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxCRVZhbHVlPiBnZXRGaWxlc0xpc3QoSGFzaGluZ1Jlc3VsdCBoYXNoaW5nUmVzdWx0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgQXJyYXlMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QkVWYWx1ZT4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzUGF0aHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGZpbGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgICBMb25nIHNvdXJjZVNpemUgPSBoYXNoaW5nUmVzdWx0LmdldFNvdXJjZVNpemVzKCkuZ2V0KGkpOworICAgICAgU3RyaW5nIGZ1bGxQYXRoID0gZmlsZXNQYXRocy5nZXQoaSk7CisgICAgICBMaXN0PEJFVmFsdWU+IGZpbGVQYXRoID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IGZ1bGxQYXRoLnJlcGxhY2UoIlxcIiwgIi8iKS5zcGxpdCgiLyIpKSB7CisgICAgICAgIGZpbGVQYXRoLmFkZChuZXcgQkVWYWx1ZShwYXRoKSk7CisgICAgICB9CisgICAgICBmaWxlLnB1dChGSUxFX1BBVEgsIG5ldyBCRVZhbHVlKGZpbGVQYXRoKSk7CisgICAgICBmaWxlLnB1dChGSUxFX0xFTkdUSCwgbmV3IEJFVmFsdWUoc291cmNlU2l6ZSkpOworICAgICAgcmVzdWx0LmFkZChuZXcgQkVWYWx1ZShmaWxlKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIEJFVmFsdWUgY29uY2F0SGFzaGVzKExpc3Q8Ynl0ZVtdPiBoYXNoZXMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKGJ5dGVbXSBoYXNoIDogaGFzaGVzKSB7CisgICAgICBzYi5hcHBlbmQobmV3IFN0cmluZyhoYXNoLCBDb25zdGFudHMuQllURV9FTkNPRElORykpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEJFVmFsdWUoc2IudG9TdHJpbmcoKSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworICB9CisKKyAgcHJpdmF0ZSBCRVZhbHVlIHdyYXBTdHJpbmdMaXN0KExpc3Q8U3RyaW5nPiBsc3QpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEJFVmFsdWU+KCk7CisgICAgZm9yKFN0cmluZyBzIDogbHN0KSB7CisgICAgICByZXN1bHQuYWRkKG5ldyBCRVZhbHVlKHMpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBCRVZhbHVlKHJlc3VsdCk7CisgIH0KKworICBwcml2YXRlIEJFVmFsdWUgd3JhcEFubm91bmNlTGlzdCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBMaXN0PEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEJFVmFsdWU+KCk7CisgICAgZm9yIChMaXN0PFN0cmluZz4gdGllciA6IGFubm91bmNlTGlzdCkgeworICAgICAgcmVzdWx0LmFkZCh3cmFwU3RyaW5nTGlzdCh0aWVyKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgQkVWYWx1ZShyZXN1bHQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRyb3BFbXB0eVRpZXJzRnJvbUFubm91bmNlKCkgeworICAgIEl0ZXJhdG9yPExpc3Q8U3RyaW5nPj4gaXRlcmF0b3IgPSBhbm5vdW5jZUxpc3QuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBMaXN0PFN0cmluZz4gdGllciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIGlmICh0aWVyLmlzRW1wdHkoKSkgeworICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY2xvc2VBbGxTb3VyY2VzKCkgeworICAgIGZvciAoRGF0YVNvdXJjZUhvbGRlciBzb3VyY2VIb2xkZXIgOiBkYXRhU291cmNlcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgc291cmNlSG9sZGVyLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICBsb2dnZXIuZXJyb3IoIkVycm9yIGluIGNsb3NpbmcgZGF0YSBzb3VyY2UgIiArIHNvdXJjZUhvbGRlciwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRGaXJzdFRpZXIoKSB7CisgICAgaWYgKGFubm91bmNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgIG5ld1RpZXIoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlU291cmNlSG9sZGVyIGltcGxlbWVudHMgRGF0YVNvdXJjZUhvbGRlciB7CisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBGaWxlSW5wdXRTdHJlYW0gZmlzOworICAgIEBOb3ROdWxsCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHNvdXJjZTsKKworICAgIHB1YmxpYyBGaWxlU291cmNlSG9sZGVyKEBOb3ROdWxsIEZpbGUgc291cmNlKSB7CisgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXMgPT0gbnVsbCkgeworICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSk7CisgICAgICB9CisgICAgICByZXR1cm4gZmlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuICJEYXRhIHNvdXJjZSBmb3IgZmlsZSBzdHJlYW0gIiArIGZpczsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJlYW1CYXNlZEhvbGRlckltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlSG9sZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2xvc2VBZnRlckJ1aWxkOworCisgICAgcHVibGljIFN0cmVhbUJhc2VkSG9sZGVySW1wbChJbnB1dFN0cmVhbSBzb3VyY2UsIGJvb2xlYW4gY2xvc2VBZnRlckJ1aWxkKSB7CisgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICAgIHRoaXMuY2xvc2VBZnRlckJ1aWxkID0gY2xvc2VBZnRlckJ1aWxkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB7CisgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChjbG9zZUFmdGVyQnVpbGQpIHsKKyAgICAgICAgc291cmNlLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiAiRGF0YSBzb3VyY2UgZm9yIHVzZXIncyBzdHJlYW0gIiArIHNvdXJjZTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vTXVsdGlUaHJlYWRIYXNoZXNDYWxjdWxhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2YjRiMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vTXVsdGlUaHJlYWRIYXNoZXNDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK3B1YmxpYyBjbGFzcyBNdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IgaW1wbGVtZW50cyBQaWVjZXNIYXNoZXNDYWxjdWxhdG9yIHsKKworICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4SW5NZW1vcnlQaWVjZXM7CisKKyAgcHVibGljIE11bHRpVGhyZWFkSGFzaGVzQ2FsY3VsYXRvcihFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IsIGludCBtYXhJbk1lbW9yeVBpZWNlcykgeworICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICB0aGlzLm1heEluTWVtb3J5UGllY2VzID0gbWF4SW5NZW1vcnlQaWVjZXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEhhc2hpbmdSZXN1bHQgY2FsY3VsYXRlSGFzaGVzKExpc3Q8RGF0YVNvdXJjZUhvbGRlcj4gc291cmNlcywgaW50IHBpZWNlU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBMaXN0PGJ5dGVbXT4gaGFzaGVzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgZmluYWwgTGlzdDxGdXR1cmU8Ynl0ZVtdPj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RnV0dXJlPGJ5dGVbXT4+KCk7CisgICAgTGlzdDxMb25nPiBzb3VyY2VzU2l6ZXMgPSBDb21tb25IYXNoaW5nQ2FsY3VsYXRvci5JTlNUQU5DRS5wcm9jZXNzRGF0YVNvdXJjZXMoCisgICAgICAgICAgICBzb3VyY2VzLAorICAgICAgICAgICAgcGllY2VTaXplLAorICAgICAgICAgICAgbmV3IENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yLlByb2Nlc3NvcigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgYnl0ZVtdIGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF3YWl0SGFzaGVzQ2FsY3VsYXRpb25BbmRTdG9yZShmdXR1cmVzLCBoYXNoZXMsIG1heEluTWVtb3J5UGllY2VzKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyQ29weSA9IEFycmF5cy5jb3B5T2YoYnVmZmVyLCBidWZmZXIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmdXR1cmVzLmFkZChleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlW10gY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChidWZmZXJDb3B5KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICApOworICAgIGF3YWl0SGFzaGVzQ2FsY3VsYXRpb25BbmRTdG9yZShmdXR1cmVzLCBoYXNoZXMsIDApOworCisgICAgcmV0dXJuIG5ldyBIYXNoaW5nUmVzdWx0KGhhc2hlcywgc291cmNlc1NpemVzKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhd2FpdEhhc2hlc0NhbGN1bGF0aW9uQW5kU3RvcmUoTGlzdDxGdXR1cmU8Ynl0ZVtdPj4gZnV0dXJlcywgTGlzdDxieXRlW10+IGhhc2hlcywgaW50IGNvdW50KSB7CisgICAgd2hpbGUgKGZ1dHVyZXMuc2l6ZSgpID4gY291bnQpIHsKKyAgICAgIGJ5dGVbXSBoYXNoOworICAgICAgdHJ5IHsKKyAgICAgICAgRnV0dXJlPGJ5dGVbXT4gZnV0dXJlID0gZnV0dXJlcy5yZW1vdmUoMCk7CisgICAgICAgIGhhc2ggPSBmdXR1cmUuZ2V0KCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgICBoYXNoZXMuYWRkKGhhc2gpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9QaWVjZXNIYXNoZXNDYWxjdWxhdG9yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1BpZWNlc0hhc2hlc0NhbGN1bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGE3Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9QaWVjZXNIYXNoZXNDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgeworCisgIC8qKgorICAgKiBjYWxjdWxhdGVzIHNoYTEgaGFzaGVzIG9mIGVhY2ggY2h1bmsgd2l0aCBzcGVjaWZpZWQgcGllY2Ugc2l6ZQorICAgKiBhbmQgcmV0dXJucyBsaXN0IG9mIGhhc2hlcyBhbmQgc3RyZWFtJ3Mgc2l6ZXMuIElmIG9uZSBzdHJlYW0gaXMgZW5kZWQgYW5kIHBpZWNlIHNpemUgdGhyZXNob2xkIGlzIG5vdCByZWFjaGVkCisgICAqIGltcGxlbWVudGF0aW9uIG11c3QgcmVhZCBieXRlcyBmcm9tIG5leHQgc3RyZWFtCisgICAqIEZvciBleGFtcGxlIGlmIHNvdXJjZSBsaXN0IGlzIDMgc3RyZWFtcyB3aXRoIG5leHQgYnl0ZXM6CisgICAqIGZpcnN0IHN0cmVhbTogWzEsMiwzXQorICAgKiBzZWNvbmQgc3RyZWFtOiBbNCw1LDYsN10KKyAgICogdGhpcmQgc3RyZWFtOiBbOCw5XQorICAgKiBhbmQgcGllY2VTaXplID0gNAorICAgKiByZXN1bHQgbXVzdCBjb250YWluIHNvdXJjZSBzaXplIFszLDQsMl0gYW5kIGhhc2hlczogW3NoYTEoMSwyLDMsNCksIHNoYTEoNSw2LDcsOCksIHNoYTEoOSldCisgICAqCisgICAqIEBwYXJhbSBzb3VyY2VzICAgbGlzdCBvZiBpbnB1dCBzdHJlYW0ncyBwcm92aWRlcnMKKyAgICogQHBhcmFtIHBpZWNlU2l6ZSBzaXplIG9mIG9uZSBwaWVjZQorICAgKiBAcmV0dXJuIHNlZSBhYm92ZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIGVycm9yIG9jY3VycyBpbiByZWFkaW5nIGZyb20gc3RyZWFtcworICAgKi8KKyAgSGFzaGluZ1Jlc3VsdCBjYWxjdWxhdGVIYXNoZXMoTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzLCBpbnQgcGllY2VTaXplKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vU2luZ2xlVGhyZWFkSGFzaGVzQ2FsY3VsYXRvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9TaW5nbGVUaHJlYWRIYXNoZXNDYWxjdWxhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NjM3MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vU2luZ2xlVGhyZWFkSGFzaGVzQ2FsY3VsYXRvci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNpbmdsZVRocmVhZEhhc2hlc0NhbGN1bGF0b3IgaW1wbGVtZW50cyBQaWVjZXNIYXNoZXNDYWxjdWxhdG9yIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEhhc2hpbmdSZXN1bHQgY2FsY3VsYXRlSGFzaGVzKExpc3Q8RGF0YVNvdXJjZUhvbGRlcj4gc291cmNlcywgaW50IHBpZWNlU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBMaXN0PGJ5dGVbXT4gaGFzaGVzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgTGlzdDxMb25nPiBzb3VyY2VzU2l6ZXMgPSBDb21tb25IYXNoaW5nQ2FsY3VsYXRvci5JTlNUQU5DRS5wcm9jZXNzRGF0YVNvdXJjZXMoCisgICAgICAgICAgICBzb3VyY2VzLAorICAgICAgICAgICAgcGllY2VTaXplLAorICAgICAgICAgICAgbmV3IENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yLlByb2Nlc3NvcigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoYnl0ZVtdIGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBoYXNoID0gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaGFzaGVzLmFkZChoYXNoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gbmV3IEhhc2hpbmdSZXN1bHQoaGFzaGVzLCBzb3VyY2VzU2l6ZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1N0cmluZ1V0aWxzLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1N0cmluZ1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlOGM4YwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vU3RyaW5nVXRpbHMuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzIHsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBqb2luKFN0cmluZyBkZWxpbWl0ZXIsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IGl0ZXJhYmxlKSB7CisgICAgSXRlcmF0b3I8PyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgIHNiLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOworICAgIH0KKyAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKS5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhOTExMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbDsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlcy4KKyAqIOWFrOWRiuivt+axgua2iOaBr+eahOWfuuehgOaOpeWPo+OAggorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3VidHlwZXMgb2YgYW5ub3VuY2UgcmVxdWVzdAorICogbWVzc2FnZXMgZm9yIHRoZSB2YXJpb3VzIHRyYWNrZXIgcHJvdG9jb2xzLgorICogPC9wPgorICoKKyAqIEZvciBkZXRhaWxzIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJodHRwczovL3dpa2kudGhlb3J5Lm9yZy9pbmRleC5waHAvQml0VG9ycmVudFNwZWNpZmljYXRpb24jVHJhY2tlcl9SZXF1ZXN0X1BhcmFtZXRlcnMiPjwvYT4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGludGVyZmFjZSBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHsKKworICBpbnQgREVGQVVMVF9OVU1fV0FOVCA9IDUwOworCisgIC8qKgorICAgKiBBbm5vdW5jZSByZXF1ZXN0IGV2ZW50IHR5cGVzLgorICAgKgorICAgKiA8cD4KKyAgICogV2hlbiB0aGUgY2xpZW50IHN0YXJ0cyBleGNoYW5naW5nIG9uIGEgdG9ycmVudCwgaXQgbXVzdCBjb250YWN0IHRoZQorICAgKiB0b3JyZW50J3MgdHJhY2tlciB3aXRoIGEgJ3N0YXJ0ZWQnIGFubm91bmNlIHJlcXVlc3QsIHdoaWNoIG5vdGlmaWVzIHRoZQorICAgKiB0cmFja2VyIHRoaXMgY2xpZW50IG5vdyBleGNoYW5nZXMgb24gdGhpcyB0b3JyZW50IChhbmQgdGh1cyBhbGxvd3MgdGhlCisgICAqIHRyYWNrZXIgdG8gcmVwb3J0IHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBwZWVyIHRvIG90aGVyIGNsaWVudHMpLgorICAgKiA8L3A+CisgICAqCisgICAqIDxwPgorICAgKiBXaGVuIHRoZSBjbGllbnQgc3RvcHMgZXhjaGFuZ2luZywgb3Igd2hlbiBpdHMgZG93bmxvYWQgY29tcGxldGVzLCBpdCBtdXN0CisgICAqIGFsc28gc2VuZCBhIHNwZWNpZmljIGFubm91bmNlIHJlcXVlc3QuIE90aGVyd2lzZSwgdGhlIGNsaWVudCBtdXN0IHNlbmQgYW4KKyAgICogZXZlbnRsZXNzIChOT05FKSwgcGVyaW9kaWMgYW5ub3VuY2UgcmVxdWVzdCB0byB0aGUgdHJhY2tlciBhdCBhbgorICAgKiBpbnRlcnZhbCBzcGVjaWZpZWQgYnkgdGhlIHRyYWNrZXIgaXRzZWxmLCBhbGxvd2luZyB0aGUgdHJhY2tlciB0bworICAgKiByZWZyZXNoIHRoaXMgcGVlcidzIHN0YXR1cyBhbmQgYWNrbm93bGVkZ2UgdGhhdCBpdCBpcyBzdGlsbCB0aGVyZS4KKyAgICogPC9wPgorICAgKi8KKyAgZW51bSBSZXF1ZXN0RXZlbnQgeworICAgIE5PTkUoMCksCisgICAgQ09NUExFVEVEKDEpLAorICAgIFNUQVJURUQoMiksCisgICAgU1RPUFBFRCgzKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGlkOworCisgICAgUmVxdWVzdEV2ZW50KGludCBpZCkgeworICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdEV2ZW50IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgZm9yIChSZXF1ZXN0RXZlbnQgdHlwZSA6IFJlcXVlc3RFdmVudC52YWx1ZXMoKSkgeworICAgICAgICBpZiAodHlwZS5uYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RFdmVudCBnZXRCeUlkKGludCBpZCkgeworICAgICAgZm9yIChSZXF1ZXN0RXZlbnQgdHlwZSA6IFJlcXVlc3RFdmVudC52YWx1ZXMoKSkgeworICAgICAgICBpZiAodHlwZS5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIFNIQTEgaGFzaCBvZiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggImluZm8iIGtleSBpbiAudG9ycmVudCBmaWxlCisgICAqLworICBieXRlW10gZ2V0SW5mb0hhc2goKTsKKworICAvKioKKyAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAbGluayAjZ2V0SW5mb0hhc2h9IHdoZXJlIGVhY2ggYnl0ZSByZXBsYWNlZCBieSBoZXgtc3RyaW5nIHZhbHVlIHdpdGggbGVhZCB6ZXJvCisgICAqIGZvciBleGFtcGxlIGZvciBieXRlIGFycmF5IFsxLCAyLCAxNSwgLTJdIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIDAxMDIwRkZFCisgICAqCisgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAbGluayAjZ2V0SW5mb0hhc2h9CisgICAqLworICBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKTsKKworICAvKioKKyAgICogQHJldHVybiBwZWVyIGlkIGdlbmVyYXRlZCBieSBjdXJyZW50IGNsaWVudAorICAgKi8KKyAgYnl0ZVtdIGdldFBlZXJJZCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgI2dldFBlZXJJZH0uIEl0J3Mgc2ltaWxhcmx5IHtAbGluayAjZ2V0SGV4SW5mb0hhc2goKX0gbWV0aG9kCisgICAqLworICBTdHJpbmcgZ2V0SGV4UGVlcklkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY3VycmVudCBjbGllbnQgcG9ydCBvbiB3aGljaCBpdCBsaXN0ZW5zIGZvciBuZXcgY29ubmVjdGlvbnMKKyAgICovCisgIGludCBnZXRQb3J0KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY291bnQgb2YgdXBsb2FkZWQgYnl0ZXMgZm9yIGN1cnJlbnQgdG9ycmVudCBieSBjdXJyZW50IHBlZXIgYWZ0ZXIgc2VuZGluZyBTVEFSVEVEIGV2ZW50IHRvIHRoZSB0cmFja2VyCisgICAqLworICBsb25nIGdldFVwbG9hZGVkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY291bnQgb2YgZG93bmxvYWRlZCBieXRlcyBmb3IgY3VycmVudCB0b3JyZW50IGJ5IGN1cnJlbnQgcGVlciBhZnRlciBzZW5kaW5nIFNUQVJURUQgZXZlbnQgdG8gdGhlIHRyYWNrZXIKKyAgICovCisgIGxvbmcgZ2V0RG93bmxvYWRlZCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGNvdW50IG9mIGJ5dGVzIHdoaWNoIGNsaWVudCBtdXN0IGJlIGRvd25sb2FkCisgICAqLworICBsb25nIGdldExlZnQoKTsKKworICAvKioKKyAgICogVGVsbHMgdGhhdCBpdCdzIGNvbXBhY3QgcmVxdWVzdC4KKyAgICogSW4gdGhpcyBjYXNlIHRyYWNrZXIgcmV0dXJuIGNvbXBhY3QgcGVlcnMgbGlzdCB3aGljaCBjb250YWlucyBvbmx5IGFkZHJlc3MgYW5kIHBvcnQgd2l0aG91dCBwZWVyIGlkLAorICAgKiBidXQgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24gc29tZSB0cmFja2VycyBjYW4gaWdub3JlIHRoaXMgcGFyYW1ldGVyCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIGNvbXBhY3QgcmVxdWVzdC4KKyAgICovCisgIGJvb2xlYW4gaXNDb21wYWN0KCk7CisKKyAgLyoqCisgICAqIFRlbGxzIHRoYXQgdHJhY2tlciBjYW4gb21pdCBwZWVyIGlkIGZpZWxkIGluIHJlc3BvbnNlLiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIHtAbGluayAjaXNDb21wYWN0KCl9IG1ldGhvZAorICAgKiByZXR1cm4gdHJ1ZQorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2tlciBjYW4gb21pdCBwZWVyIGlkCisgICAqLworICBib29sZWFuIGNhbk9taXRQZWVySWQoKTsKKworICAvKioKKyAgICogQHJldHVybiBldmVudCBvZiBjdXJyZW50IHJlcXVlc3QKKyAgICovCisgIFJlcXVlc3RFdmVudCBnZXRFdmVudCgpOworCisgIC8qKgorICAgKiBPcHRpb25hbC4gSWYgaXQncyBub3Qgc3BlY2lmaWVkIHRoZXQgdHJhY2tlciBnZXQgaXAgYWRkcmVzcyBmcm9tIHJlcXVlc3QKKyAgICoKKyAgICogQHJldHVybiBjdXJyZW50IGNsaWVudCBhZGRyZXNzIG9uIHdoaWNoIGl0IGxpc3RlbnMgZm9yIG5ldyBjb25uZWN0aW9ucworICAgKi8KKyAgU3RyaW5nIGdldElwKCk7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsLiBJZiBpdCdzIG5vdCBzcGVjaWZpZWQgKHZhbHVlIGlzIHplcm8gb3IgbmVnYXRpdmUpIHRyYWNrZXIgcmV0dXJuIGRlZmF1bHQgcGVlcnMgY291bnQuIEFzIGEgcnVsZSB0aGlzIGNvdW50IGlzIDUwCisgICAqCisgICAqIEByZXR1cm4gY291bnQgb2YgcGVlcnMgd2hpY2ggY2xpZW50IHdhbnQgdG8gZ2V0IGZyb20gdHJhY2tlcgorICAgKi8KKyAgaW50IGdldE51bVdhbnQoKTsKKworICAvKioKKyAgICogT3B0aW9uYWwuIENvbnRhaW5zIGtleSBvZiBjdXJyZW50IGNsaWVudC4gQ2xpZW50IGNhbiB1c2UgdGhpcyBrZXkgZm9yIGNvbmZpcm0gZm9yIHRyYWNrZXIgdGhhdCBpdCdzIG9sZCBjbGllbnQKKyAgICogYWZ0ZXIgY2hhbmdlIElQIGFkZHJlc3MKKyAgICoKKyAgICogQHJldHVybiBrZXkgb2YgY3VycmVudCBjbGllbnQuCisgICAqLworICBTdHJpbmcgZ2V0S2V5KCk7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsLiBJZiBwcmV2aW91cyByZXNwb25zZSBmcm9tIHRyYWNrZXIgY29udGFpbnMgdHJhY2tlciBpZCBmaWVsZCwgdGhlbiBjbGllbnQgbXVzdCBzZW5kIHRoaXMgdmFsdWUgaGVyZQorICAgKgorICAgKiBAcmV0dXJuIHByZXZpb3VzIHRyYWNrZXIgaWQKKyAgICovCisgIFN0cmluZyBnZXRUcmFja2VySWQoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9Bbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9Bbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmYyMTIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL0Fubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2w7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlcy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHN1YnR5cGVzIG9mIGFubm91bmNlIHJlc3BvbnNlCisgKiBtZXNzYWdlcyBmb3IgdGhlIHZhcmlvdXMgdHJhY2tlciBwcm90b2NvbHMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgeworCisgIGludCBnZXRJbnRlcnZhbCgpOworCisgIGludCBnZXRDb21wbGV0ZSgpOworCisgIGludCBnZXRJbmNvbXBsZXRlKCk7CisKKyAgTGlzdDxQZWVyPiBnZXRQZWVycygpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9QZWVyTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9QZWVyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmJhNjIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1BlZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2OTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SW5mbzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKKy8qKgorICogQml0VG9ycmVudCBwZWVyIHByb3RvY29sIG1lc3NhZ2VzIHJlcHJlc2VudGF0aW9ucy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgYW5kIGl0cyA8ZW0+Kk1lc3NhZ2VzPC9lbT4gc3ViY2xhc3NlcyBwcm92aWRlIFBPSk8KKyAqIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgcGVlciBwcm90b2NvbCBtZXNzYWdlcywgYWxvbmcgd2l0aCBlYXN5IHBhcnNpbmcgZnJvbQorICogYW4gaW5wdXQgQnl0ZUJ1ZmZlciB0byBxdWlja2x5IGdldCBhIHVzYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmNvbWluZworICogbWVzc2FnZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3dpa2kudGhlb3J5Lm9yZy9CaXRUb3JyZW50U3BlY2lmaWNhdGlvbiNQZWVyX3dpcmVfcHJvdG9jb2xfLjI4VENQLjI5Ij5CaXRUb3JyZW50IHBlZXIgd2lyZSBwcm90b2NvbDwvYT4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBlZXJNZXNzYWdlIHsKKworICAvKioKKyAgICogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbGVuZ3RoIGZpZWxkIGluIGEgbWVzc2FnZSAob25lIDMyLWJpdAorICAgKiBpbnRlZ2VyKS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgPSA0OworCisgIC8qKgorICAgKiBNZXNzYWdlIHR5cGUuCisgICAqCisgICAqIDxwPgorICAgKiBOb3RlIHRoYXQgdGhlIGtlZXAtYWxpdmUgbWVzc2FnZXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbiB0eXBlIElEIGRlZmluZWQKKyAgICogaW4gdGhlIHByb3RvY29sIGFzIHRoZXkgYXJlIG9mIGxlbmd0aCAwLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgZW51bSBUeXBlIHsKKyAgICBLRUVQX0FMSVZFKC0xKSwKKyAgICBDSE9LRSgwKSwKKyAgICBVTkNIT0tFKDEpLAorICAgIElOVEVSRVNURUQoMiksCisgICAgTk9UX0lOVEVSRVNURUQoMyksCisgICAgSEFWRSg0KSwKKyAgICBCSVRGSUVMRCg1KSwKKyAgICBSRVFVRVNUKDYpLAorICAgIFBJRUNFKDcpLAorICAgIENBTkNFTCg4KTsKKworICAgIHByaXZhdGUgYnl0ZSBpZDsKKworICAgIFR5cGUoaW50IGlkKSB7CisgICAgICB0aGlzLmlkID0gKGJ5dGUpIGlkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhieXRlIGMpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkID09IGM7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0VHlwZUJ5dGUoKSB7CisgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0KGJ5dGUgYykgeworICAgICAgZm9yIChUeXBlIHQgOiBUeXBlLnZhbHVlcygpKSB7CisgICAgICAgIGlmICh0LmVxdWFscyhjKSkgeworICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGRhdGE7CisKKyAgcHJpdmF0ZSBQZWVyTWVzc2FnZShUeXBlIHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB0aGlzLmRhdGEucmV3aW5kKCk7CisgIH0KKworICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgIHJldHVybiB0aGlzLnR5cGU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIHtAbGluayBCeXRlQnVmZmVyfSBiYWNrZWQgYnkgdGhlIHNhbWUgZGF0YSBhcyB0aGlzIG1lc3NhZ2UuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgZHVwbGljYXRlIG9mIHRoZSBidWZmZXIgc3RvcmVkIGluIHRoaXMge0BsaW5rCisgICAqIFBlZXJNZXNzYWdlfSBvYmplY3QgdG8gYWxsb3cgZm9yIG11bHRpcGxlIGNvbnN1bWVycyB0byByZWFkIGZyb20gdGhlCisgICAqIHNhbWUgbWVzc2FnZSB3aXRob3V0IGNvbmZsaWN0aW5nIGFjY2VzcyB0byB0aGUgYnVmZmVyJ3MgcG9zaXRpb24sIG1hcmsKKyAgICogYW5kIGxpbWl0LgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXREYXRhKCkgeworICAgIHJldHVybiB0aGlzLmRhdGEuZHVwbGljYXRlKCk7CisgIH0KKworICAvKioKKyAgICogVmFsaWRhdGUgdGhhdCB0aGlzIG1lc3NhZ2UgbWFrZXMgc2Vuc2UgZm9yIHRoZSB0b3JyZW50IGl0J3MgcmVsYXRlZCB0by4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIG92ZXJsb2FkZWQgYnkgZGlzdGluY3QgbWVzc2FnZSB0eXBlcywgd2hlcmUKKyAgICogaXQgbWFrZXMgc2Vuc2UuIE90aGVyd2lzZSwgaXQgZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gdG9ycmVudCBUaGUgdG9ycmVudCB0aGlzIG1lc3NhZ2UgaXMgYWJvdXQuCisgICAqLworICBwdWJsaWMgUGVlck1lc3NhZ2UgdmFsaWRhdGUoVG9ycmVudEluZm8gdG9ycmVudCkKKyAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCkubmFtZSgpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlIHRoZSBnaXZlbiBidWZmZXIgaW50byBhIHBlZXIgcHJvdG9jb2wgbWVzc2FnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFBhcnNlcyB0aGUgcHJvdmlkZWQgYnl0ZSBhcnJheSBhbmQgYnVpbGRzIHRoZSBjb3JyZXNwb25kaW5nIFBlZXJNZXNzYWdlCisgICAqIHN1YmNsYXNzIG9iamVjdC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gYnVmZmVyICBUaGUgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgbWVzc2FnZSBkYXRhLgorICAgKiBAcGFyYW0gdG9ycmVudCBUaGUgdG9ycmVudCB0aGlzIG1lc3NhZ2UgaXMgYWJvdXQuCisgICAqIEByZXR1cm4gQSBQZWVyTWVzc2FnZSBzdWJjbGFzcyBpbnN0YW5jZS4KKyAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBXaGVuIHRoZSBtZXNzYWdlIGlzIGludmFsaWQsIGNhbid0IGJlIHBhcnNlZCBvcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG1hdGNoIHRoZSBwcm90b2NvbCByZXF1aXJlbWVudHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFBlZXJNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLCBUb3JyZW50SW5mbyB0b3JyZW50KQorICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgIHJldHVybiBLZWVwQWxpdmVNZXNzYWdlLnBhcnNlKGJ1ZmZlciwgdG9ycmVudCk7CisgICAgfSBlbHNlIGlmIChsZW5ndGggIT0gYnVmZmVyLnJlbWFpbmluZygpKSB7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk1lc3NhZ2Ugc2l6ZSBkaWQgbm90IG1hdGNoIGFubm91bmNlZCAiICsKKyAgICAgICAgICAgICAgInNpemUhIiwgMCk7CisgICAgfQorCisgICAgVHlwZSB0eXBlID0gVHlwZS5nZXQoYnVmZmVyLmdldCgpKTsKKyAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVua25vd24gbWVzc2FnZSBJRCEiLAorICAgICAgICAgICAgICBidWZmZXIucG9zaXRpb24oKSAtIDEpOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBDSE9LRToKKyAgICAgICAgcmV0dXJuIENob2tlTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIFVOQ0hPS0U6CisgICAgICAgIHJldHVybiBVbmNob2tlTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIElOVEVSRVNURUQ6CisgICAgICAgIHJldHVybiBJbnRlcmVzdGVkTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIE5PVF9JTlRFUkVTVEVEOgorICAgICAgICByZXR1cm4gTm90SW50ZXJlc3RlZE1lc3NhZ2UucGFyc2UoYnVmZmVyLnNsaWNlKCksIHRvcnJlbnQpOworICAgICAgY2FzZSBIQVZFOgorICAgICAgICByZXR1cm4gSGF2ZU1lc3NhZ2UucGFyc2UoYnVmZmVyLnNsaWNlKCksIHRvcnJlbnQpOworICAgICAgY2FzZSBCSVRGSUVMRDoKKyAgICAgICAgcmV0dXJuIEJpdGZpZWxkTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIFJFUVVFU1Q6CisgICAgICAgIHJldHVybiBSZXF1ZXN0TWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIFBJRUNFOgorICAgICAgICByZXR1cm4gUGllY2VNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgQ0FOQ0VMOgorICAgICAgICByZXR1cm4gQ2FuY2VsTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZXNzYWdlIHR5cGUgc2hvdWxkIGhhdmUgIiArCisgICAgICAgICAgICAgICAgImJlZW4gcHJvcGVybHkgZGVmaW5lZCBieSBub3cuIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFBhcnNlRXhjZXB0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTsKKworICAgIHB1YmxpYyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbihQZWVyTWVzc2FnZSBtKSB7CisgICAgICBzdXBlcigiTWVzc2FnZSAiICsgbSArICIgaXMgbm90IHZhbGlkISIsIDApOworICAgIH0KKworICB9CisKKworICAvKioKKyAgICogS2VlcCBhbGl2ZSBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDA+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEtlZXBBbGl2ZU1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gMDsKKworICAgIHByaXZhdGUgS2VlcEFsaXZlTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgc3VwZXIoVHlwZS5LRUVQX0FMSVZFLCBidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgS2VlcEFsaXZlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudEluZm8gdG9ycmVudCkgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiAoS2VlcEFsaXZlTWVzc2FnZSkgbmV3IEtlZXBBbGl2ZU1lc3NhZ2UoYnVmZmVyKQorICAgICAgICAgICAgICAudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBLZWVwQWxpdmVNZXNzYWdlIGNyYWZ0KCkgeworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgS2VlcEFsaXZlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChLZWVwQWxpdmVNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICByZXR1cm4gbmV3IEtlZXBBbGl2ZU1lc3NhZ2UoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2hva2UgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDAxPjxpZD0wPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDaG9rZU1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gMTsKKworICAgIHByaXZhdGUgQ2hva2VNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICBzdXBlcihUeXBlLkNIT0tFLCBidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2hva2VNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gKENob2tlTWVzc2FnZSkgbmV3IENob2tlTWVzc2FnZShidWZmZXIpCisgICAgICAgICAgICAgIC52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENob2tlTWVzc2FnZSBjcmFmdCgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIENob2tlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChDaG9rZU1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXQoUGVlck1lc3NhZ2UuVHlwZS5DSE9LRS5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIHJldHVybiBuZXcgQ2hva2VNZXNzYWdlKGJ1ZmZlcik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVuY2hva2UgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDAxPjxpZD0xPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmNob2tlTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAxOworCisgICAgcHJpdmF0ZSBVbmNob2tlTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgc3VwZXIoVHlwZS5VTkNIT0tFLCBidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVW5jaG9rZU1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgcmV0dXJuIChVbmNob2tlTWVzc2FnZSkgbmV3IFVuY2hva2VNZXNzYWdlKGJ1ZmZlcikKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVW5jaG9rZU1lc3NhZ2UgY3JhZnQoKSB7CisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBVbmNob2tlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChVbmNob2tlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLlVOQ0hPS0UuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICByZXR1cm4gbmV3IFVuY2hva2VNZXNzYWdlKGJ1ZmZlcik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEludGVyZXN0ZWQgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDAxPjxpZD0yPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmVzdGVkTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAxOworCisgICAgcHJpdmF0ZSBJbnRlcmVzdGVkTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgc3VwZXIoVHlwZS5JTlRFUkVTVEVELCBidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW50ZXJlc3RlZE1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgcmV0dXJuIChJbnRlcmVzdGVkTWVzc2FnZSkgbmV3IEludGVyZXN0ZWRNZXNzYWdlKGJ1ZmZlcikKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW50ZXJlc3RlZE1lc3NhZ2UgY3JhZnQoKSB7CisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBJbnRlcmVzdGVkTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChJbnRlcmVzdGVkTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLklOVEVSRVNURUQuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICByZXR1cm4gbmV3IEludGVyZXN0ZWRNZXNzYWdlKGJ1ZmZlcik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE5vdCBpbnRlcmVzdGVkIG1lc3NhZ2UuCisgICAqCisgICAqIDxsZW49MDAwMT48aWQ9Mz4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm90SW50ZXJlc3RlZE1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gMTsKKworICAgIHByaXZhdGUgTm90SW50ZXJlc3RlZE1lc3NhZ2UoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgIHN1cGVyKFR5cGUuTk9UX0lOVEVSRVNURUQsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOb3RJbnRlcmVzdGVkTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gKE5vdEludGVyZXN0ZWRNZXNzYWdlKSBuZXcgTm90SW50ZXJlc3RlZE1lc3NhZ2UoYnVmZmVyKQorICAgICAgICAgICAgICAudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOb3RJbnRlcmVzdGVkTWVzc2FnZSBjcmFmdCgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIE5vdEludGVyZXN0ZWRNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KE5vdEludGVyZXN0ZWRNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuTk9UX0lOVEVSRVNURUQuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICByZXR1cm4gbmV3IE5vdEludGVyZXN0ZWRNZXNzYWdlKGJ1ZmZlcik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhhdmUgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDA1PjxpZD00PjxwaWVjZSBpbmRleD14eHh4PgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBIYXZlTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSA1OworCisgICAgcHJpdmF0ZSBpbnQgcGllY2U7CisKKyAgICBwcml2YXRlIEhhdmVNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgcGllY2UpIHsKKyAgICAgIHN1cGVyKFR5cGUuSEFWRSwgYnVmZmVyKTsKKyAgICAgIHRoaXMucGllY2UgPSBwaWVjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBpZWNlSW5kZXgoKSB7CisgICAgICByZXR1cm4gdGhpcy5waWVjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSGF2ZU1lc3NhZ2UgdmFsaWRhdGUoVG9ycmVudEluZm8gdG9ycmVudCkKKyAgICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAodGhpcy5waWVjZSA+PSAwICYmIHRoaXMucGllY2UgPCB0b3JyZW50LmdldFBpZWNlQ291bnQoKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSGF2ZU1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgcmV0dXJuIG5ldyBIYXZlTWVzc2FnZShidWZmZXIsIGJ1ZmZlci5nZXRJbnQoKSkKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSGF2ZU1lc3NhZ2UgY3JhZnQoaW50IHBpZWNlKSB7CisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBIYXZlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChIYXZlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLkhBVkUuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICBidWZmZXIucHV0SW50KHBpZWNlKTsKKyAgICAgIHJldHVybiBuZXcgSGF2ZU1lc3NhZ2UoYnVmZmVyLCBwaWVjZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAjIiArIHRoaXMuZ2V0UGllY2VJbmRleCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBCaXRmaWVsZCBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDErWD48aWQ9NT48Yml0ZmllbGQ+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpdGZpZWxkTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAxOworCisgICAgcHJpdmF0ZSBCaXRTZXQgYml0ZmllbGQ7CisKKyAgICBwcml2YXRlIEJpdGZpZWxkTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlciwgQml0U2V0IGJpdGZpZWxkKSB7CisgICAgICBzdXBlcihUeXBlLkJJVEZJRUxELCBidWZmZXIpOworICAgICAgdGhpcy5iaXRmaWVsZCA9IGJpdGZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBCaXRTZXQgZ2V0Qml0ZmllbGQoKSB7CisgICAgICByZXR1cm4gdGhpcy5iaXRmaWVsZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQml0ZmllbGRNZXNzYWdlIHZhbGlkYXRlKFRvcnJlbnRJbmZvIHRvcnJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHRoaXMuYml0ZmllbGQubGVuZ3RoKCkgPD0gdG9ycmVudC5nZXRQaWVjZUNvdW50KCkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJpdGZpZWxkTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgQml0U2V0IGJpdGZpZWxkID0gbmV3IEJpdFNldChidWZmZXIucmVtYWluaW5nKCkgKiA4KTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLnJlbWFpbmluZygpICogODsgaSsrKSB7CisgICAgICAgIGlmICgoYnVmZmVyLmdldChpIC8gOCkgJiAoMSA8PCAoNyAtIChpICUgOCkpKSkgPiAwKSB7CisgICAgICAgICAgYml0ZmllbGQuc2V0KGkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgQml0ZmllbGRNZXNzYWdlKGJ1ZmZlciwgYml0ZmllbGQpCisgICAgICAgICAgICAgIC52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJpdGZpZWxkTWVzc2FnZSBjcmFmdChCaXRTZXQgYXZhaWxhYmxlUGllY2VzKSB7CisgICAgICBpbnQgbGVuID0gYXZhaWxhYmxlUGllY2VzLmxlbmd0aCgpIC8gODsKKyAgICAgIGlmIChhdmFpbGFibGVQaWVjZXMubGVuZ3RoKCkgJSA4ID4gMCkgbGVuKys7CisgICAgICBieXRlW10gYml0ZmllbGQgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgZm9yIChpbnQgaSA9IGF2YWlsYWJsZVBpZWNlcy5uZXh0U2V0Qml0KDApOyBpID49IDA7CisgICAgICAgICAgIGkgPSBhdmFpbGFibGVQaWVjZXMubmV4dFNldEJpdChpICsgMSkpIHsKKyAgICAgICAgYml0ZmllbGRbaSAvIDhdIHw9IDEgPDwgKDcgLSAoaSAlIDgpKTsKKyAgICAgIH0KKworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgQml0ZmllbGRNZXNzYWdlLkJBU0VfU0laRSArIGJpdGZpZWxkLmxlbmd0aCk7CisgICAgICBidWZmZXIucHV0SW50KEJpdGZpZWxkTWVzc2FnZS5CQVNFX1NJWkUgKyBiaXRmaWVsZC5sZW5ndGgpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLkJJVEZJRUxELmdldFR5cGVCeXRlKCkpOworICAgICAgYnVmZmVyLnB1dChCeXRlQnVmZmVyLndyYXAoYml0ZmllbGQpKTsKKyAgICAgIHJldHVybiBuZXcgQml0ZmllbGRNZXNzYWdlKGJ1ZmZlciwgYXZhaWxhYmxlUGllY2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICIgKyB0aGlzLmdldEJpdGZpZWxkKCkuY2FyZGluYWxpdHkoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVxdWVzdCBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDEzPjxpZD02PjxwaWVjZSBpbmRleD48YmxvY2sgb2Zmc2V0PjxibG9jayBsZW5ndGg+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVlc3RNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDEzOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBibG9jayBzaXplIGlzIDJeMTQgYnl0ZXMsIG9yIDE2a0IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRVFVRVNUX1NJWkUgPSAxNjM4NDsKKworICAgIC8qKgorICAgICAqIE1heCBibG9jayByZXF1ZXN0IHNpemUgaXMgMl4xNyBieXRlcywgb3IgMTMxa0IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFUVVFU1RfU0laRSA9IDEzMTA3MjsKKworICAgIHByaXZhdGUgaW50IHBpZWNlOworICAgIHByaXZhdGUgaW50IG9mZnNldDsKKyAgICBwcml2YXRlIGludCBsZW5ndGg7CisgICAgcHJpdmF0ZSBsb25nIG15U2VuZFRpbWU7CisKKyAgICBwcml2YXRlIFJlcXVlc3RNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgcGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICBzdXBlcihUeXBlLlJFUVVFU1QsIGJ1ZmZlcik7CisgICAgICB0aGlzLnBpZWNlID0gcGllY2U7CisgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgbXlTZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGllY2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5waWVjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKKyAgICAgIHJldHVybiB0aGlzLm9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZW5kVGltZSgpIHsKKyAgICAgIHJldHVybiBteVNlbmRUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbmV3KCkgeworICAgICAgbXlTZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0TWVzc2FnZSB2YWxpZGF0ZShUb3JyZW50SW5mbyB0b3JyZW50KQorICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmICh0aGlzLnBpZWNlID49IDAgJiYgdGhpcy5waWVjZSA8IHRvcnJlbnQuZ2V0UGllY2VDb3VudCgpICYmCisgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGggPD0KKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldFBpZWNlU2l6ZSh0aGlzLnBpZWNlKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdE1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaW50IHBpZWNlID0gYnVmZmVyLmdldEludCgpOworICAgICAgaW50IG9mZnNldCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICAgIGludCBsZW5ndGggPSBidWZmZXIuZ2V0SW50KCk7CisgICAgICByZXR1cm4gbmV3IFJlcXVlc3RNZXNzYWdlKGJ1ZmZlciwgcGllY2UsCisgICAgICAgICAgICAgIG9mZnNldCwgbGVuZ3RoKS52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RNZXNzYWdlIGNyYWZ0KGludCBwaWVjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgUmVxdWVzdE1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQoUmVxdWVzdE1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXQoUGVlck1lc3NhZ2UuVHlwZS5SRVFVRVNULmdldFR5cGVCeXRlKCkpOworICAgICAgYnVmZmVyLnB1dEludChwaWVjZSk7CisgICAgICBidWZmZXIucHV0SW50KG9mZnNldCk7CisgICAgICBidWZmZXIucHV0SW50KGxlbmd0aCk7CisgICAgICByZXR1cm4gbmV3IFJlcXVlc3RNZXNzYWdlKGJ1ZmZlciwgcGllY2UsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICMiICsgdGhpcy5nZXRQaWVjZSgpICsKKyAgICAgICAgICAgICAgIiAoIiArIHRoaXMuZ2V0TGVuZ3RoKCkgKyAiQCIgKyB0aGlzLmdldE9mZnNldCgpICsgIikiOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQaWVjZSBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDkrWD48aWQ9Nz48cGllY2UgaW5kZXg+PGJsb2NrIG9mZnNldD48YmxvY2sgZGF0YT4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGllY2VNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDk7CisKKyAgICBwcml2YXRlIGludCBwaWVjZTsKKyAgICBwcml2YXRlIGludCBvZmZzZXQ7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGJsb2NrOworCisgICAgcHJpdmF0ZSBQaWVjZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBwaWVjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBCeXRlQnVmZmVyIGJsb2NrKSB7CisgICAgICBzdXBlcihUeXBlLlBJRUNFLCBidWZmZXIpOworICAgICAgdGhpcy5waWVjZSA9IHBpZWNlOworICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQaWVjZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBpZWNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJsb2NrKCkgeworICAgICAgcmV0dXJuIHRoaXMuYmxvY2s7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBpZWNlTWVzc2FnZSB2YWxpZGF0ZShUb3JyZW50SW5mbyB0b3JyZW50KQorICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmICh0aGlzLnBpZWNlID49IDAgJiYgdGhpcy5waWVjZSA8IHRvcnJlbnQuZ2V0UGllY2VDb3VudCgpICYmCisgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsgdGhpcy5ibG9jay5saW1pdCgpIDw9CisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXRQaWVjZVNpemUodGhpcy5waWVjZSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBpZWNlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaW50IHBpZWNlID0gYnVmZmVyLmdldEludCgpOworICAgICAgaW50IG9mZnNldCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICAgIEJ5dGVCdWZmZXIgYmxvY2sgPSBidWZmZXIuc2xpY2UoKTsKKyAgICAgIHJldHVybiBuZXcgUGllY2VNZXNzYWdlKGJ1ZmZlciwgcGllY2UsIG9mZnNldCwgYmxvY2spCisgICAgICAgICAgICAgIC52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBpZWNlTWVzc2FnZSBjcmFmdChpbnQgcGllY2UsIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgIHJldHVybiBuZXcgUGllY2VNZXNzYWdlKGJ1ZmZlciwgcGllY2UsIG9mZnNldCwgQ29uc3RhbnRzLkVNUFRZX0JVRkZFUik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGNyZWF0ZUJ1ZmZlcldpdGhIZWFkZXJGb3JNZXNzYWdlKGludCBwaWVjZSwgaW50IG9mZnNldCwgaW50IGJsb2NrU2l6ZSkgeworICAgICAgQnl0ZUJ1ZmZlciByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgUGllY2VNZXNzYWdlLkJBU0VfU0laRSArIGJsb2NrU2l6ZSk7CisgICAgICByZXN1bHQucHV0SW50KFBpZWNlTWVzc2FnZS5CQVNFX1NJWkUgKyBibG9ja1NpemUpOworICAgICAgcmVzdWx0LnB1dChQZWVyTWVzc2FnZS5UeXBlLlBJRUNFLmdldFR5cGVCeXRlKCkpOworICAgICAgcmVzdWx0LnB1dEludChwaWVjZSk7CisgICAgICByZXN1bHQucHV0SW50KG9mZnNldCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIyIgKyB0aGlzLmdldFBpZWNlKCkgKworICAgICAgICAgICAgICAiICgiICsgdGhpcy5nZXRCbG9jaygpLmNhcGFjaXR5KCkgKyAiQCIgKyB0aGlzLmdldE9mZnNldCgpICsgIikiOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYW5jZWwgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDAxMz48aWQ9OD48cGllY2UgaW5kZXg+PGJsb2NrIG9mZnNldD48YmxvY2sgbGVuZ3RoPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDYW5jZWxNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDEzOworCisgICAgcHJpdmF0ZSBpbnQgcGllY2U7CisgICAgcHJpdmF0ZSBpbnQgb2Zmc2V0OworICAgIHByaXZhdGUgaW50IGxlbmd0aDsKKworICAgIHByaXZhdGUgQ2FuY2VsTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IHBpZWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICBzdXBlcihUeXBlLkNBTkNFTCwgYnVmZmVyKTsKKyAgICAgIHRoaXMucGllY2UgPSBwaWVjZTsKKyAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQaWVjZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBpZWNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDYW5jZWxNZXNzYWdlIHZhbGlkYXRlKFRvcnJlbnRJbmZvIHRvcnJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHRoaXMucGllY2UgPj0gMCAmJiB0aGlzLnBpZWNlIDwgdG9ycmVudC5nZXRQaWVjZUNvdW50KCkgJiYKKyAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aCA8PQorICAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0UGllY2VTaXplKHRoaXMucGllY2UpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDYW5jZWxNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaW50IHBpZWNlID0gYnVmZmVyLmdldEludCgpOworICAgICAgaW50IG9mZnNldCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICAgIGludCBsZW5ndGggPSBidWZmZXIuZ2V0SW50KCk7CisgICAgICByZXR1cm4gbmV3IENhbmNlbE1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwKKyAgICAgICAgICAgICAgb2Zmc2V0LCBsZW5ndGgpLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2FuY2VsTWVzc2FnZSBjcmFmdChpbnQgcGllY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIENhbmNlbE1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQoQ2FuY2VsTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLkNBTkNFTC5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQocGllY2UpOworICAgICAgYnVmZmVyLnB1dEludChvZmZzZXQpOworICAgICAgYnVmZmVyLnB1dEludChsZW5ndGgpOworICAgICAgcmV0dXJuIG5ldyBDYW5jZWxNZXNzYWdlKGJ1ZmZlciwgcGllY2UsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICMiICsgdGhpcy5nZXRQaWVjZSgpICsKKyAgICAgICAgICAgICAgIiAoIiArIHRoaXMuZ2V0TGVuZ3RoKCkgKyAiQCIgKyB0aGlzLmdldE9mZnNldCgpICsgIikiOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9UcmFja2VyTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9UcmFja2VyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjU4MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1RyYWNrZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCisvKioKKyAqIEJpdFRvcnJlbnQgdHJhY2tlciBwcm90b2NvbCBtZXNzYWdlcyByZXByZXNlbnRhdGlvbnMuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGFuZCBpdHMgPGVtPipUcmFja2VyTWVzc2FnZTwvZW0+IHN1YmNsYXNzZXMgcHJvdmlkZSBQT0pPCisgKiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIHRyYWNrZXIgcHJvdG9jb2wgbWVzc2FnZXMsIGZvciBhdCBsZWFzdCBIVFRQIGFuZCBVRFAKKyAqIHRyYWNrZXJzJyBwcm90b2NvbHMsIGFsb25nIHdpdGggZWFzeSBwYXJzaW5nIGZyb20gYW4gaW5wdXQgQnl0ZUJ1ZmZlciB0bworICogcXVpY2tseSBnZXQgYSB1c2FibGUgcmVwcmVzZW50YXRpb24gb2YgYW4gaW5jb21pbmcgbWVzc2FnZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYWNrZXJNZXNzYWdlIHsKKworICAvKioKKyAgICogTWVzc2FnZSB0eXBlLgorICAgKi8KKyAgcHVibGljIGVudW0gVHlwZSB7CisgICAgVU5LTk9XTigtMSksCisgICAgQ09OTkVDVF9SRVFVRVNUKDApLAorICAgIENPTk5FQ1RfUkVTUE9OU0UoMCksCisgICAgQU5OT1VOQ0VfUkVRVUVTVCgxKSwKKyAgICBBTk5PVU5DRV9SRVNQT05TRSgxKSwKKyAgICBTQ1JBUEVfUkVRVUVTVCgyKSwKKyAgICBTQ1JBUEVfUkVTUE9OU0UoMiksCisgICAgRVJST1IoMyk7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBpZDsKKworICAgIFR5cGUoaW50IGlkKSB7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBiYXNlIHRyYWNrZXIgbWVzc2FnZSB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gdHlwZSBUaGUgbWVzc2FnZSB0eXBlLgorICAgKiBAcGFyYW0gZGF0YSBBIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJpbmFyeSBkYXRhIG9mIHRoZSBtZXNzYWdlIChhCisgICAqICAgICAgICAgICAgIEItZW5jb2RlZCBtYXAsIGEgVURQIHBhY2tldCBkYXRhLCBldGMuKS4KKyAgICovCisgIHByb3RlY3RlZCBUcmFja2VyTWVzc2FnZShUeXBlIHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHsKKyAgICAgIHRoaXMuZGF0YS5yZXdpbmQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHRyYWNrZXIgbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHRoaXMudHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBlbmNvZGVkIGJpbmFyeSBkYXRhIGZvciB0aGlzIG1lc3NhZ2UuCisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXREYXRhKCkgeworICAgIHJldHVybiB0aGlzLmRhdGE7CisgIH0KKworICAvKioKKyAgICogR2VuZXJpYyBleGNlcHRpb24gZm9yIG1lc3NhZ2UgZm9ybWF0IGFuZCBtZXNzYWdlIHZhbGlkYXRpb24gZXhjZXB0aW9ucy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOworCisgICAgcHVibGljIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgc3VwZXIocywgY2F1c2UpOworICAgIH0KKworICB9CisKKworICAvKioKKyAgICogQmFzZSBpbnRlcmZhY2UgZm9yIGNvbm5lY3Rpb24gcmVxdWVzdCBtZXNzYWdlcy4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHN1YnR5cGVzIG9mIGNvbm5lY3Rpb24gcmVxdWVzdAorICAgKiBtZXNzYWdlcyBmb3IgdGhlIHZhcmlvdXMgdHJhY2tlciBwcm90b2NvbHMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQGF1dGhvciBtcGV0YXp6b25pCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25SZXF1ZXN0TWVzc2FnZSB7CisKKyAgfQorCisKKyAgLyoqCisgICAqIEJhc2UgaW50ZXJmYWNlIGZvciBjb25uZWN0aW9uIHJlc3BvbnNlIG1lc3NhZ2VzLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3VidHlwZXMgb2YgY29ubmVjdGlvbgorICAgKiByZXNwb25zZSBtZXNzYWdlcyBmb3IgdGhlIHZhcmlvdXMgdHJhY2tlciBwcm90b2NvbHMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQGF1dGhvciBtcGV0YXp6b25pCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25SZXNwb25zZU1lc3NhZ2UgeworCisgIH0KKworCisgIC8qKgorICAgKiBCYXNlIGludGVyZmFjZSBmb3IgdHJhY2tlciBlcnJvciBtZXNzYWdlcy4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHN1YnR5cGVzIG9mIHRyYWNrZXIgZXJyb3IKKyAgICogbWVzc2FnZXMgZm9yIHRoZSB2YXJpb3VzIHRyYWNrZXIgcHJvdG9jb2xzLgorICAgKiA8L3A+CisgICAqCisgICAqIEBhdXRob3IgbXBldGF6em9uaQorICAgKi8KKyAgcHVibGljIGludGVyZmFjZSBFcnJvck1lc3NhZ2UgeworCisgICAgLyoqCisgICAgICogVGhlIHZhcmlvdXMgdHJhY2tlciBlcnJvciBzdGF0ZXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGVzZSBlcnJvcnMgYXJlIHJlcG9ydGVkIGJ5IHRoZSB0cmFja2VyIHRvIGEgY2xpZW50IHdoZW4gZXhwZWN0ZWQKKyAgICAgKiBwYXJhbWV0ZXJzIG9yIGNvbmRpdGlvbnMgYXJlIG5vdCBwcmVzZW50IHdoaWxlIHByb2Nlc3NpbmcgYW4KKyAgICAgKiBhbm5vdW5jZSByZXF1ZXN0IGZyb20gYSBCaXRUb3JyZW50IGNsaWVudC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgZW51bSBGYWlsdXJlUmVhc29uIHsKKyAgICAgIFVOS05PV05fVE9SUkVOVCgiVGhlIHJlcXVlc3RlZCB0b3JyZW50IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgdHJhY2tlciIpLAorICAgICAgTUlTU0lOR19IQVNIKCJNaXNzaW5nIGluZm8gaGFzaCIpLAorICAgICAgTUlTU0lOR19QRUVSX0lEKCJNaXNzaW5nIHBlZXIgSUQiKSwKKyAgICAgIE1JU1NJTkdfUE9SVCgiTWlzc2luZyBwb3J0IiksCisgICAgICBJTlZBTElEX0VWRU5UKCJVbmV4cGVjdGVkIGV2ZW50IGZvciBwZWVyIHN0YXRlIiksCisgICAgICBOT1RfSU1QTEVNRU5URUQoIkZlYXR1cmUgbm90IGltcGxlbWVudGVkIik7CisKKyAgICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAgIEZhaWx1cmVSZWFzb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlOworICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBnZXRSZWFzb24oKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjUxODUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDMxMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogVGhlIGFubm91bmNlIHJlcXVlc3QgbWVzc2FnZSBmb3IgdGhlIEhUVFAgdHJhY2tlciBwcm90b2NvbC4KKyAqIGFubm91bmNl6K+35rGC5YyF5ZCr55qE5L+h5oGvCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlIGluIHRoZSBIVFRQIHRyYWNrZXIKKyAqIHByb3RvY29sLiBJdCBkb2Vzbid0IGFkZCBhbnkgc3BlY2lmaWMgZmllbGRzIGNvbXBhcmVkIHRvIHRoZSBnZW5lcmljCisgKiBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2UsIGJ1dCBpdCBwcm92aWRlcyB0aGUgbWVhbnMgdG8gcGFyc2Ugc3VjaAorICogbWVzc2FnZXMgYW5kIGNyYWZ0IHRoZW0uCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBleHRlbmRzIEhUVFBUcmFja2VyTWVzc2FnZQorICAgICAgICBpbXBsZW1lbnRzIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgeworCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGluZm9IYXNoOworICBwcml2YXRlIGZpbmFsIFBlZXIgcGVlcjsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHVwbG9hZGVkOworICBwcml2YXRlIGZpbmFsIGxvbmcgZG93bmxvYWRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGxlZnQ7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wYWN0OworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbm9QZWVySWQ7CisgIHByaXZhdGUgZmluYWwgUmVxdWVzdEV2ZW50IGV2ZW50OworICBwcml2YXRlIGZpbmFsIGludCBudW1XYW50OworCisgIHByaXZhdGUgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBpbmZvSGFzaCwgUGVlciBwZWVyLCBsb25nIHVwbG9hZGVkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZWZ0LCBib29sZWFuIGNvbXBhY3QsIGJvb2xlYW4gbm9QZWVySWQsIFJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtV2FudCkgeworICAgIHN1cGVyKFR5cGUuQU5OT1VOQ0VfUkVRVUVTVCwgZGF0YSk7CisgICAgdGhpcy5pbmZvSGFzaCA9IGluZm9IYXNoOworICAgIHRoaXMucGVlciA9IHBlZXI7CisgICAgdGhpcy5kb3dubG9hZGVkID0gZG93bmxvYWRlZDsKKyAgICB0aGlzLnVwbG9hZGVkID0gdXBsb2FkZWQ7CisgICAgdGhpcy5sZWZ0ID0gbGVmdDsKKyAgICB0aGlzLmNvbXBhY3QgPSBjb21wYWN0OworICAgIHRoaXMubm9QZWVySWQgPSBub1BlZXJJZDsKKyAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CisgICAgdGhpcy5udW1XYW50ID0gbnVtV2FudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiB0aGlzLmluZm9IYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyh0aGlzLmluZm9IYXNoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyLmdldFBlZXJJZEFycmF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlci5nZXRIZXhQZWVySWQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlci5nZXRQb3J0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMudXBsb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0RG93bmxvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5kb3dubG9hZGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldExlZnQoKSB7CisgICAgcmV0dXJuIHRoaXMubGVmdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhY3QoKSB7CisgICAgcmV0dXJuIHRoaXMuY29tcGFjdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBjYW5PbWl0UGVlcklkKCkgeworICAgIHJldHVybiB0aGlzLm5vUGVlcklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXF1ZXN0RXZlbnQgZ2V0RXZlbnQoKSB7CisgICAgcmV0dXJuIHRoaXMuZXZlbnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyLmdldElwKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXROdW1XYW50KCkgeworICAgIHJldHVybiB0aGlzLm51bVdhbnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhY2tlcklkKCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZCB0aGUgYW5ub3VuY2UgcmVxdWVzdCBVUkwgZm9yIHRoZSBnaXZlbiB0cmFja2VyIGFubm91bmNlIFVSTC4KKyAgICoKKyAgICogQHBhcmFtIHRyYWNrZXJBbm5vdW5jZVVSTCBUaGUgdHJhY2tlcidzIGFubm91bmNlIFVSTC4KKyAgICogQHJldHVybiBUaGUgVVJMIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFubm91bmNlIHJlcXVlc3QgVVJMLgorICAgKi8KKyAgIC8vIOaehOmAoCBhbm5vdW5jZeivt+axgueahHVybAorICBwdWJsaWMgVVJMIGJ1aWxkQW5ub3VuY2VVUkwoVVJMIHRyYWNrZXJBbm5vdW5jZVVSTCkKKyAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgYmFzZSA9IHRyYWNrZXJBbm5vdW5jZVVSTC50b1N0cmluZygpOworICAgIFN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoYmFzZSk7CisgICAgdXJsLmFwcGVuZChiYXNlLmNvbnRhaW5zKCI/IikgPyAiJiIgOiAiPyIpCisgICAgICAgICAgICAuYXBwZW5kKCJpbmZvX2hhc2g9IikKKyAgICAgICAgICAgIC5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcodGhpcy5nZXRJbmZvSGFzaCgpLCBDb25zdGFudHMuQllURV9FTkNPRElORyksCisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiZwZWVyX2lkPSIpCisgICAgICAgICAgICAuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHRoaXMuZ2V0UGVlcklkKCksIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKQorICAgICAgICAgICAgLmFwcGVuZCgiJnBvcnQ9IikuYXBwZW5kKHRoaXMuZ2V0UG9ydCgpKQorICAgICAgICAgICAgLmFwcGVuZCgiJnVwbG9hZGVkPSIpLmFwcGVuZCh0aGlzLmdldFVwbG9hZGVkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCImZG93bmxvYWRlZD0iKS5hcHBlbmQodGhpcy5nZXREb3dubG9hZGVkKCkpCisgICAgICAgICAgICAuYXBwZW5kKCImbGVmdD0iKS5hcHBlbmQodGhpcy5nZXRMZWZ0KCkpCisgICAgICAgICAgICAuYXBwZW5kKCImY29tcGFjdD0iKS5hcHBlbmQodGhpcy5pc0NvbXBhY3QoKSA/IDEgOiAwKQorICAgICAgICAgICAgLmFwcGVuZCgiJm5vX3BlZXJfaWQ9IikuYXBwZW5kKHRoaXMuY2FuT21pdFBlZXJJZCgpID8gMSA6IDApOworCisgICAgaWYgKHRoaXMuZ2V0RXZlbnQoKSAhPSBudWxsICYmCisgICAgICAgICAgICAhUmVxdWVzdEV2ZW50Lk5PTkUuZXF1YWxzKHRoaXMuZ2V0RXZlbnQoKSkpIHsKKyAgICAgIHVybC5hcHBlbmQoIiZldmVudD0iKS5hcHBlbmQodGhpcy5nZXRFdmVudCgpLmdldEV2ZW50TmFtZSgpKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5nZXRJcCgpICE9IG51bGwpIHsKKyAgICAgIHVybC5hcHBlbmQoIiZpcD0iKS5hcHBlbmQodGhpcy5nZXRJcCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVSTCh1cmwudG9TdHJpbmcoKSk7CisgIH0KKworICAvLyDop6PmnpDvvIhwYXJzZe+8iXRyYWNrZXLor7fmsYIKKyAgLy8g5bCGVHJhY2tlcuaUtuWIsOeahELnvJbnoIHor7fmsYLmlbDmja7op6PmnpDkuLrnu5PmnoTljJbmtojmga/lr7nosaHjgIIKKyAgcHVibGljIHN0YXRpYyBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBwYXJzZShCRVZhbHVlIGRlY29kZWQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKGRlY29kZWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSB0cmFja2VyIG1lc3NhZ2UgKG5vdCBCLWVuY29kZWQ/KSEiKTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBkZWNvZGVkLmdldE1hcCgpOworCisgICAgaWYgKCFwYXJhbXMuY29udGFpbnNLZXkoImluZm9faGFzaCIpKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgIEVycm9yTWVzc2FnZS5GYWlsdXJlUmVhc29uLk1JU1NJTkdfSEFTSC5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGlmICghcGFyYW1zLmNvbnRhaW5zS2V5KCJwZWVyX2lkIikpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlLkZhaWx1cmVSZWFzb24uTUlTU0lOR19QRUVSX0lELmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgaWYgKCFwYXJhbXMuY29udGFpbnNLZXkoInBvcnQiKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UuRmFpbHVyZVJlYXNvbi5NSVNTSU5HX1BPUlQuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGluZm9IYXNoID0gcGFyYW1zLmdldCgiaW5mb19oYXNoIikuZ2V0Qnl0ZXMoKTsKKyAgICAgIGJ5dGVbXSBwZWVySWQgPSBwYXJhbXMuZ2V0KCJwZWVyX2lkIikuZ2V0Qnl0ZXMoKTsKKyAgICAgIGludCBwb3J0ID0gcGFyYW1zLmdldCgicG9ydCIpLmdldEludCgpOworCisgICAgICAvLyBEZWZhdWx0ICd1cGxvYWRlZCcgYW5kICdkb3dubG9hZGVkJyB0byAwIGlmIHRoZSBjbGllbnQgZG9lcworICAgICAgLy8gbm90IHByb3ZpZGUgaXQgKGFsdGhvdWdoIGl0IHNob3VsZCwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjKS4KKyAgICAgIGxvbmcgdXBsb2FkZWQgPSAwOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgidXBsb2FkZWQiKSkgeworICAgICAgICB1cGxvYWRlZCA9IHBhcmFtcy5nZXQoInVwbG9hZGVkIikuZ2V0TG9uZygpOworICAgICAgfQorCisgICAgICBsb25nIGRvd25sb2FkZWQgPSAwOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgiZG93bmxvYWRlZCIpKSB7CisgICAgICAgIGRvd25sb2FkZWQgPSBwYXJhbXMuZ2V0KCJkb3dubG9hZGVkIikuZ2V0TG9uZygpOworICAgICAgfQorCisgICAgICAvLyBEZWZhdWx0ICdsZWZ0JyB0byAtMSB0byBhdm9pZCBwZWVycyBlbnRlcmluZyB0aGUgQ09NUExFVEVECisgICAgICAvLyBzdGF0ZSB3aGVuIHRoZXkgZG9uJ3QgcHJvdmlkZSB0aGUgJ2xlZnQnIHBhcmFtZXRlci4KKyAgICAgIGxvbmcgbGVmdCA9IC0xOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgibGVmdCIpKSB7CisgICAgICAgIGxlZnQgPSBwYXJhbXMuZ2V0KCJsZWZ0IikuZ2V0TG9uZygpOworICAgICAgfQorCisgICAgICBib29sZWFuIGNvbXBhY3QgPSBmYWxzZTsKKyAgICAgIGlmIChwYXJhbXMuY29udGFpbnNLZXkoImNvbXBhY3QiKSkgeworICAgICAgICBjb21wYWN0ID0gcGFyYW1zLmdldCgiY29tcGFjdCIpLmdldEludCgpID09IDE7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gbm9QZWVySWQgPSBmYWxzZTsKKyAgICAgIGlmIChwYXJhbXMuY29udGFpbnNLZXkoIm5vX3BlZXJfaWQiKSkgeworICAgICAgICBub1BlZXJJZCA9IHBhcmFtcy5nZXQoIm5vX3BlZXJfaWQiKS5nZXRJbnQoKSA9PSAxOworICAgICAgfQorCisgICAgICBpbnQgbnVtV2FudCA9IEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuREVGQVVMVF9OVU1fV0FOVDsKKyAgICAgIGlmIChwYXJhbXMuY29udGFpbnNLZXkoIm51bXdhbnQiKSkgeworICAgICAgICBudW1XYW50ID0gcGFyYW1zLmdldCgibnVtd2FudCIpLmdldEludCgpOworICAgICAgfQorCisgICAgICBTdHJpbmcgaXAgPSBudWxsOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgiaXAiKSkgeworICAgICAgICBpcCA9IHBhcmFtcy5nZXQoImlwIikuZ2V0U3RyaW5nKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKTsKKyAgICAgIH0KKworICAgICAgUmVxdWVzdEV2ZW50IGV2ZW50ID0gUmVxdWVzdEV2ZW50Lk5PTkU7CisgICAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KCJldmVudCIpKSB7CisgICAgICAgIGV2ZW50ID0gUmVxdWVzdEV2ZW50LmdldEJ5TmFtZShwYXJhbXMuZ2V0KCJldmVudCIpCisgICAgICAgICAgICAgICAgLmdldFN0cmluZyhDb25zdGFudHMuQllURV9FTkNPRElORykpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlKENvbnN0YW50cy5FTVBUWV9CVUZGRVIsIGluZm9IYXNoLAorICAgICAgICAgICAgICBuZXcgUGVlcihpcCwgcG9ydCwgQnl0ZUJ1ZmZlci53cmFwKHBlZXJJZCkpLAorICAgICAgICAgICAgICB1cGxvYWRlZCwgZG93bmxvYWRlZCwgbGVmdCwgY29tcGFjdCwgbm9QZWVySWQsCisgICAgICAgICAgICAgIGV2ZW50LCBudW1XYW50KTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGliZWUpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCB0cmFja2VyIHJlcXVlc3QhIiwgaWJlZSk7CisgICAgfQorICB9CisKKyAgLy8g5Yib5bu65L+h5oGvCisgIC8v5bCGSmF2Yeexu+Wei+WPguaVsOi9rOaNouS4ukLnvJbnoIHlrZflhbgKKyAgcHVibGljIHN0YXRpYyBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBjcmFmdChieXRlW10gaW5mb0hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBlZXJJZCwgaW50IHBvcnQsIGxvbmcgdXBsb2FkZWQsIGxvbmcgZG93bmxvYWRlZCwgbG9uZyBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY29tcGFjdCwgYm9vbGVhbiBub1BlZXJJZCwgUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpcCwgaW50IG51bVdhbnQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgcGFyYW1zLnB1dCgiaW5mb19oYXNoIiwgbmV3IEJFVmFsdWUoaW5mb0hhc2gpKTsKKyAgICBwYXJhbXMucHV0KCJwZWVyX2lkIiwgbmV3IEJFVmFsdWUocGVlcklkKSk7CisgICAgcGFyYW1zLnB1dCgicG9ydCIsIG5ldyBCRVZhbHVlKHBvcnQpKTsKKyAgICBwYXJhbXMucHV0KCJ1cGxvYWRlZCIsIG5ldyBCRVZhbHVlKHVwbG9hZGVkKSk7CisgICAgcGFyYW1zLnB1dCgiZG93bmxvYWRlZCIsIG5ldyBCRVZhbHVlKGRvd25sb2FkZWQpKTsKKyAgICBwYXJhbXMucHV0KCJsZWZ0IiwgbmV3IEJFVmFsdWUobGVmdCkpOworICAgIHBhcmFtcy5wdXQoImNvbXBhY3QiLCBuZXcgQkVWYWx1ZShjb21wYWN0ID8gMSA6IDApKTsKKyAgICBwYXJhbXMucHV0KCJub19wZWVyX2lkIiwgbmV3IEJFVmFsdWUobm9QZWVySWQgPyAxIDogMCkpOworCisgICAgaWYgKGV2ZW50ICE9IG51bGwpIHsKKyAgICAgIHBhcmFtcy5wdXQoImV2ZW50IiwKKyAgICAgICAgICAgICAgbmV3IEJFVmFsdWUoZXZlbnQuZ2V0RXZlbnROYW1lKCksIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfQorCisgICAgaWYgKGlwICE9IG51bGwpIHsKKyAgICAgIHBhcmFtcy5wdXQoImlwIiwKKyAgICAgICAgICAgICAgbmV3IEJFVmFsdWUoaXAsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfQorCisgICAgaWYgKG51bVdhbnQgIT0gQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5ERUZBVUxUX05VTV9XQU5UKSB7CisgICAgICBwYXJhbXMucHV0KCJudW13YW50IiwgbmV3IEJFVmFsdWUobnVtV2FudCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UoCisgICAgICAgICAgICBCRW5jb2Rlci5iZW5jb2RlKHBhcmFtcyksCisgICAgICAgICAgICBpbmZvSGFzaCwgbmV3IFBlZXIoaXAsIHBvcnQsIEJ5dGVCdWZmZXIud3JhcChwZWVySWQpKSwKKyAgICAgICAgICAgIHVwbG9hZGVkLCBkb3dubG9hZGVkLCBsZWZ0LCBjb21wYWN0LCBub1BlZXJJZCwgZXZlbnQsIG51bVdhbnQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiNWVmYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlc3BvbnNlTWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLio7CisKKworLyoqCisgKiBUaGUgYW5ub3VuY2UgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIGFuIEhUVFAgdHJhY2tlci4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBleHRlbmRzIEhUVFBUcmFja2VyTWVzc2FnZQorICAgICAgICBpbXBsZW1lbnRzIEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHsKKworICBwcml2YXRlIGZpbmFsIGludCBpbnRlcnZhbDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgY29tcGxldGU7CisgIHByaXZhdGUgZmluYWwgaW50IGluY29tcGxldGU7CisgIHByaXZhdGUgZmluYWwgTGlzdDxQZWVyPiBwZWVyczsKKyAgcHJpdmF0ZSBTdHJpbmcgaGV4SW5mb0hhc2g7CisKKyAgcHJpdmF0ZSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJ2YWwsIGludCBjb21wbGV0ZSwgaW50IGluY29tcGxldGUsIExpc3Q8UGVlcj4gcGVlcnMpIHsKKyAgICBzdXBlcihUeXBlLkFOTk9VTkNFX1JFU1BPTlNFLCBkYXRhKTsKKyAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOworICAgIHRoaXMuaW5jb21wbGV0ZSA9IGluY29tcGxldGU7CisgICAgdGhpcy5wZWVycyA9IHBlZXJzOworICB9CisKKyAgcHJpdmF0ZSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJ2YWwsIGludCBjb21wbGV0ZSwgaW50IGluY29tcGxldGUsIExpc3Q8UGVlcj4gcGVlcnMsIFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIHRoaXMoZGF0YSwgaW50ZXJ2YWwsIGNvbXBsZXRlLCBpbmNvbXBsZXRlLCBwZWVycyk7CisgICAgdGhpcy5oZXhJbmZvSGFzaCA9IGhleEluZm9IYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW50ZXJ2YWwoKSB7CisgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRDb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5jb21wbGV0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEluY29tcGxldGUoKSB7CisgICAgcmV0dXJuIHRoaXMuaW5jb21wbGV0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxQZWVyPiBnZXRQZWVycygpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIHRoaXMuaGV4SW5mb0hhc2g7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBwYXJzZShCRVZhbHVlIGRlY29kZWQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKGRlY29kZWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSB0cmFja2VyIG1lc3NhZ2UgKG5vdCBCLWVuY29kZWQ/KSEiKTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBkZWNvZGVkLmdldE1hcCgpOworCisgICAgaWYgKHBhcmFtcy5nZXQoImludGVydmFsIikgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJUcmFja2VyIG1lc3NhZ2UgbWlzc2luZyBtYW5kYXRvcnkgZmllbGQgJ2ludGVydmFsJyEiKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgTGlzdDxQZWVyPiBwZWVyczsKKworICAgICAgdHJ5IHsKKyAgICAgICAgLy8gRmlyc3QgYXR0ZW1wdCB0byBkZWNvZGUgYSBjb21wYWN0IHJlc3BvbnNlLCBzaW5jZSB3ZSBhc2tlZAorICAgICAgICAvLyBmb3IgaXQuCisgICAgICAgIHBlZXJzID0gdG9QZWVyTGlzdChwYXJhbXMuZ2V0KCJwZWVycyIpLmdldEJ5dGVzKCkpOworICAgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBpYmVlKSB7CisgICAgICAgIC8vIEZhbGwgYmFjayB0byBwZWVyIGxpc3QsIG5vbi1jb21wYWN0IHJlc3BvbnNlLCBpbiBjYXNlIHRoZQorICAgICAgICAvLyB0cmFja2VyIGRpZCBub3Qgc3VwcG9ydCBjb21wYWN0IHJlc3BvbnNlcy4KKyAgICAgICAgcGVlcnMgPSB0b1BlZXJMaXN0KHBhcmFtcy5nZXQoInBlZXJzIikuZ2V0TGlzdCgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFtcy5nZXQoInRvcnJlbnRJZGVudGlmaWVyIikgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbmV3IEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZShDb25zdGFudHMuRU1QVFlfQlVGRkVSLAorICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoImludGVydmFsIikuZ2V0SW50KCksCisgICAgICAgICAgICAgICAgcGFyYW1zLmdldCgiY29tcGxldGUiKSAhPSBudWxsID8gcGFyYW1zLmdldCgiY29tcGxldGUiKS5nZXRJbnQoKSA6IDAsCisgICAgICAgICAgICAgICAgcGFyYW1zLmdldCgiaW5jb21wbGV0ZSIpICE9IG51bGwgPyBwYXJhbXMuZ2V0KCJpbmNvbXBsZXRlIikuZ2V0SW50KCkgOiAwLAorICAgICAgICAgICAgICAgIHBlZXJzLCBwYXJhbXMuZ2V0KCJ0b3JyZW50SWRlbnRpZmllciIpLmdldFN0cmluZygpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKENvbnN0YW50cy5FTVBUWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgcGFyYW1zLmdldCgiaW50ZXJ2YWwiKS5nZXRJbnQoKSwKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0KCJjb21wbGV0ZSIpICE9IG51bGwgPyBwYXJhbXMuZ2V0KCJjb21wbGV0ZSIpLmdldEludCgpIDogMCwKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0KCJpbmNvbXBsZXRlIikgIT0gbnVsbCA/IHBhcmFtcy5nZXQoImluY29tcGxldGUiKS5nZXRJbnQoKSA6IDAsCisgICAgICAgICAgICAgICAgcGVlcnMpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gaWJlZSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHJlc3BvbnNlICIgKworICAgICAgICAgICAgICAiZnJvbSB0cmFja2VyISIsIGliZWUpOworICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHBlZXIgIiArCisgICAgICAgICAgICAgICJpbiB0cmFja2VyIHJlc3BvbnNlISIsIHVoZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEJ1aWxkIGEgcGVlciBsaXN0IGFzIGEgbGlzdCBvZiB7QGxpbmsgUGVlcn1zIGZyb20gdGhlCisgICAqIGFubm91bmNlIHJlc3BvbnNlJ3MgcGVlciBsaXN0IChpbiBub24tY29tcGFjdCBtb2RlKS4KKyAgICoKKyAgICogQHBhcmFtIHBlZXJzIFRoZSBsaXN0IG9mIHtAbGluayBCRVZhbHVlfXMgZGljdGlvbmFyaWVzIGRlc2NyaWJpbmcgdGhlCisgICAqICAgICAgICAgICAgICBwZWVycyBmcm9tIHRoZSBhbm5vdW5jZSByZXNwb25zZS4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUGVlcn1zIHJlcHJlc2VudGluZyB0aGUKKyAgICogcGVlcnMnIGFkZHJlc3Nlcy4gUGVlciBJRHMgYXJlIGxvc3QsIGJ1dCB0aGV5IGFyZSBub3QgY3J1Y2lhbC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIExpc3Q8UGVlcj4gdG9QZWVyTGlzdChMaXN0PEJFVmFsdWU+IHBlZXJzKQorICAgICAgICAgIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBMaXN0PFBlZXI+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PFBlZXI+KCk7CisKKyAgICBmb3IgKEJFVmFsdWUgcGVlciA6IHBlZXJzKSB7CisgICAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwZWVySW5mbyA9IHBlZXIuZ2V0TWFwKCk7CisgICAgICByZXN1bHQuYWRkKG5ldyBQZWVyKAorICAgICAgICAgICAgICBwZWVySW5mby5nZXQoImlwIikuZ2V0U3RyaW5nKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICAgcGVlckluZm8uZ2V0KCJwb3J0IikuZ2V0SW50KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkIGEgcGVlciBsaXN0IGFzIGEgbGlzdCBvZiB7QGxpbmsgUGVlcn1zIGZyb20gdGhlCisgICAqIGFubm91bmNlIHJlc3BvbnNlJ3MgYmluYXJ5IGNvbXBhY3QgcGVlciBsaXN0LgorICAgKgorICAgKiBAcGFyYW0gZGF0YSBUaGUgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBjb21wYWN0IHBlZXIgbGlzdCBmcm9tIHRoZQorICAgKiAgICAgICAgICAgICBhbm5vdW5jZSByZXNwb25zZS4KKyAgICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUGVlcn1zIHJlcHJlc2VudGluZyB0aGUKKyAgICogcGVlcnMnIGFkZHJlc3Nlcy4gUGVlciBJRHMgYXJlIGxvc3QsIGJ1dCB0aGV5IGFyZSBub3QgY3J1Y2lhbC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIExpc3Q8UGVlcj4gdG9QZWVyTGlzdChieXRlW10gZGF0YSkKKyAgICAgICAgICB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgIGlmIChkYXRhLmxlbmd0aCAlIDYgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkludmFsaWQgcGVlcnMgIiArCisgICAgICAgICAgICAgICJiaW5hcnkgaW5mb3JtYXRpb24gc3RyaW5nISIpOworICAgIH0KKworICAgIExpc3Q8UGVlcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8UGVlcj4oKTsKKyAgICBCeXRlQnVmZmVyIHBlZXJzID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCAvIDY7IGkrKykgeworICAgICAgYnl0ZVtdIGlwQnl0ZXMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgIHBlZXJzLmdldChpcEJ5dGVzKTsKKyAgICAgIEluZXRBZGRyZXNzIGlwID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGlwQnl0ZXMpOworICAgICAgaW50IHBvcnQgPQorICAgICAgICAgICAgICAoMHhGRiAmIChpbnQpIHBlZXJzLmdldCgpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAoMHhGRiAmIChpbnQpIHBlZXJzLmdldCgpKTsKKyAgICAgIHJlc3VsdC5hZGQobmV3IFBlZXIobmV3IEluZXRTb2NrZXRBZGRyZXNzKGlwLCBwb3J0KSkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQ3JhZnQgYSBjb21wYWN0IGFubm91bmNlIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBhIHRvcnJlbnQgaWRlbnRpZmllci4KKyAgICoKKyAgICogQHBhcmFtIGludGVydmFsCisgICAqIEBwYXJhbSBjb21wbGV0ZQorICAgKiBAcGFyYW0gaW5jb21wbGV0ZQorICAgKiBAcGFyYW0gcGVlcnMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIGNyYWZ0KGludCBpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQZWVyPiBwZWVycywgU3RyaW5nIGhleEluZm9IYXNoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHJlc3BvbnNlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIHJlc3BvbnNlLnB1dCgiaW50ZXJ2YWwiLCBuZXcgQkVWYWx1ZShpbnRlcnZhbCkpOworICAgIHJlc3BvbnNlLnB1dCgiY29tcGxldGUiLCBuZXcgQkVWYWx1ZShjb21wbGV0ZSkpOworICAgIHJlc3BvbnNlLnB1dCgiaW5jb21wbGV0ZSIsIG5ldyBCRVZhbHVlKGluY29tcGxldGUpKTsKKyAgICBpZiAoaGV4SW5mb0hhc2ggIT0gbnVsbCkgeworICAgICAgcmVzcG9uc2UucHV0KCJ0b3JyZW50SWRlbnRpZmllciIsIG5ldyBCRVZhbHVlKGhleEluZm9IYXNoKSk7CisgICAgfQorCisgICAgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShwZWVycy5zaXplKCkgKiA2KTsKKyAgICBmb3IgKFBlZXIgcGVlciA6IHBlZXJzKSB7CisgICAgICBieXRlW10gaXAgPSBwZWVyLmdldFJhd0lwKCk7CisgICAgICBpZiAoaXAgPT0gbnVsbCB8fCBpcC5sZW5ndGggIT0gNCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRhdGEucHV0KGlwKTsKKyAgICAgIGRhdGEucHV0U2hvcnQoKHNob3J0KSBwZWVyLmdldFBvcnQoKSk7CisgICAgfQorICAgIHJlc3BvbnNlLnB1dCgicGVlcnMiLCBuZXcgQkVWYWx1ZShBcnJheXMuY29weU9mKGRhdGEuYXJyYXkoKSwgZGF0YS5wb3NpdGlvbigpKSkpOworCisgICAgcmV0dXJuIG5ldyBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoCisgICAgICAgICAgICBCRW5jb2Rlci5iZW5jb2RlKHJlc3BvbnNlKSwKKyAgICAgICAgICAgIGludGVydmFsLCBjb21wbGV0ZSwgaW5jb21wbGV0ZSwgcGVlcnMsIGhleEluZm9IYXNoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBUcmFja2VyRXJyb3JNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjNkMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBUcmFja2VyRXJyb3JNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZS5FcnJvck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEFuIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBIVFRQIHRyYWNrZXIuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSBleHRlbmRzIEhUVFBUcmFja2VyTWVzc2FnZQorICAgICAgICBpbXBsZW1lbnRzIEVycm9yTWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhc29uOworCisgIHByaXZhdGUgSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLCBTdHJpbmcgcmVhc29uKSB7CisgICAgc3VwZXIoVHlwZS5FUlJPUiwgZGF0YSk7CisgICAgdGhpcy5yZWFzb24gPSByZWFzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVhc29uOworICB9CisKKyAgcHVibGljIHN0YXRpYyBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSBwYXJzZShCRVZhbHVlIGRlY29kZWQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKGRlY29kZWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSB0cmFja2VyIG1lc3NhZ2UgKG5vdCBCLWVuY29kZWQ/KSEiKTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBkZWNvZGVkLmdldE1hcCgpOworCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UoCisgICAgICAgICAgICAgIENvbnN0YW50cy5FTVBUWV9CVUZGRVIsCisgICAgICAgICAgICAgIHBhcmFtcy5nZXQoImZhaWx1cmUgcmVhc29uIikKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBpYmVlKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkludmFsaWQgdHJhY2tlciBlcnJvciAiICsKKyAgICAgICAgICAgICAgIm1lc3NhZ2UhIiwgaWJlZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSBjcmFmdCgKKyAgICAgICAgICBFcnJvck1lc3NhZ2UuRmFpbHVyZVJlYXNvbiByZWFzb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlLmNyYWZ0KHJlYXNvbi5nZXRNZXNzYWdlKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSBjcmFmdChTdHJpbmcgcmVhc29uKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIHBhcmFtcy5wdXQoImZhaWx1cmUgcmVhc29uIiwKKyAgICAgICAgICAgIG5ldyBCRVZhbHVlKHJlYXNvbiwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICByZXR1cm4gbmV3IEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlKAorICAgICAgICAgICAgQkVuY29kZXIuYmVuY29kZShwYXJhbXMpLAorICAgICAgICAgICAgcmVhc29uKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBUcmFja2VyTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBUcmFja2VyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWMyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkRlY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIEhUVFAgdHJhY2tlciBtZXNzYWdlcy4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhUVFBUcmFja2VyTWVzc2FnZSBleHRlbmRzIFRyYWNrZXJNZXNzYWdlIHsKKworICBwcm90ZWN0ZWQgSFRUUFRyYWNrZXJNZXNzYWdlKFR5cGUgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgc3VwZXIodHlwZSwgZGF0YSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhUVFBUcmFja2VyTWVzc2FnZSBwYXJzZShJbnB1dFN0cmVhbSBkYXRhKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIEJFVmFsdWUgZGVjb2RlZCA9IEJEZWNvZGVyLmJkZWNvZGUoZGF0YSk7CisgICAgaWYgKGRlY29kZWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgZGVjb2RlIHRyYWNrZXIgbWVzc2FnZSAobm90IEItZW5jb2RlZD8pITogIik7CisgICAgfQorICAgIHJldHVybiBwYXJzZShkZWNvZGVkKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSFRUUFRyYWNrZXJNZXNzYWdlIHBhcnNlKEJFVmFsdWUgZGVjb2RlZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gcGFyYW1zID0gZGVjb2RlZC5nZXRNYXAoKTsKKworICAgIGlmIChwYXJhbXMuY29udGFpbnNLZXkoImluZm9faGFzaCIpKSB7CisgICAgICByZXR1cm4gSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UucGFyc2UoZGVjb2RlZCk7CisgICAgfSBlbHNlIGlmIChwYXJhbXMuY29udGFpbnNLZXkoInBlZXJzIikpIHsKKyAgICAgIHJldHVybiBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UucGFyc2UoZGVjb2RlZCk7CisgICAgfSBlbHNlIGlmIChwYXJhbXMuY29udGFpbnNLZXkoImZhaWx1cmUgcmVhc29uIikpIHsKKyAgICAgIHJldHVybiBIVFRQVHJhY2tlckVycm9yTWVzc2FnZS5wYXJzZShkZWNvZGVkKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIlVua25vd24gSFRUUCB0cmFja2VyIG1lc3NhZ2UhIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTNiMDIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworCitpbXBvcnQgamF2YS5uZXQuSW5ldDRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKworLyoqCisgKiBUaGUgYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgVURQIHRyYWNrZXIgcHJvdG9jb2wuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlCisgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlcXVlc3RNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9BTk5PVU5DRV9SRVFVRVNUX01FU1NBR0VfU0laRSA9IDk4OworCisgIHByaXZhdGUgZmluYWwgbG9uZyBjb25uZWN0aW9uSWQ7CisgIHByaXZhdGUgZmluYWwgaW50IGFjdGlvbklkID0gVHlwZS5BTk5PVU5DRV9SRVFVRVNULmdldElkKCk7CisgIHByaXZhdGUgZmluYWwgaW50IHRyYW5zYWN0aW9uSWQ7CisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGluZm9IYXNoOworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwZWVySWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBkb3dubG9hZGVkOworICBwcml2YXRlIGZpbmFsIGxvbmcgdXBsb2FkZWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBsZWZ0OworICBwcml2YXRlIGZpbmFsIFJlcXVlc3RFdmVudCBldmVudDsKKyAgcHJpdmF0ZSBmaW5hbCBJbmV0QWRkcmVzcyBpcDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtV2FudDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQga2V5OworICBwcml2YXRlIGZpbmFsIHNob3J0IHBvcnQ7CisKKyAgcHJpdmF0ZSBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlKEJ5dGVCdWZmZXIgZGF0YSwgbG9uZyBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNhY3Rpb25JZCwgYnl0ZVtdIGluZm9IYXNoLCBieXRlW10gcGVlcklkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVwbG9hZGVkLCBsb25nIGxlZnQsIFJlcXVlc3RFdmVudCBldmVudCwgSW5ldEFkZHJlc3MgaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5LCBpbnQgbnVtV2FudCwgc2hvcnQgcG9ydCkgeworICAgIHN1cGVyKFR5cGUuQU5OT1VOQ0VfUkVRVUVTVCwgZGF0YSk7CisgICAgdGhpcy5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICB0aGlzLmluZm9IYXNoID0gaW5mb0hhc2g7CisgICAgdGhpcy5wZWVySWQgPSBwZWVySWQ7CisgICAgdGhpcy5kb3dubG9hZGVkID0gZG93bmxvYWRlZDsKKyAgICB0aGlzLnVwbG9hZGVkID0gdXBsb2FkZWQ7CisgICAgdGhpcy5sZWZ0ID0gbGVmdDsKKyAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CisgICAgdGhpcy5pcCA9IGlwOworICAgIHRoaXMua2V5ID0ga2V5OworICAgIHRoaXMubnVtV2FudCA9IG51bVdhbnQ7CisgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRBY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy5hY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiB0aGlzLmluZm9IYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyh0aGlzLmluZm9IYXNoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVySWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhQZWVySWQoKSB7CisgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyh0aGlzLnBlZXJJZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgIHJldHVybiB0aGlzLnBvcnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMudXBsb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0RG93bmxvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5kb3dubG9hZGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldExlZnQoKSB7CisgICAgcmV0dXJuIHRoaXMubGVmdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhY3QoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gY2FuT21pdFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVxdWVzdEV2ZW50IGdldEV2ZW50KCkgeworICAgIHJldHVybiB0aGlzLmV2ZW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SXAoKSB7CisgICAgcmV0dXJuIHRoaXMuaXAudG9TdHJpbmcoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldE51bVdhbnQoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtV2FudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRUcmFja2VySWQoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgZGF0YSkKKyAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIGlmIChkYXRhLnJlbWFpbmluZygpICE9IFVEUF9BTk5PVU5DRV9SRVFVRVNUX01FU1NBR0VfU0laRSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2Ugc2l6ZSEiKTsKKyAgICB9CisKKyAgICBsb25nIGNvbm5lY3Rpb25JZCA9IGRhdGEuZ2V0TG9uZygpOworCisgICAgaWYgKGRhdGEuZ2V0SW50KCkgIT0gVHlwZS5BTk5PVU5DRV9SRVFVRVNULmdldElkKCkpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgYWN0aW9uIGNvZGUgZm9yIGFubm91bmNlIHJlcXVlc3QhIik7CisgICAgfQorCisgICAgaW50IHRyYW5zYWN0aW9uSWQgPSBkYXRhLmdldEludCgpOworICAgIGJ5dGVbXSBpbmZvSGFzaCA9IG5ldyBieXRlWzIwXTsKKyAgICBkYXRhLmdldChpbmZvSGFzaCk7CisgICAgYnl0ZVtdIHBlZXJJZCA9IG5ldyBieXRlWzIwXTsKKyAgICBkYXRhLmdldChwZWVySWQpOworICAgIGxvbmcgZG93bmxvYWRlZCA9IGRhdGEuZ2V0TG9uZygpOworICAgIGxvbmcgdXBsb2FkZWQgPSBkYXRhLmdldExvbmcoKTsKKyAgICBsb25nIGxlZnQgPSBkYXRhLmdldExvbmcoKTsKKworICAgIFJlcXVlc3RFdmVudCBldmVudCA9IFJlcXVlc3RFdmVudC5nZXRCeUlkKGRhdGEuZ2V0SW50KCkpOworICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGV2ZW50IHR5cGUgaW4gYW5ub3VuY2UgcmVxdWVzdCEiKTsKKyAgICB9CisKKyAgICBJbmV0QWRkcmVzcyBpcCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBpcEJ5dGVzID0gbmV3IGJ5dGVbNF07CisgICAgICBkYXRhLmdldChpcEJ5dGVzKTsKKyAgICAgIGlwID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGlwQnl0ZXMpOworICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBJUCBhZGRyZXNzIGluIGFubm91bmNlIHJlcXVlc3QhIik7CisgICAgfQorCisgICAgaW50IGtleSA9IGRhdGEuZ2V0SW50KCk7CisgICAgaW50IG51bVdhbnQgPSBkYXRhLmdldEludCgpOworICAgIHNob3J0IHBvcnQgPSBkYXRhLmdldFNob3J0KCk7CisKKyAgICByZXR1cm4gbmV3IFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbmZvSGFzaCwKKyAgICAgICAgICAgIHBlZXJJZCwKKyAgICAgICAgICAgIGRvd25sb2FkZWQsCisgICAgICAgICAgICB1cGxvYWRlZCwKKyAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgIGlwLAorICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgbnVtV2FudCwKKyAgICAgICAgICAgIHBvcnQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGNyYWZ0KGxvbmcgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zYWN0aW9uSWQsIGJ5dGVbXSBpbmZvSGFzaCwgYnl0ZVtdIHBlZXJJZCwgbG9uZyBkb3dubG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB1cGxvYWRlZCwgbG9uZyBsZWZ0LCBSZXF1ZXN0RXZlbnQgZXZlbnQsIEluZXRBZGRyZXNzIGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleSwgaW50IG51bVdhbnQsIGludCBwb3J0KSB7CisgICAgaWYgKGluZm9IYXNoLmxlbmd0aCAhPSAyMCB8fCBwZWVySWQubGVuZ3RoICE9IDIwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgaWYgKCEoaXAgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IElQdjQgYWRkcmVzc2VzIGFyZSAiICsKKyAgICAgICAgICAgICAgInN1cHBvcnRlZCBieSB0aGUgVURQIHRyYWNlciBwcm90b2NvbCEiKTsKKyAgICB9CisKKyAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKFVEUF9BTk5PVU5DRV9SRVFVRVNUX01FU1NBR0VfU0laRSk7CisgICAgZGF0YS5wdXRMb25nKGNvbm5lY3Rpb25JZCk7CisgICAgZGF0YS5wdXRJbnQoVHlwZS5BTk5PVU5DRV9SRVFVRVNULmdldElkKCkpOworICAgIGRhdGEucHV0SW50KHRyYW5zYWN0aW9uSWQpOworICAgIGRhdGEucHV0KGluZm9IYXNoKTsKKyAgICBkYXRhLnB1dChwZWVySWQpOworICAgIGRhdGEucHV0TG9uZyhkb3dubG9hZGVkKTsKKyAgICBkYXRhLnB1dExvbmcobGVmdCk7CisgICAgZGF0YS5wdXRMb25nKHVwbG9hZGVkKTsKKyAgICBkYXRhLnB1dEludChldmVudC5nZXRJZCgpKTsKKyAgICBkYXRhLnB1dChpcC5nZXRBZGRyZXNzKCkpOworICAgIGRhdGEucHV0SW50KGtleSk7CisgICAgZGF0YS5wdXRJbnQobnVtV2FudCk7CisgICAgZGF0YS5wdXRTaG9ydCgoc2hvcnQpIHBvcnQpOworICAgIHJldHVybiBuZXcgVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZShkYXRhLAorICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGluZm9IYXNoLAorICAgICAgICAgICAgcGVlcklkLAorICAgICAgICAgICAgZG93bmxvYWRlZCwKKyAgICAgICAgICAgIHVwbG9hZGVkLAorICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgaXAsCisgICAgICAgICAgICBrZXksCisgICAgICAgICAgICBudW1XYW50LAorICAgICAgICAgICAgKHNob3J0KSBwb3J0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1YzM0YgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoZSBhbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlIGZvciB0aGUgVURQIHRyYWNrZXIgcHJvdG9jb2wuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZQorICAgICAgICBleHRlbmRzIFVEUFRyYWNrZXJNZXNzYWdlLlVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgaW1wbGVtZW50cyBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9BTk5PVU5DRV9SRVNQT05TRV9NSU5fTUVTU0FHRV9TSVpFID0gMjA7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgYWN0aW9uSWQgPSBUeXBlLkFOTk9VTkNFX1JFU1BPTlNFLmdldElkKCk7CisgIHByaXZhdGUgZmluYWwgaW50IHRyYW5zYWN0aW9uSWQ7CisgIHByaXZhdGUgZmluYWwgaW50IGludGVydmFsOworICBwcml2YXRlIGZpbmFsIGludCBjb21wbGV0ZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5jb21wbGV0ZTsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlZXI+IHBlZXJzOworCisgIHByaXZhdGUgVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLCBpbnQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJ2YWwsIGludCBjb21wbGV0ZSwgaW50IGluY29tcGxldGUsIExpc3Q8UGVlcj4gcGVlcnMpIHsKKyAgICBzdXBlcihUeXBlLkFOTk9VTkNFX1JFUVVFU1QsIGRhdGEpOworICAgIHRoaXMudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgdGhpcy5pbnRlcnZhbCA9IGludGVydmFsOworICAgIHRoaXMuY29tcGxldGUgPSBjb21wbGV0ZTsKKyAgICB0aGlzLmluY29tcGxldGUgPSBpbmNvbXBsZXRlOworICAgIHRoaXMucGVlcnMgPSBwZWVyczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEFjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW50ZXJ2YWwoKSB7CisgICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRDb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5jb21wbGV0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEluY29tcGxldGUoKSB7CisgICAgcmV0dXJuIHRoaXMuaW5jb21wbGV0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxQZWVyPiBnZXRQZWVycygpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGRhdGEpCisgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSA8IFVEUF9BTk5PVU5DRV9SRVNQT05TRV9NSU5fTUVTU0FHRV9TSVpFIHx8CisgICAgICAgICAgICAoZGF0YS5yZW1haW5pbmcoKSAtIFVEUF9BTk5PVU5DRV9SRVNQT05TRV9NSU5fTUVTU0FHRV9TSVpFKSAlIDYgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlIHNpemUhIik7CisgICAgfQorCisgICAgaWYgKGRhdGEuZ2V0SW50KCkgIT0gVHlwZS5BTk5PVU5DRV9SRVNQT05TRS5nZXRJZCgpKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGFjdGlvbiBjb2RlIGZvciBhbm5vdW5jZSByZXNwb25zZSEiKTsKKyAgICB9CisKKyAgICBpbnQgdHJhbnNhY3Rpb25JZCA9IGRhdGEuZ2V0SW50KCk7CisgICAgaW50IGludGVydmFsID0gZGF0YS5nZXRJbnQoKTsKKyAgICBpbnQgaW5jb21wbGV0ZSA9IGRhdGEuZ2V0SW50KCk7CisgICAgaW50IGNvbXBsZXRlID0gZGF0YS5nZXRJbnQoKTsKKworICAgIExpc3Q8UGVlcj4gcGVlcnMgPSBuZXcgTGlua2VkTGlzdDxQZWVyPigpOworICAgIGludCB0b3RhbFBlZXJzSW5SZXNwb25zZSA9IGRhdGEucmVtYWluaW5nKCkgLyA2OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQZWVyc0luUmVzcG9uc2U7IGkrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZVtdIGlwQnl0ZXMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgZGF0YS5nZXQoaXBCeXRlcyk7CisgICAgICAgIEluZXRBZGRyZXNzIGlwID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGlwQnl0ZXMpOworICAgICAgICBpbnQgcG9ydCA9CisgICAgICAgICAgICAgICAgKDB4RkYgJiAoaW50KSBkYXRhLmdldCgpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGICYgKGludCkgZGF0YS5nZXQoKSk7CisgICAgICAgIHBlZXJzLmFkZChuZXcgUGVlcihuZXcgSW5ldFNvY2tldEFkZHJlc3MoaXAsIHBvcnQpKSk7CisgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiB1aGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIElQIGFkZHJlc3MgaW4gYW5ub3VuY2UgcmVxdWVzdCEiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50ZXJ2YWwsCisgICAgICAgICAgICBjb21wbGV0ZSwKKyAgICAgICAgICAgIGluY29tcGxldGUsCisgICAgICAgICAgICBwZWVycyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIGNyYWZ0KGludCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgTGlzdDxQZWVyPiBwZWVycykgeworICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIKKyAgICAgICAgICAgIC5hbGxvY2F0ZShVRFBfQU5OT1VOQ0VfUkVTUE9OU0VfTUlOX01FU1NBR0VfU0laRSArIDYgKiBwZWVycy5zaXplKCkpOworICAgIGRhdGEucHV0SW50KFR5cGUuQU5OT1VOQ0VfUkVTUE9OU0UuZ2V0SWQoKSk7CisgICAgZGF0YS5wdXRJbnQodHJhbnNhY3Rpb25JZCk7CisgICAgZGF0YS5wdXRJbnQoaW50ZXJ2YWwpOworCisgICAgLyoqCisgICAgICogTGVlY2hlcnMgKGluY29tcGxldGUpIGFyZSBmaXJzdCwgYmVmb3JlIHNlZWRlcnMgKGNvbXBsZXRlKSBpbiB0aGUgcGFja2V0LgorICAgICAqLworICAgIGRhdGEucHV0SW50KGluY29tcGxldGUpOworICAgIGRhdGEucHV0SW50KGNvbXBsZXRlKTsKKworICAgIGZvciAoUGVlciBwZWVyIDogcGVlcnMpIHsKKyAgICAgIGJ5dGVbXSBpcCA9IHBlZXIuZ2V0UmF3SXAoKTsKKyAgICAgIGlmIChpcCA9PSBudWxsIHx8IGlwLmxlbmd0aCAhPSA0KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBkYXRhLnB1dChpcCk7CisgICAgICBkYXRhLnB1dFNob3J0KChzaG9ydCkgcGVlci5nZXRQb3J0KCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICAgICAgICAgIGNvbXBsZXRlLAorICAgICAgICAgICAgaW5jb21wbGV0ZSwKKyAgICAgICAgICAgIHBlZXJzKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWI5ODEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wudWRwOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworCisvKioKKyAqIFRoZSBjb25uZWN0aW9uIHJlcXVlc3QgbWVzc2FnZSBmb3IgdGhlIFVEUCB0cmFja2VyIHByb3RvY29sLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlCisgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlcXVlc3RNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgVHJhY2tlck1lc3NhZ2UuQ29ubmVjdGlvblJlcXVlc3RNZXNzYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX0NPTk5FQ1RfUkVRVUVTVF9NRVNTQUdFX1NJWkUgPSAxNjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVRFBfQ09OTkVDVF9SRVFVRVNUX01BR0lDID0gMHg0MTcyNzEwMTk4MEw7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbm5lY3Rpb25JZCA9IFVEUF9DT05ORUNUX1JFUVVFU1RfTUFHSUM7CisgIHByaXZhdGUgZmluYWwgaW50IGFjdGlvbklkID0gVHlwZS5DT05ORUNUX1JFUVVFU1QuZ2V0SWQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJhbnNhY3Rpb25JZDsKKworICBwcml2YXRlIFVEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsIGludCB0cmFuc2FjdGlvbklkKSB7CisgICAgc3VwZXIoVHlwZS5DT05ORUNUX1JFUVVFU1QsIGRhdGEpOworICAgIHRoaXMudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuYWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGRhdGEpCisgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSAhPSBVRFBfQ09OTkVDVF9SRVFVRVNUX01FU1NBR0VfU0laRSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBjb25uZWN0IHJlcXVlc3QgbWVzc2FnZSBzaXplISIpOworICAgIH0KKworICAgIGlmIChkYXRhLmdldExvbmcoKSAhPSBVRFBfQ09OTkVDVF9SRVFVRVNUX01BR0lDKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGNvbm5lY3Rpb24gSUQgaW4gY29ubmVjdGlvbiByZXF1ZXN0ISIpOworICAgIH0KKworICAgIGlmIChkYXRhLmdldEludCgpICE9IFR5cGUuQ09OTkVDVF9SRVFVRVNULmdldElkKCkpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgYWN0aW9uIGNvZGUgZm9yIGNvbm5lY3Rpb24gcmVxdWVzdCEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZShkYXRhLAorICAgICAgICAgICAgZGF0YS5nZXRJbnQoKSAvLyB0cmFuc2FjdGlvbklkCisgICAgKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlIGNyYWZ0KGludCB0cmFuc2FjdGlvbklkKSB7CisgICAgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlcgorICAgICAgICAgICAgLmFsbG9jYXRlKFVEUF9DT05ORUNUX1JFUVVFU1RfTUVTU0FHRV9TSVpFKTsKKyAgICBkYXRhLnB1dExvbmcoVURQX0NPTk5FQ1RfUkVRVUVTVF9NQUdJQyk7CisgICAgZGF0YS5wdXRJbnQoVHlwZS5DT05ORUNUX1JFUVVFU1QuZ2V0SWQoKSk7CisgICAgZGF0YS5wdXRJbnQodHJhbnNhY3Rpb25JZCk7CisgICAgcmV0dXJuIG5ldyBVRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2YjNiNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wudWRwOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworCisvKioKKyAqIFRoZSBjb25uZWN0aW9uIHJlc3BvbnNlIG1lc3NhZ2UgZm9yIHRoZSBVRFAgdHJhY2tlciBwcm90b2NvbC4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgZXh0ZW5kcyBVRFBUcmFja2VyTWVzc2FnZS5VRFBUcmFja2VyUmVzcG9uc2VNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgVHJhY2tlck1lc3NhZ2UuQ29ubmVjdGlvblJlc3BvbnNlTWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9DT05ORUNUX1JFU1BPTlNFX01FU1NBR0VfU0laRSA9IDE2OworCisgIHByaXZhdGUgZmluYWwgaW50IGFjdGlvbklkID0gVHlwZS5DT05ORUNUX1JFU1BPTlNFLmdldElkKCk7CisgIHByaXZhdGUgZmluYWwgaW50IHRyYW5zYWN0aW9uSWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBjb25uZWN0aW9uSWQ7CisKKyAgcHJpdmF0ZSBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlKEJ5dGVCdWZmZXIgZGF0YSwgaW50IHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbm5lY3Rpb25JZCkgeworICAgIHN1cGVyKFR5cGUuQ09OTkVDVF9SRVNQT05TRSwgZGF0YSk7CisgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICB0aGlzLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEFjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbklkOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25JZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGRhdGEpCisgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSAhPSBVRFBfQ09OTkVDVF9SRVNQT05TRV9NRVNTQUdFX1NJWkUpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgY29ubmVjdCByZXNwb25zZSBtZXNzYWdlIHNpemUhIik7CisgICAgfQorCisgICAgaWYgKGRhdGEuZ2V0SW50KCkgIT0gVHlwZS5DT05ORUNUX1JFU1BPTlNFLmdldElkKCkpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgYWN0aW9uIGNvZGUgZm9yIGNvbm5lY3Rpb24gcmVzcG9uc2UhIik7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICBkYXRhLmdldEludCgpLCAvLyB0cmFuc2FjdGlvbklkCisgICAgICAgICAgICBkYXRhLmdldExvbmcoKSAvLyBjb25uZWN0aW9uSWQKKyAgICApOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlIGNyYWZ0KGludCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb25uZWN0aW9uSWQpIHsKKyAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyCisgICAgICAgICAgICAuYWxsb2NhdGUoVURQX0NPTk5FQ1RfUkVTUE9OU0VfTUVTU0FHRV9TSVpFKTsKKyAgICBkYXRhLnB1dEludChUeXBlLkNPTk5FQ1RfUkVTUE9OU0UuZ2V0SWQoKSk7CisgICAgZGF0YS5wdXRJbnQodHJhbnNhY3Rpb25JZCk7CisgICAgZGF0YS5wdXRMb25nKGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIG5ldyBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgY29ubmVjdGlvbklkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQVHJhY2tlckVycm9yTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQVHJhY2tlckVycm9yTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyRXJyb3JNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKworLyoqCisgKiBUaGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIFVEUCB0cmFja2VyIHByb3RvY29sLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgVURQVHJhY2tlckVycm9yTWVzc2FnZQorICAgICAgICBleHRlbmRzIFVEUFRyYWNrZXJNZXNzYWdlLlVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgaW1wbGVtZW50cyBUcmFja2VyTWVzc2FnZS5FcnJvck1lc3NhZ2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfVFJBQ0tFUl9FUlJPUl9NSU5fTUVTU0FHRV9TSVpFID0gODsKKworICBwcml2YXRlIGZpbmFsIGludCBhY3Rpb25JZCA9IFR5cGUuRVJST1IuZ2V0SWQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJhbnNhY3Rpb25JZDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhc29uOworCisgIHByaXZhdGUgVURQVHJhY2tlckVycm9yTWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsIGludCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbikgeworICAgIHN1cGVyKFR5cGUuRVJST1IsIGRhdGEpOworICAgIHRoaXMudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgdGhpcy5yZWFzb24gPSByZWFzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRBY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy5hY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZWFzb247CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUFRyYWNrZXJFcnJvck1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBkYXRhKQorICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKGRhdGEucmVtYWluaW5nKCkgPCBVRFBfVFJBQ0tFUl9FUlJPUl9NSU5fTUVTU0FHRV9TSVpFKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIHRyYWNrZXIgZXJyb3IgbWVzc2FnZSBzaXplISIpOworICAgIH0KKworICAgIGlmIChkYXRhLmdldEludCgpICE9IFR5cGUuRVJST1IuZ2V0SWQoKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhY3Rpb24gY29kZSBmb3IgdHJhY2tlciBlcnJvciEiKTsKKyAgICB9CisKKyAgICBpbnQgdHJhbnNhY3Rpb25JZCA9IGRhdGEuZ2V0SW50KCk7CisgICAgYnl0ZVtdIHJlYXNvbkJ5dGVzID0gbmV3IGJ5dGVbZGF0YS5yZW1haW5pbmcoKV07CisgICAgZGF0YS5nZXQocmVhc29uQnl0ZXMpOworCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgVURQVHJhY2tlckVycm9yTWVzc2FnZShkYXRhLAorICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBuZXcgU3RyaW5nKHJlYXNvbkJ5dGVzLCBDb25zdGFudHMuQllURV9FTkNPRElORykKKyAgICAgICk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWNvZGUgZXJyb3IgbWVzc2FnZSEiLCB1ZWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQVHJhY2tlckVycm9yTWVzc2FnZSBjcmFmdChpbnQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBieXRlW10gcmVhc29uQnl0ZXMgPSByZWFzb24uZ2V0Qnl0ZXMoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIKKyAgICAgICAgICAgIC5hbGxvY2F0ZShVRFBfVFJBQ0tFUl9FUlJPUl9NSU5fTUVTU0FHRV9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uQnl0ZXMubGVuZ3RoKTsKKyAgICBkYXRhLnB1dEludChUeXBlLkVSUk9SLmdldElkKCkpOworICAgIGRhdGEucHV0SW50KHRyYW5zYWN0aW9uSWQpOworICAgIGRhdGEucHV0KHJlYXNvbkJ5dGVzKTsKKyAgICByZXR1cm4gbmV3IFVEUFRyYWNrZXJFcnJvck1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICByZWFzb24pOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQVHJhY2tlck1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDgwMTRiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQVHJhY2tlck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgVURQIHRyYWNrZXIgbWVzc2FnZXMuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBVRFBUcmFja2VyTWVzc2FnZSBleHRlbmRzIFRyYWNrZXJNZXNzYWdlIHsKKworICBwcml2YXRlIFVEUFRyYWNrZXJNZXNzYWdlKFR5cGUgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgc3VwZXIodHlwZSwgZGF0YSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFjdGlvbklkKCk7CisKKyAgcHVibGljIGFic3RyYWN0IGludCBnZXRUcmFuc2FjdGlvbklkKCk7CisKKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBVRFBUcmFja2VyUmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgICBleHRlbmRzIFVEUFRyYWNrZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfTUlOX1JFUVVFU1RfUEFDS0VUX1NJWkUgPSAxNjsKKworICAgIHByb3RlY3RlZCBVRFBUcmFja2VyUmVxdWVzdE1lc3NhZ2UoVHlwZSB0eXBlLCBCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUsIGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVURQVHJhY2tlclJlcXVlc3RNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSA8IFVEUF9NSU5fUkVRVUVTVF9QQUNLRVRfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkludmFsaWQgcGFja2V0IHNpemUhIik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogVURQIHJlcXVlc3QgcGFja2V0cyBhbHdheXMgc3RhcnQgd2l0aCB0aGUgY29ubmVjdGlvbiBJRCAoOCBieXRlcyksCisgICAgICAgKiBmb2xsb3dlZCBieSB0aGUgYWN0aW9uICg0IGJ5dGVzKS4gRXh0cmFjdCB0aGUgYWN0aW9uIGNvZGUKKyAgICAgICAqIGFjY29yZGluZ2x5LgorICAgICAgICovCisgICAgICBkYXRhLm1hcmsoKTsKKyAgICAgIGRhdGEuZ2V0TG9uZygpOworICAgICAgaW50IGFjdGlvbiA9IGRhdGEuZ2V0SW50KCk7CisgICAgICBkYXRhLnJlc2V0KCk7CisKKyAgICAgIGlmIChhY3Rpb24gPT0gVHlwZS5DT05ORUNUX1JFUVVFU1QuZ2V0SWQoKSkgeworICAgICAgICByZXR1cm4gVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlLnBhcnNlKGRhdGEpOworICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVHlwZS5BTk5PVU5DRV9SRVFVRVNULmdldElkKCkpIHsKKyAgICAgICAgcmV0dXJuIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UucGFyc2UoZGF0YSk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBVRFAgdHJhY2tlciAiICsKKyAgICAgICAgICAgICAgInJlcXVlc3QgbWVzc2FnZSEiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgICBleHRlbmRzIFVEUFRyYWNrZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfTUlOX1JFU1BPTlNFX1BBQ0tFVF9TSVpFID0gODsKKworICAgIHByb3RlY3RlZCBVRFBUcmFja2VyUmVzcG9uc2VNZXNzYWdlKFR5cGUgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgICBzdXBlcih0eXBlLCBkYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmIChkYXRhLnJlbWFpbmluZygpIDwgVURQX01JTl9SRVNQT05TRV9QQUNLRVRfU0laRSkgeworICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkludmFsaWQgcGFja2V0IHNpemUhIik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogVURQIHJlc3BvbnNlIHBhY2tldHMgYWx3YXlzIHN0YXJ0IHdpdGggdGhlIGFjdGlvbiAoNCBieXRlcyksIHNvCisgICAgICAgKiB3ZSBjYW4gZXh0cmFjdCBpdCBpbW1lZGlhdGVseS4KKyAgICAgICAqLworICAgICAgZGF0YS5tYXJrKCk7CisgICAgICBpbnQgYWN0aW9uID0gZGF0YS5nZXRJbnQoKTsKKyAgICAgIGRhdGEucmVzZXQoKTsKKworICAgICAgaWYgKGFjdGlvbiA9PSBUeXBlLkNPTk5FQ1RfUkVTUE9OU0UuZ2V0SWQoKSkgeworICAgICAgICByZXR1cm4gVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZS5wYXJzZShkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFR5cGUuQU5OT1VOQ0VfUkVTUE9OU0UuZ2V0SWQoKSkgeworICAgICAgICByZXR1cm4gVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UucGFyc2UoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBUeXBlLkVSUk9SLmdldElkKCkpIHsKKyAgICAgICAgcmV0dXJuIFVEUFRyYWNrZXJFcnJvck1lc3NhZ2UucGFyc2UoZGF0YSk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBVRFAgdHJhY2tlciAiICsKKyAgICAgICAgICAgICAgInJlc3BvbnNlIG1lc3NhZ2UhIik7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFBhcnNlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFBhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU1OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50UGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBUb3JyZW50UGFyc2VyVGVzdCB7CisKKyAgcHJpdmF0ZSBUb3JyZW50UGFyc2VyIG15VG9ycmVudFBhcnNlcjsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIG15VG9ycmVudFBhcnNlciA9IG5ldyBUb3JyZW50UGFyc2VyKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOdWxsQW5ub3VuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1ldGFkYXRhTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgaW5mb1RhYmxlLnB1dChUb3JyZW50TWV0YWRhdGFLZXlzLlBJRUNFUywgbmV3IEJFVmFsdWUobmV3IGJ5dGVbMjBdKSk7CisgICAgaW5mb1RhYmxlLnB1dChUb3JyZW50TWV0YWRhdGFLZXlzLlBJRUNFX0xFTkdUSCwgbmV3IEJFVmFsdWUoNTEyKSk7CisKKyAgICBpbmZvVGFibGUucHV0KFRvcnJlbnRNZXRhZGF0YUtleXMuRklMRV9MRU5HVEgsIG5ldyBCRVZhbHVlKDEwKSk7CisgICAgaW5mb1RhYmxlLnB1dChUb3JyZW50TWV0YWRhdGFLZXlzLk5BTUUsIG5ldyBCRVZhbHVlKCJmaWxlLnR4dCIpKTsKKworICAgIG1ldGFkYXRhTWFwLnB1dChUb3JyZW50TWV0YWRhdGFLZXlzLklORk9fVEFCTEUsIG5ldyBCRVZhbHVlKGluZm9UYWJsZSkpOworCisgICAgVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZShCRW5jb2Rlci5iZW5jb2RlKG1ldGFkYXRhTWFwKS5hcnJheSgpKTsKKworICAgIGFzc2VydE51bGwobWV0YWRhdGEuZ2V0QW5ub3VuY2UoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwYXJzZVRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1ldGFkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisKKyAgICBtZXRhZGF0YS5wdXQoImFubm91bmNlIiwgbmV3IEJFVmFsdWUoImh0dHA6Ly9sb2NhbGhvc3QvYW5ub3VuY2UiKSk7CisKKyAgICBpbmZvVGFibGUucHV0KCJwaWVjZSBsZW5ndGgiLCBuZXcgQkVWYWx1ZSg0KSk7CisKKyAgICBpbmZvVGFibGUucHV0KCJwaWVjZXMiLCBuZXcgQkVWYWx1ZShuZXcgYnl0ZVsxMDBdKSk7CisgICAgaW5mb1RhYmxlLnB1dCgibmFtZSIsIG5ldyBCRVZhbHVlKCJ0ZXN0LmZpbGUiKSk7CisgICAgaW5mb1RhYmxlLnB1dCgibGVuZ3RoIiwgbmV3IEJFVmFsdWUoMTkpKTsKKworICAgIG1ldGFkYXRhLnB1dCgiaW5mbyIsIG5ldyBCRVZhbHVlKGluZm9UYWJsZSkpOworCisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG15VG9ycmVudFBhcnNlci5wYXJzZShCRW5jb2Rlci5iZW5jb2RlKG1ldGFkYXRhKS5hcnJheSgpKTsKKworICAgIGFzc2VydEVxdWFscyh0b3JyZW50TWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKSwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZSgpLCAiaHR0cDovL2xvY2FsaG9zdC9hbm5vdW5jZSIpOworICAgIGFzc2VydEVxdWFscyh0b3JyZW50TWV0YWRhdGEuZ2V0RGlyZWN0b3J5TmFtZSgpLCAidGVzdC5maWxlIik7CisgICAgYXNzZXJ0TnVsbCh0b3JyZW50TWV0YWRhdGEuZ2V0QW5ub3VuY2VMaXN0KCkpOworCisgICAgTGlzdDxCRVZhbHVlPiBhbm5vdW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJFVmFsdWU+KCk7CisgICAgYW5ub3VuY2VMaXN0LmFkZChuZXcgQkVWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBCRVZhbHVlKCJodHRwOi8vbG9jYWxob3N0L2Fubm91bmNlIikpKSk7CisgICAgYW5ub3VuY2VMaXN0LmFkZChuZXcgQkVWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBCRVZhbHVlKCJodHRwOi8vc2Vjb25kL2Fubm91bmNlIikpKSk7CisgICAgbWV0YWRhdGEucHV0KCJhbm5vdW5jZS1saXN0IiwgbmV3IEJFVmFsdWUoYW5ub3VuY2VMaXN0KSk7CisKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhV2l0aEFubm91bmNlTGlzdCA9IG15VG9ycmVudFBhcnNlci5wYXJzZShCRW5jb2Rlci5iZW5jb2RlKG1ldGFkYXRhKS5hcnJheSgpKTsKKworICAgIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBhY3R1YWxBbm5vdW5jZUxpc3QgPSB0b3JyZW50TWV0YWRhdGFXaXRoQW5ub3VuY2VMaXN0LmdldEFubm91bmNlTGlzdCgpOworICAgIGFzc2VydE5vdE51bGwoYWN0dWFsQW5ub3VuY2VMaXN0KTsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsQW5ub3VuY2VMaXN0LmdldCgwKS5nZXQoMCksICJodHRwOi8vbG9jYWxob3N0L2Fubm91bmNlIik7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbEFubm91bmNlTGlzdC5nZXQoMSkuZ2V0KDApLCAiaHR0cDovL3NlY29uZC9hbm5vdW5jZSIpOworCisgIH0KKworICBwdWJsaWMgdm9pZCBiYWRCRVBGb3JtYXRUZXN0KCkgeworICAgIHRyeSB7CisgICAgICBteVRvcnJlbnRQYXJzZXIucGFyc2UoImFiY2QiLmdldEJ5dGVzKCkpOworICAgICAgZmFpbCgiVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBpbnZhbGlkIGJlbmNvZGluZyBleGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vaXQncyBva2F5CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgbWlzc2luZ1JlcXVpcmVkRmllbGRUZXN0KCkgeworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBtYXAucHV0KCJpbmZvIiwgbmV3IEJFVmFsdWUobmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpKSk7CisKKyAgICB0cnkgeworICAgICAgbXlUb3JyZW50UGFyc2VyLnBhcnNlKEJFbmNvZGVyLmJlbmNvZGUobWFwKS5hcnJheSgpKTsKKyAgICAgIGZhaWwoIlRoaXMgbWV0aG9kIG11c3QgdGhyb3cgaW52YWxpZCBiZW5jb2RpbmcgZXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAvL2l0J3Mgb2theQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoIiIsIGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VXRpbHNUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM2MjJkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAgQ29weXJpZ2h0IChDKSAyMDE2IFBoaWxpcHAgSGVua2VsCisgIDxwPgorICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgPHA+CisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICA8cD4KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVG9ycmVudFV0aWxzVGVzdCB7CisKKyAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1RvSGV4V2l0aE51bGwoKSB7CisgICAgLy9ub2luc3BlY3Rpb24gUmVzdWx0T2ZNZXRob2RDYWxsSWdub3JlZCxDb25zdGFudENvbmRpdGlvbnMKKyAgICBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobnVsbCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNUb0hleFdpdGhFbXB0eUJ5dGVBcnJheSgpIHsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhuZXcgYnl0ZVswXSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVG9IZXhXaXRoU2luZ2xlQnl0ZSgpIHsKKyAgICBhc3NlcnRFcXVhbHMoIkJDIiwgVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG5ldyBieXRlW117CisgICAgICAgICAgICAoYnl0ZSkgMHhCQworICAgIH0pKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1RvSGV4V2l0aFplcm9CeXRlKCkgeworICAgIGFzc2VydEVxdWFscygiMDAiLCBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobmV3IGJ5dGVbMV0pKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1RvSGV4V2l0aExlYWRpbmdaZXJvKCkgeworICAgIGFzc2VydEVxdWFscygiMDA1M0ZGIiwgVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG5ldyBieXRlW117CisgICAgICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4NTMsIChieXRlKSAweEZGCisgICAgfSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVG9IZXhUcmFpbGluZ1plcm8oKSB7CisgICAgYXNzZXJ0RXF1YWxzKCJBQTAwNDUwMCIsIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhuZXcgYnl0ZVtdeworICAgICAgICAgICAgKGJ5dGUpIDB4QUEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHg0NSwgKGJ5dGUpIDB4MDAKKyAgICB9KSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNUb0hleEFsbFN5bWJvbHMoKSB7CisgICAgYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5QUJDREVGIiwgVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG5ldyBieXRlW117CisgICAgICAgICAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MjMsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg2NywKKyAgICAgICAgICAgIChieXRlKSAweDg5LCAoYnl0ZSkgMHhBQiwgKGJ5dGUpIDB4Q0QsIChieXRlKSAweEVGCisgICAgfSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0hhc2hlc0NhbGN1bGF0b3JzVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9IYXNoZXNDYWxjdWxhdG9yc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjZjYTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9IYXNoZXNDYWxjdWxhdG9yc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgSGFzaGVzQ2FsY3VsYXRvcnNUZXN0IHsKKworICBwcml2YXRlIExpc3Q8PyBleHRlbmRzIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3I+IGltcGxlbWVudGF0aW9uczsKKyAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNCk7CisgICAgaW1wbGVtZW50YXRpb25zID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIG5ldyBTaW5nbGVUaHJlYWRIYXNoZXNDYWxjdWxhdG9yKCksCisgICAgICAgICAgICBuZXcgTXVsdGlUaHJlYWRIYXNoZXNDYWxjdWxhdG9yKGV4ZWN1dG9yLCAzKSwKKyAgICAgICAgICAgIG5ldyBNdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IoZXhlY3V0b3IsIDIwKSwKKyAgICAgICAgICAgIG5ldyBNdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IoZXhlY3V0b3IsIDEpCisgICAgKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxieXRlW10+IHNvdXJjZUJ5dGVzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117MSwgMn0pOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtde30pOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezMsIDR9KTsKKworICAgIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQgPSBuZXcgSGFzaGluZ1Jlc3VsdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117MSwgMiwgMywgNH0pKSwKKyAgICAgICAgICAgIGFzTGlzdCgyTCwgMEwsIDJMKQorICAgICk7CisgICAgdmVyaWZ5SW1wbGVtZW50YXRpb25zUmVzdWx0cyhzb3VyY2VCeXRlcywgNTEyLCBleHBlY3RlZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtc0FzUGllY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8Ynl0ZVtdPiBzb3VyY2VCeXRlcyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezEsIDIsIDMsIDR9KTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXs1LCA2LCA3LCA4fSk7CisKKyAgICBIYXNoaW5nUmVzdWx0IGV4cGVjdGVkID0gbmV3IEhhc2hpbmdSZXN1bHQoYXNMaXN0KAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117MSwgMiwgMywgNH0pLAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117NSwgNiwgNywgOH0pKSwKKyAgICAgICAgICAgIGFzTGlzdCg0TCwgNEwpCisgICAgKTsKKyAgICB2ZXJpZnlJbXBsZW1lbnRhdGlvbnNSZXN1bHRzKHNvdXJjZUJ5dGVzLCA0LCBleHBlY3RlZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZ05vdEZ1bGx5QnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PGJ5dGVbXT4gc291cmNlQnl0ZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1LCA2LCA3fSk7CisgICAgSGFzaGluZ1Jlc3VsdCBleHBlY3RlZCA9IG5ldyBIYXNoaW5nUmVzdWx0KGFzTGlzdCgKKyAgICAgICAgICAgIFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDV9KSwKKyAgICAgICAgICAgIFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChuZXcgYnl0ZVtdezYsIDd9KSksCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KDdMKQorICAgICk7CisKKyAgICBmaW5hbCBpbnQgbWF4VG9SZWFkID0gMjsKKyAgICBMaXN0PEhhc2hpbmdSZXN1bHQ+IGhhc2hpbmdSZXN1bHRzID0gbmV3IEFycmF5TGlzdDxIYXNoaW5nUmVzdWx0PigpOworICAgIGZvciAoUGllY2VzSGFzaGVzQ2FsY3VsYXRvciBpbXBsZW1lbnRhdGlvbiA6IGltcGxlbWVudGF0aW9ucykgeworICAgICAgTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxEYXRhU291cmNlSG9sZGVyPigpOworICAgICAgZm9yIChieXRlW10gc291cmNlQnl0ZSA6IHNvdXJjZUJ5dGVzKSB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvdXJjZUJ5dGUpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgICAgICBpZiAobGVuIDw9IG1heFRvUmVhZCkgeworICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zID49IGNvdW50KSB7CisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGF2YWlsID0gY291bnQgLSBwb3M7CisgICAgICAgICAgICBpZiAobGVuID4gYXZhaWwpIHsKKyAgICAgICAgICAgICAgbGVuID0gYXZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuIDw9IDApIHsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgcG9zLCBiLCBvZmYsIG1heFRvUmVhZCk7CisgICAgICAgICAgICBwb3MgKz0gbWF4VG9SZWFkOworICAgICAgICAgICAgcmV0dXJuIG1heFRvUmVhZDsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNvdXJjZXMuYWRkKG5ldyBEYXRhU291cmNlSG9sZGVyKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaXM7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgaGFzaGluZ1Jlc3VsdHMuYWRkKGltcGxlbWVudGF0aW9uLmNhbGN1bGF0ZUhhc2hlcyhzb3VyY2VzLCA1KSk7CisgICAgfQorICAgIGZvciAoSGFzaGluZ1Jlc3VsdCBhY3R1YWwgOiBoYXNoaW5nUmVzdWx0cykgeworICAgICAgYXNzZXJ0SGFzaGluZ1Jlc3VsdChhY3R1YWwsIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFNtYWxsU291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PGJ5dGVbXT4gc291cmNlQnl0ZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXswLCAxLCAyLCAzLCA0LCA1LCA0fSk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117LTEsIC0yfSk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117NiwgNywgOCwgOSwgMTB9KTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSk7CisKKyAgICBIYXNoaW5nUmVzdWx0IGV4cGVjdGVkID0gbmV3IEhhc2hpbmdSZXN1bHQoYXNMaXN0KAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117MCwgMSwgMiwgMywgNCwgNX0pLAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117NCwgLTEsIC0yLCA2LCA3LCA4fSksCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXs5LCAxMCwgMSwgMiwgMywgNH0pKSwKKyAgICAgICAgICAgIGFzTGlzdCg3TCwgMkwsIDVMLCA0TCkKKyAgICApOworICAgIHZlcmlmeUltcGxlbWVudGF0aW9uc1Jlc3VsdHMoc291cmNlQnl0ZXMsIDYsIGV4cGVjdGVkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmVMYXJnZVNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBpbnQgc2l6ZSA9IDEwMjQgKiAxMDI0ICogMTAwOy8vMTAwbWIKKyAgICBieXRlW10gc291cmNlQnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICBMaXN0PGJ5dGVbXT4gaGFzaGVzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgZmluYWwgaW50IHBpZWNlU2l6ZSA9IDEyOCAqIDEwMjQ7Ly8xMjhrYgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlQnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIHNvdXJjZUJ5dGVzW2ldID0gKGJ5dGUpIChpICogaSk7CisgICAgICBpZiAoaSAlIHBpZWNlU2l6ZSA9PSAwICYmIGkgPiAwKSB7CisgICAgICAgIGJ5dGVbXSBmb3JIYXNoaW5nID0gQXJyYXlzLmNvcHlPZlJhbmdlKHNvdXJjZUJ5dGVzLCBpIC0gcGllY2VTaXplLCBpKTsKKyAgICAgICAgaGFzaGVzLmFkZChUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2goZm9ySGFzaGluZykpOworICAgICAgfQorICAgIH0KKyAgICBoYXNoZXMuYWRkKFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaCgKKyAgICAgICAgICAgIEFycmF5cy5jb3B5T2ZSYW5nZShzb3VyY2VCeXRlcywgaGFzaGVzLnNpemUoKSAqIHBpZWNlU2l6ZSwgc2l6ZSkKKyAgICApKTsKKworICAgIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQgPSBuZXcgSGFzaGluZ1Jlc3VsdChoYXNoZXMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKGxvbmcpIHNpemUpKTsKKworICAgIHZlcmlmeUltcGxlbWVudGF0aW9uc1Jlc3VsdHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzb3VyY2VCeXRlcyksIHBpZWNlU2l6ZSwgZXhwZWN0ZWQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZlcmlmeUltcGxlbWVudGF0aW9uc1Jlc3VsdHMoTGlzdDxieXRlW10+IHNvdXJjZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoaW5nUmVzdWx0IGV4cGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8SGFzaGluZ1Jlc3VsdD4gaGFzaGluZ1Jlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PEhhc2hpbmdSZXN1bHQ+KCk7CisgICAgZm9yIChQaWVjZXNIYXNoZXNDYWxjdWxhdG9yIGltcGxlbWVudGF0aW9uIDogaW1wbGVtZW50YXRpb25zKSB7CisgICAgICBMaXN0PERhdGFTb3VyY2VIb2xkZXI+IHNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PERhdGFTb3VyY2VIb2xkZXI+KCk7CisgICAgICBmb3IgKGJ5dGVbXSBzb3VyY2VCeXRlIDogc291cmNlQnl0ZXMpIHsKKyAgICAgICAgYWRkU291cmNlKHNvdXJjZUJ5dGUsIHNvdXJjZXMpOworICAgICAgfQorICAgICAgaGFzaGluZ1Jlc3VsdHMuYWRkKGltcGxlbWVudGF0aW9uLmNhbGN1bGF0ZUhhc2hlcyhzb3VyY2VzLCBwaWVjZVNpemUpKTsKKyAgICB9CisgICAgZm9yIChIYXNoaW5nUmVzdWx0IGFjdHVhbCA6IGhhc2hpbmdSZXN1bHRzKSB7CisgICAgICBhc3NlcnRIYXNoaW5nUmVzdWx0KGFjdHVhbCwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRIYXNoaW5nUmVzdWx0KEhhc2hpbmdSZXN1bHQgYWN0dWFsLCBIYXNoaW5nUmVzdWx0IGV4cGVjdGVkKSB7CisKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLmdldEhhc2hlcygpLnNpemUoKSwgZXhwZWN0ZWQuZ2V0SGFzaGVzKCkuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5nZXRIYXNoZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbC5nZXRIYXNoZXMoKS5nZXQoaSksIGV4cGVjdGVkLmdldEhhc2hlcygpLmdldChpKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhhY3R1YWwuZ2V0U291cmNlU2l6ZXMoKSwgZXhwZWN0ZWQuZ2V0U291cmNlU2l6ZXMoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkU291cmNlKGJ5dGVbXSBieXRlcywgTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzKSB7CisgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICBzb3VyY2VzLmFkZChuZXcgRGF0YVNvdXJjZUhvbGRlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NZXRhZGF0YUJ1aWxkZXJUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL01ldGFkYXRhQnVpbGRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNiMjVhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NZXRhZGF0YUJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGFLZXlzLio7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBNZXRhZGF0YUJ1aWxkZXJUZXN0IHsKKworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaWxlTW9kZVdpdGhPbmVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBtYXAgPSBuZXcgTWV0YWRhdGFCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXREaXJlY3RvcnlOYW1lKCJyb290IikKKyAgICAgICAgICAgIC5hZGREYXRhU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdezEsIDJ9KSwgInBhdGgvc29tZV9maWxlIiwgdHJ1ZSkKKyAgICAgICAgICAgIC5idWlsZEJFUCgpLmdldE1hcCgpOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm8gPSBtYXAuZ2V0KElORk9fVEFCTEUpLmdldE1hcCgpOworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChOQU1FKS5nZXRTdHJpbmcoKSwgInJvb3QiKTsKKyAgICBMaXN0PEJFVmFsdWU+IGZpbGVzID0gaW5mby5nZXQoRklMRVMpLmdldExpc3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmlsZXMuc2l6ZSgpLCAxKTsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBmaWxlID0gZmlsZXMuZ2V0KDApLmdldE1hcCgpOworICAgIGFzc2VydEVxdWFscyhmaWxlLmdldChGSUxFX0xFTkdUSCkuZ2V0SW50KCksIDIpOworCisgICAgU3RyaW5nQnVpbGRlciBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBJdGVyYXRvcjxCRVZhbHVlPiBpdGVyYXRvciA9IGZpbGUuZ2V0KEZJTEVfUEFUSCkuZ2V0TGlzdCgpLml0ZXJhdG9yKCk7CisgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKGl0ZXJhdG9yLm5leHQoKS5nZXRTdHJpbmcoKSk7CisgICAgfQorICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgIHBhdGguYXBwZW5kKCIvIikuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKS5nZXRTdHJpbmcoKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhwYXRoLnRvU3RyaW5nKCksICJwYXRoL3NvbWVfZmlsZSIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ1aWxkV2l0aFNwZWNpZmllZEhhc2hlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGV4cGVjdGVkSGFzaCA9IFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChuZXcgYnl0ZVtdezEsIDIsIDN9KTsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YUJ1aWxkZXIoKQorICAgICAgICAgICAgLnNldFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IobmV3IFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IoKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgSGFzaGluZ1Jlc3VsdCBjYWxjdWxhdGVIYXNoZXMoTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzLCBpbnQgcGllY2VTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInNob3VsZCBub3QgYmUgaW52b2tlZCIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLnNldEZpbGVzSW5mbygKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChleHBlY3RlZEhhc2gpLAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJmaWxlIiksCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoNDJMKSkKKyAgICAgICAgICAgIC5zZXRQaWVjZUxlbmd0aCg1MTIpCisgICAgICAgICAgICAuc2V0VHJhY2tlcigiaHR0cDovL2xvY2FsaG9zdDoxMjM0NiIpCisgICAgICAgICAgICAuYnVpbGRCRVAoKS5nZXRNYXAoKTsKKworICAgIGFzc2VydEVxdWFscyhtZXRhZGF0YS5nZXQoQU5OT1VOQ0UpLmdldFN0cmluZygpLCAiaHR0cDovL2xvY2FsaG9zdDoxMjM0NiIpOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm8gPSBtZXRhZGF0YS5nZXQoSU5GT19UQUJMRSkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KFBJRUNFUykuZ2V0Qnl0ZXMoKSwgZXhwZWN0ZWRIYXNoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoTkFNRSkuZ2V0U3RyaW5nKCksICJmaWxlIik7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KEZJTEVfTEVOR1RIKS5nZXRMb25nKCksIDQyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGJ5dGVbXSBkYXRhID0gezEsIDIsIDEyLCA0LCA1fTsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YUJ1aWxkZXIoKQorICAgICAgICAgICAgLmFkZERhdGFTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpLCAic2luZ2xlRmlsZS50eHQiLCB0cnVlKQorICAgICAgICAgICAgLnNldFRyYWNrZXIoImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNDYiKQorICAgICAgICAgICAgLmJ1aWxkQkVQKCkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKG1ldGFkYXRhLmdldChBTk5PVU5DRSkuZ2V0U3RyaW5nKCksICJodHRwOi8vbG9jYWxob3N0OjEyMzQ2Iik7CisgICAgYXNzZXJ0TnVsbChtZXRhZGF0YS5nZXQoQ1JFQVRJT05fREFURV9TRUMpKTsKKyAgICBhc3NlcnROdWxsKG1ldGFkYXRhLmdldChDT01NRU5UKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1ldGFkYXRhLmdldChDUkVBVEVEX0JZKS5nZXRTdHJpbmcoKSwgInR0b3JyZW50IGxpYnJhcnkiKTsKKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm8gPSBtZXRhZGF0YS5nZXQoSU5GT19UQUJMRSkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KFBJRUNFUykuZ2V0Qnl0ZXMoKS5sZW5ndGggLyBDb25zdGFudHMuUElFQ0VfSEFTSF9TSVpFLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoUElFQ0VfTEVOR1RIKS5nZXRJbnQoKSwgNTEyICogMTAyNCk7CisKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoRklMRV9MRU5HVEgpLmdldEludCgpLCBkYXRhLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KE5BTUUpLmdldFN0cmluZygpLCAic2luZ2xlRmlsZS50eHQiKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE11bHRpRmlsZVdpdGhPbmVGaWxlVmFsdWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGJ5dGVbXSBkYXRhID0gezM0LCAyLCAxMiwgNCwgNX07CisgICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gQXJyYXlzLmFzTGlzdCgidW5peC9wYXRoIiwgIndpblxccGF0aCIpOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhQnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRGF0YVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSksIHBhdGhzLmdldCgwKSwgdHJ1ZSkKKyAgICAgICAgICAgIC5hZGREYXRhU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgcGF0aHMuZ2V0KDEpLCB0cnVlKQorICAgICAgICAgICAgLnNldERpcmVjdG9yeU5hbWUoImRvd25sb2FkRGlyTmFtZSIpCisgICAgICAgICAgICAuYnVpbGRCRVAoKS5nZXRNYXAoKTsKKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm8gPSBtZXRhZGF0YS5nZXQoSU5GT19UQUJMRSkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KFBJRUNFUykuZ2V0Qnl0ZXMoKS5sZW5ndGgsIENvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkUpOworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChQSUVDRV9MRU5HVEgpLmdldEludCgpLCA1MTIgKiAxMDI0KTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoTkFNRSkuZ2V0U3RyaW5nKCksICJkb3dubG9hZERpck5hbWUiKTsKKworICAgIGludCBpZHggPSAwOworICAgIGZvciAoQkVWYWx1ZSB2YWx1ZSA6IGluZm8uZ2V0KEZJTEVTKS5nZXRMaXN0KCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGZpbGVJbmZvID0gdmFsdWUuZ2V0TWFwKCk7CisgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhzLmdldChpZHgpOworICAgICAgaWR4Kys7CisgICAgICBTdHJpbmdbXSBzcGxpdCA9IHBhdGguc3BsaXQoIlsvXFxcXF0iKTsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gbGlzdCA9IGZpbGVJbmZvLmdldChGSUxFX1BBVEgpLmdldExpc3QoKTsKKworICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVJbmZvLmdldChGSUxFX0xFTkdUSCkuZ2V0SW50KCksIGRhdGEubGVuZ3RoKTsKKyAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKSwgc3BsaXQubGVuZ3RoKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmdldChpKS5nZXRTdHJpbmcoKSwgc3BsaXRbaV0pOworICAgICAgfQorICAgIH0KKworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmUyYTEzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhcnNlVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhY2tlck1lc3NhZ2UuTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gdHJhY2tlclJlc3BvbnNlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIHRyYWNrZXJSZXNwb25zZS5wdXQoImludGVydmFsIiwgbmV3IEJFVmFsdWUoNSkpOworICAgIHRyYWNrZXJSZXNwb25zZS5wdXQoImNvbXBsZXRlIiwgbmV3IEJFVmFsdWUoMSkpOworICAgIHRyYWNrZXJSZXNwb25zZS5wdXQoImluY29tcGxldGUiLCBuZXcgQkVWYWx1ZSgwKSk7CisKKyAgICBTdHJpbmcgaXAgPSAiMTkyLjE2OC4xLjEiOworICAgIGludCBwb3J0ID0gNjg4MTsKKyAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpcCwgcG9ydCk7CisgICAgQnl0ZUJ1ZmZlciBiaW5hcnlQZWVyQWRkcmVzcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNik7CisgICAgYmluYXJ5UGVlckFkZHJlc3MucHV0KHBlZXJBZGRyZXNzLmdldEFkZHJlc3MoKS5nZXRBZGRyZXNzKCkpOworICAgIGJpbmFyeVBlZXJBZGRyZXNzLnB1dFNob3J0KChzaG9ydCkgcG9ydCk7CisgICAgdHJhY2tlclJlc3BvbnNlLnB1dCgicGVlcnMiLCBuZXcgQkVWYWx1ZShiaW5hcnlQZWVyQWRkcmVzcy5hcnJheSgpKSk7CisKKyAgICBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgcGFyc2VkUmVzcG9uc2UgPSAoSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UucGFyc2UoCisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oQkVuY29kZXIuYmVuY29kZSh0cmFja2VyUmVzcG9uc2UpLmFycmF5KCkpKTsKKworICAgIGFzc2VydEVxdWFscyhwYXJzZWRSZXNwb25zZS5nZXRJbnRlcnZhbCgpLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0Q29tcGxldGUoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcnNlZFJlc3BvbnNlLmdldEluY29tcGxldGUoKSwgMCk7CisgICAgTGlzdDxQZWVyPiBwZWVycyA9IHBhcnNlZFJlc3BvbnNlLmdldFBlZXJzKCk7CisgICAgYXNzZXJ0RXF1YWxzKHBlZXJzLnNpemUoKSwgMSk7CisgICAgUGVlciBwZWVyID0gcGVlcnMuZ2V0KDApOworICAgIGFzc2VydEVxdWFscyhwZWVyLmdldElwKCksIGlwKTsKKyAgICBhc3NlcnRFcXVhbHMocGVlci5nZXRQb3J0KCksIHBvcnQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWY4MWMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogU3BlY2lmaWNhdGlvbiBvZiBVRFAgYW5ub3VuY2UgcHJvdG9jb2w6CisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmJpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTUuaHRtbCI+aHR0cDovL3d3dy5iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDE1Lmh0bWw8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZVRlc3QgeworCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHBhcnNlVGVzdCgpIHRocm93cyBUcmFja2VyTWVzc2FnZS5NZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBpbnQgcGVlcnNDb3VudCA9IDM7CisgICAgQnl0ZUJ1ZmZlciByZXNwb25zZSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMjAgKyBwZWVyc0NvdW50ICogNik7CisgICAgcmVzcG9uc2UucHV0SW50KDEpOy8vYW5ub3VuY2UgcmVzcG9uc2UgbWVzc2FnZSBpZGVudGlmaWVyCisgICAgcmVzcG9uc2UucHV0SW50KDMpOy8vdHJhbnNhY3Rpb25faWQKKyAgICByZXNwb25zZS5wdXRJbnQoNSk7Ly9pbnRlcnZhbAorICAgIHJlc3BvbnNlLnB1dEludCgxKTsvL2luY29tcGxldGUKKyAgICByZXNwb25zZS5wdXRJbnQoMik7Ly9jb21wbGV0ZQorCisKKyAgICBTdHJpbmcgaXBQcmVmaXggPSAiMTkyLjE2OC4xLjEiOworICAgIGZpbmFsIGludCBmaXJzdFBvcnQgPSA2ODgxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVlcnNDb3VudDsgaSsrKSB7CisgICAgICBTdHJpbmcgaXAgPSBpcFByZWZpeCArIGk7CisgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpcCwgZmlyc3RQb3J0KTsKKyAgICAgIHJlc3BvbnNlLnB1dChwZWVyQWRkcmVzcy5nZXRBZGRyZXNzKCkuZ2V0QWRkcmVzcygpKTsKKyAgICAgIHJlc3BvbnNlLnB1dFNob3J0KChzaG9ydCkgKGZpcnN0UG9ydCArIGkpKTsKKyAgICB9CisKKyAgICByZXNwb25zZS5yZXdpbmQoKTsKKyAgICBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBwYXJzZWRSZXNwb25zZSA9IFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLnBhcnNlKHJlc3BvbnNlKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0QWN0aW9uSWQoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcnNlZFJlc3BvbnNlLmdldFRyYW5zYWN0aW9uSWQoKSwgMyk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcnNlZFJlc3BvbnNlLmdldEludGVydmFsKCksIDUpOworICAgIGFzc2VydEVxdWFscyhwYXJzZWRSZXNwb25zZS5nZXRDb21wbGV0ZSgpLCAyKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0SW5jb21wbGV0ZSgpLCAxKTsKKyAgICBMaXN0PFBlZXI+IHBlZXJzID0gcGFyc2VkUmVzcG9uc2UuZ2V0UGVlcnMoKTsKKyAgICBhc3NlcnRFcXVhbHMocGVlcnMuc2l6ZSgpLCBwZWVyc0NvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlZXJzQ291bnQ7IGkrKykgeworICAgICAgUGVlciBwZWVyID0gcGVlcnMuZ2V0KGkpOworICAgICAgYXNzZXJ0RXF1YWxzKHBlZXIuZ2V0SXAoKSwgaXBQcmVmaXggKyBpKTsKKyAgICAgIGFzc2VydEVxdWFscyhwZWVyLmdldFBvcnQoKSwgZmlyc3RQb3J0ICsgaSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM5OTRiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvcG9tLnhtbApAQCAtMCwwICsxLDM1IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC9uZXR3b3JrPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1uZXR3b3JrPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdGVzdC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0FjY2VwdEF0dGFjaG1lbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9BY2NlcHRBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYTY1MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9BY2NlcHRBdHRhY2htZW50LmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitwdWJsaWMgaW50ZXJmYWNlIEFjY2VwdEF0dGFjaG1lbnQgeworCisgIC8qKgorICAgKiBAcmV0dXJuIGNoYW5uZWwgbGlzdGVuZXIgZmFjdG9yeSBmb3IgY3JlYXRlIGxpc3RlbmVycyBmb3IgbmV3IGNvbm5lY3Rpb25zCisgICAqLworICBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IGdldENoYW5uZWxMaXN0ZW5lckZhY3RvcnkoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0FjY2VwdEF0dGFjaG1lbnRJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQWNjZXB0QXR0YWNobWVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBiMDUxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0FjY2VwdEF0dGFjaG1lbnRJbXBsLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgY2xhc3MgQWNjZXB0QXR0YWNobWVudEltcGwgaW1wbGVtZW50cyBBY2NlcHRBdHRhY2htZW50LCBUaW1lb3V0QXR0YWNobWVudCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IG15Q2hhbm5lbExpc3RlbmVyRmFjdG9yeTsKKworICBwdWJsaWMgQWNjZXB0QXR0YWNobWVudEltcGwoQ2hhbm5lbExpc3RlbmVyRmFjdG9yeSBjaGFubmVsTGlzdGVuZXJGYWN0b3J5KSB7CisgICAgdGhpcy5teUNoYW5uZWxMaXN0ZW5lckZhY3RvcnkgPSBjaGFubmVsTGlzdGVuZXJGYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IGdldENoYW5uZWxMaXN0ZW5lckZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG15Q2hhbm5lbExpc3RlbmVyRmFjdG9yeTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1RpbWVvdXRFbGFwc2VkKGxvbmcgY3VycmVudFRpbWVNaWxsaXMpIHsKKyAgICByZXR1cm4gZmFsc2U7Ly9hY2NlcHQgYXR0YWNobWVudCBkb2Vzbid0IGNsb3NlZCBieSB0aW1lb3V0CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY29tbXVuaWNhdGVkTm93KGxvbmcgY3VycmVudFRpbWVNaWxsaXMpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRpbWVvdXRFbGFwc2VkKFNvY2tldENoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ2hhbm5lbExpc3RlbmVyRmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0NoYW5uZWxMaXN0ZW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWUxMTFjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0NoYW5uZWxMaXN0ZW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGludGVyZmFjZSBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IHsKKworICBDb25uZWN0aW9uTGlzdGVuZXIgbmV3Q2hhbm5lbExpc3RlbmVyKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0VGFzay5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3RUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwNjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0VGFzay5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgY2xhc3MgQ29ubmVjdFRhc2sgaW1wbGVtZW50cyBUaW1lb3V0QXR0YWNobWVudCwgUmVhZEF0dGFjaG1lbnQgeworCisgIHByaXZhdGUgbG9uZyBsYXN0Q29tbXVuaWNhdGlvblRpbWU7CisgIHByaXZhdGUgZmluYWwgaW50IG15VGltZW91dE1pbGxpczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlIb3N0OworICBwcml2YXRlIGZpbmFsIGludCBteVBvcnQ7CisgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIG15Q29ubmVjdGlvbkxpc3RlbmVyOworCisgIHB1YmxpYyBDb25uZWN0VGFzayhTdHJpbmcgaG9zdCwgaW50IHBvcnQsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXIsIGxvbmcgbGFzdENvbW11bmljYXRpb25UaW1lLCBpbnQgdGltZW91dE1pbGxpcykgeworICAgIHRoaXMubXlIb3N0ID0gaG9zdDsKKyAgICB0aGlzLm15UG9ydCA9IHBvcnQ7CisgICAgdGhpcy5teUNvbm5lY3Rpb25MaXN0ZW5lciA9IGNvbm5lY3Rpb25MaXN0ZW5lcjsKKyAgICB0aGlzLm15VGltZW91dE1pbGxpcyA9IHRpbWVvdXRNaWxsaXM7CisgICAgdGhpcy5sYXN0Q29tbXVuaWNhdGlvblRpbWUgPSBsYXN0Q29tbXVuaWNhdGlvblRpbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgcmV0dXJuIG15SG9zdDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICByZXR1cm4gbXlQb3J0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb25uZWN0aW9uTGlzdGVuZXIgZ2V0Q29ubmVjdGlvbkxpc3RlbmVyKCkgeworICAgIHJldHVybiBteUNvbm5lY3Rpb25MaXN0ZW5lcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiQ29ubmVjdFRhc2t7IiArCisgICAgICAgICAgICAibXlIb3N0PSciICsgbXlIb3N0ICsgJ1wnJyArCisgICAgICAgICAgICAiLCBteVBvcnQ9IiArIG15UG9ydCArCisgICAgICAgICAgICAnfSc7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNUaW1lb3V0RWxhcHNlZChsb25nIGN1cnJlbnRUaW1lTWlsbGlzKSB7CisgICAgbG9uZyBtaW5UaW1lRm9yS2VlcEFsaXZlID0gY3VycmVudFRpbWVNaWxsaXMgLSBteVRpbWVvdXRNaWxsaXM7CisgICAgcmV0dXJuIG1pblRpbWVGb3JLZWVwQWxpdmUgPiBsYXN0Q29tbXVuaWNhdGlvblRpbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY29tbXVuaWNhdGVkTm93KGxvbmcgY3VycmVudFRpbWVNaWxsaXMpIHsKKyAgICBsYXN0Q29tbXVuaWNhdGlvblRpbWUgPSBjdXJyZW50VGltZU1pbGxpczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblRpbWVvdXRFbGFwc2VkKFNvY2tldENoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBteUNvbm5lY3Rpb25MaXN0ZW5lci5vbkVycm9yKGNoYW5uZWwsIG5ldyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbi5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmRjYTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKworICBwdWJsaWMgQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjU4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25MaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIGludm9rZWQgd2hlbiBzcGVjaWZpZWQgc29ja2V0IGNoYW5uZWwgY29udGFpbnMgYW55IGRhdGEKKyAgICoKKyAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgc3BlY2lmaWVkIHNvY2tldCBjaGFubmVsIHdpdGggZGF0YQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgb25OZXdEYXRhQXZhaWxhYmxlKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBpbnZva2VkIHdoZW4gZ2V0IG5ldyBjb25uZWN0aW9uCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXRDaGFubmVsIHNwZWNpZmllZCBzb2NrZXQgY2hhbm5lbAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIGludm9rZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMKKyAgICoKKyAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgc3BlY2lmaWVkIGNoYW5uZWwsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNoYW5uZWwKKyAgICogQHBhcmFtIGV4ICAgICAgICAgICAgc3BlY2lmaWVkIGV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgb25FcnJvcihTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBleCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjcwMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVGltZVNlcnZpY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29ycy4qOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzLkRFRkFVTFRfQ0xFQU5VUF9SVU5fVElNRU9VVF9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50cy5ERUZBVUxUX1NFTEVDVE9SX1NFTEVDVF9USU1FT1VUX01JTExJUzsKKworcHVibGljIGNsYXNzIENvbm5lY3Rpb25NYW5hZ2VyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbm5lY3Rpb25NYW5hZ2VyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICBwcml2YXRlIGZpbmFsIFRpbWVTZXJ2aWNlIG15VGltZVNlcnZpY2U7CisgIHByaXZhdGUgdm9sYXRpbGUgQ29ubmVjdGlvbldvcmtlciBteUNvbm5lY3Rpb25Xb3JrZXI7CisgIHByaXZhdGUgaW50IG15QmluZFBvcnQ7CisgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0IG15Q29udGV4dDsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBTZXJ2ZXJTb2NrZXRDaGFubmVsIG15U2VydmVyU29ja2V0Q2hhbm5lbDsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBGdXR1cmU8Pz4gbXlXb3JrZXJGdXR1cmU7CisgIHByaXZhdGUgZmluYWwgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbXlJbmNvbWluZ0Nvbm5lY3Rpb25BbGxvd2VyOworICBwcml2YXRlIGZpbmFsIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIG15T3V0Z29pbmdDb25uZWN0aW9uQWxsb3dlcjsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lb3V0U3RvcmFnZSBzb2NrZXRUaW1lb3V0U3RvcmFnZSA9IG5ldyBUaW1lb3V0U3RvcmFnZUltcGwoKTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGFscmVhZHlJbml0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlTZW5kQnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15UmVjZWl2ZUJ1ZmZlclNpemU7CisKKyAgcHVibGljIENvbm5lY3Rpb25NYW5hZ2VyKENvbm5lY3Rpb25NYW5hZ2VyQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVNlcnZpY2UgdGltZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdDb25uZWN0aW9uQWxsb3dlciBuZXdJbmNvbWluZ0Nvbm5lY3Rpb25BbGxvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbmV3T3V0Z29pbmdDb25uZWN0aW9uQWxsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yRmFjdG9yeSBzZWxlY3RvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIG15U2VuZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIG15UmVjZWl2ZUJ1ZmZlclNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teVNlbmRCdWZmZXJTaXplID0gbXlTZW5kQnVmZmVyU2l6ZTsKKyAgICB0aGlzLm15UmVjZWl2ZUJ1ZmZlclNpemUgPSBteVJlY2VpdmVCdWZmZXJTaXplOworICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvckZhY3RvcnkubmV3U2VsZWN0b3IoKTsKKyAgICB0aGlzLm15VGltZVNlcnZpY2UgPSB0aW1lU2VydmljZTsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICAgIHRoaXMubXlJbmNvbWluZ0Nvbm5lY3Rpb25BbGxvd2VyID0gbmV3SW5jb21pbmdDb25uZWN0aW9uQWxsb3dlcjsKKyAgICB0aGlzLm15T3V0Z29pbmdDb25uZWN0aW9uQWxsb3dlciA9IG5ld091dGdvaW5nQ29ubmVjdGlvbkFsbG93ZXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBpbml0QW5kUnVuV29ya2VyKFNlcnZlckNoYW5uZWxSZWdpc3RlciBzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBib29sZWFuIHdhc0luaXQgPSBhbHJlYWR5SW5pdC5nZXRBbmRTZXQodHJ1ZSk7CisKKyAgICBpZiAod2FzSW5pdCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBtYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgfQorCisgICAgbXlTZXJ2ZXJTb2NrZXRDaGFubmVsID0gc2VydmVyQ2hhbm5lbFJlZ2lzdGVyLmNoYW5uZWxGb3Ioc2VsZWN0b3IpOworICAgIG15U2VydmVyU29ja2V0Q2hhbm5lbC5yZWdpc3RlcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX0FDQ0VQVCwgbmV3IEFjY2VwdEF0dGFjaG1lbnRJbXBsKG15Q29udGV4dCkpOworICAgIG15QmluZFBvcnQgPSBteVNlcnZlclNvY2tldENoYW5uZWwuc29ja2V0KCkuZ2V0TG9jYWxQb3J0KCk7CisgICAgU3RyaW5nIHNlcnZlck5hbWUgPSBteVNlcnZlclNvY2tldENoYW5uZWwuc29ja2V0KCkudG9TdHJpbmcoKTsKKyAgICBteUNvbm5lY3Rpb25Xb3JrZXIgPSBuZXcgQ29ubmVjdGlvbldvcmtlcihzZWxlY3RvciwgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIG5ldyBJbnZhbGlkS2V5UHJvY2Vzc29yKCksCisgICAgICAgICAgICBuZXcgQWNjZXB0YWJsZUtleVByb2Nlc3NvcihzZWxlY3Rvciwgc2VydmVyTmFtZSwgbXlUaW1lU2VydmljZSwgbXlJbmNvbWluZ0Nvbm5lY3Rpb25BbGxvd2VyLCBzb2NrZXRUaW1lb3V0U3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgbXlTZW5kQnVmZmVyU2l6ZSwgbXlSZWNlaXZlQnVmZmVyU2l6ZSksCisgICAgICAgICAgICBuZXcgQ29ubmVjdGFibGVLZXlQcm9jZXNzb3Ioc2VsZWN0b3IsIG15VGltZVNlcnZpY2UsIHNvY2tldFRpbWVvdXRTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICBteVNlbmRCdWZmZXJTaXplLCBteVJlY2VpdmVCdWZmZXJTaXplKSwKKyAgICAgICAgICAgIG5ldyBSZWFkYWJsZUtleVByb2Nlc3NvcihzZXJ2ZXJOYW1lKSwKKyAgICAgICAgICAgIG5ldyBXcml0YWJsZUtleVByb2Nlc3NvcigpKSwgREVGQVVMVF9TRUxFQ1RPUl9TRUxFQ1RfVElNRU9VVF9NSUxMSVMsIERFRkFVTFRfQ0xFQU5VUF9SVU5fVElNRU9VVF9NSUxMSVMsCisgICAgICAgICAgICBteVRpbWVTZXJ2aWNlLAorICAgICAgICAgICAgbmV3IENsZWFudXBLZXlQcm9jZXNzb3IobXlUaW1lU2VydmljZSksCisgICAgICAgICAgICBteU91dGdvaW5nQ29ubmVjdGlvbkFsbG93ZXIpOworICAgIG15V29ya2VyRnV0dXJlID0gbXlDb250ZXh0LmdldEV4ZWN1dG9yKCkuc3VibWl0KG15Q29ubmVjdGlvbldvcmtlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclNlbGVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBDb25uZWN0aW9uV29ya2VyIHdvcmtlckxvY2FsID0gbXlDb25uZWN0aW9uV29ya2VyOworICAgIGNoZWNrVGhhdFdvcmtlcklzSW5pdCh3b3JrZXJMb2NhbCk7CisgICAgd29ya2VyTG9jYWwuc2V0U2VsZWN0b3JTZWxlY3RUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrVGhhdFdvcmtlcklzSW5pdChDb25uZWN0aW9uV29ya2VyIHdvcmtlcikgeworICAgIGlmICh3b3JrZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29ubmVjdGlvbiBtYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZCEiKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG9mZmVyQ29ubmVjdChDb25uZWN0VGFzayBjb25uZWN0VGFzaywgaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgaWYgKG15Q29ubmVjdGlvbldvcmtlciA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBteUNvbm5lY3Rpb25Xb3JrZXIub2ZmZXJDb25uZWN0KGNvbm5lY3RUYXNrLCB0aW1lb3V0LCB0aW1lVW5pdCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBvZmZlcldyaXRlKFdyaXRlVGFzayB3cml0ZVRhc2ssIGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgIGlmIChteUNvbm5lY3Rpb25Xb3JrZXIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbXlDb25uZWN0aW9uV29ya2VyLm9mZmVyV3JpdGUod3JpdGVUYXNrLCB0aW1lb3V0LCB0aW1lVW5pdCk7CisgIH0KKworCisgIHB1YmxpYyBpbnQgZ2V0QmluZFBvcnQoKSB7CisgICAgcmV0dXJuIG15QmluZFBvcnQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZShpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBsb2dnZXIuZGVidWcoInRyeSBjbG9zZSBjb25uZWN0aW9uIG1hbmFnZXIuLi4iKTsKKyAgICBib29sZWFuIHN1Y2Nlc3NmdWxseUNsb3NlZCA9IHRydWU7CisgICAgaWYgKG15Q29ubmVjdGlvbldvcmtlciAhPSBudWxsKSB7CisgICAgICBteVdvcmtlckZ1dHVyZS5jYW5jZWwodHJ1ZSk7CisgICAgICB0cnkgeworICAgICAgICBib29sZWFuIHNodXRkb3duQ29ycmVjdGx5ID0gbXlDb25uZWN0aW9uV29ya2VyLnN0b3AodGltZW91dCwgdGltZVVuaXQpOworICAgICAgICBpZiAoIXNodXRkb3duQ29ycmVjdGx5KSB7CisgICAgICAgICAgc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gZmFsc2U7CisgICAgICAgICAgbG9nZ2VyLndhcm4oInVuYWJsZSB0byB0ZXJtaW5hdGUgd29ya2VyIGluIHt9IHt9IiwgdGltZW91dCwgdGltZVVuaXQpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHN1Y2Nlc3NmdWxseUNsb3NlZCA9IGZhbHNlOworICAgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuYWJsZSB0byBhd2FpdCB0ZXJtaW5hdGlvbiB3b3JrZXIsIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQiLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRoaXMubXlTZXJ2ZXJTb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLmVycm9yQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuYWJsZSB0byBjbG9zZSBzZXJ2ZXIgc29ja2V0IGNoYW5uZWwiLCBlKTsKKyAgICAgIHN1Y2Nlc3NmdWxseUNsb3NlZCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKFNlbGVjdGlvbktleSBrZXkgOiB0aGlzLnNlbGVjdG9yLmtleXMoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICBrZXkuY2hhbm5lbCgpLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgIGxvZ2dlci5lcnJvcigidW5hYmxlIHRvIGNsb3NlIHNvY2tldCBjaGFubmVsIHt9Iiwga2V5LmNoYW5uZWwoKSk7CisgICAgICAgIHN1Y2Nlc3NmdWxseUNsb3NlZCA9IGZhbHNlOworICAgICAgICBsb2dnZXIuZGVidWcoIiIsIGUpOworICAgICAgfQorICAgIH0KKyAgICB0cnkgeworICAgICAgdGhpcy5zZWxlY3Rvci5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgdG8gY2xvc2Ugc2VsZWN0b3IgY2hhbm5lbCIsIGUpOworICAgICAgc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChzdWNjZXNzZnVsbHlDbG9zZWQpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiY29ubmVjdGlvbiBtYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBjbG9zZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9nZ2VyLmVycm9yKCJjb25uZWN0aW9uIG1hbmFnZXIgd2Fzbid0IGNsb3NlZCBzdWNjZXNzZnVsbHkiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBjbG9zZSgxLCBUaW1lVW5pdC5NSU5VVEVTKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENsZWFudXBUaW1lb3V0KGxvbmcgdGltZW91dE1pbGxpcykgeworICAgIENvbm5lY3Rpb25Xb3JrZXIgd29ya2VyTG9jYWwgPSBteUNvbm5lY3Rpb25Xb3JrZXI7CisgICAgY2hlY2tUaGF0V29ya2VySXNJbml0KHdvcmtlckxvY2FsKTsKKyAgICB3b3JrZXJMb2NhbC5zZXRDbGVhbnVwVGltZW91dCh0aW1lb3V0TWlsbGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNvY2tldENvbm5lY3Rpb25UaW1lb3V0KGxvbmcgdGltZW91dE1pbGxpcykgeworICAgIHNvY2tldFRpbWVvdXRTdG9yYWdlLnNldFRpbWVvdXQodGltZW91dE1pbGxpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZUNoYW5uZWwoQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoYW5uZWwuY2xvc2UoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyQ29udGV4dC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWNiYjUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0IGV4dGVuZHMgQ2hhbm5lbExpc3RlbmVyRmFjdG9yeSB7CisKKyAgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbldvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODMyNzUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbldvcmtlci5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnMuQ2xlYW51cFByb2Nlc3NvcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnMuS2V5UHJvY2Vzc29yOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIENvbm5lY3Rpb25Xb3JrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25uZWN0aW9uV29ya2VyLmNsYXNzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX1RIUkVBRF9OQU1FID0gIlRvcnJlbnQgY2hhbm5lbHMgbWFuYWdlciB0aHJlYWQiOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOworICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8Q29ubmVjdFRhc2s+IG15Q29ubmVjdFF1ZXVlOworICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPiBteVdyaXRlUXVldWU7CisgIHByaXZhdGUgZmluYWwgU2VtYXBob3JlIG15U2VtYXBob3JlOworICBwcml2YXRlIGZpbmFsIExpc3Q8S2V5UHJvY2Vzc29yPiBteUtleVByb2Nlc3NvcnM7CisgIHByaXZhdGUgZmluYWwgVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKyAgcHJpdmF0ZSBsb25nIGxhc3RDbGVhbnVwVGltZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbXlTZWxlY3RvclRpbWVvdXRNaWxsaXM7CisgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBteUNsZWFudXBUaW1lb3V0TWlsbGlzOworICBwcml2YXRlIGZpbmFsIENsZWFudXBQcm9jZXNzb3IgbXlDbGVhbnVwUHJvY2Vzc29yOworICBwcml2YXRlIGZpbmFsIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIG15TmV3Q29ubmVjdGlvbkFsbG93ZXI7CisKKyAgQ29ubmVjdGlvbldvcmtlcihTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICBMaXN0PEtleVByb2Nlc3Nvcj4ga2V5UHJvY2Vzc29ycywKKyAgICAgICAgICAgICAgICAgICBpbnQgc2VsZWN0b3JUaW1lb3V0TWlsbGlzLAorICAgICAgICAgICAgICAgICAgIGludCBjbGVhbnVwVGltZW91dE1pbGxpcywKKyAgICAgICAgICAgICAgICAgICBUaW1lU2VydmljZSB0aW1lU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICBDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbXlOZXdDb25uZWN0aW9uQWxsb3dlcikgeworICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICB0aGlzLm15VGltZVNlcnZpY2UgPSB0aW1lU2VydmljZTsKKyAgICB0aGlzLmxhc3RDbGVhbnVwVGltZSA9IHRpbWVTZXJ2aWNlLm5vdygpOworICAgIHRoaXMubXlTZWxlY3RvclRpbWVvdXRNaWxsaXMgPSBzZWxlY3RvclRpbWVvdXRNaWxsaXM7CisgICAgdGhpcy5teUNsZWFudXBUaW1lb3V0TWlsbGlzID0gY2xlYW51cFRpbWVvdXRNaWxsaXM7CisgICAgdGhpcy5teUNsZWFudXBQcm9jZXNzb3IgPSBjbGVhbnVwUHJvY2Vzc29yOworICAgIHRoaXMubXlOZXdDb25uZWN0aW9uQWxsb3dlciA9IG15TmV3Q29ubmVjdGlvbkFsbG93ZXI7CisgICAgdGhpcy5teVNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMSk7CisgICAgdGhpcy5teUNvbm5lY3RRdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPENvbm5lY3RUYXNrPigxMDApOworICAgIHRoaXMubXlLZXlQcm9jZXNzb3JzID0ga2V5UHJvY2Vzc29yczsKKyAgICB0aGlzLm15V3JpdGVRdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFdyaXRlVGFzaz4oNTAwMCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworCisgICAgdHJ5IHsKKyAgICAgIG15U2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIG9sZE5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKworICAgIHRyeSB7CisKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0TmFtZShTRUxFQ1RPUl9USFJFQURfTkFNRSk7CisKKyAgICAgIHdoaWxlICghc3RvcCAmJiAoIVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGxvZ2dlci50cmFjZSgidHJ5IHNlbGVjdCBrZXlzIGZyb20gc2VsZWN0b3IiKTsKKyAgICAgICAgICBpbnQgc2VsZWN0ZWQ7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0b3Iuc2VsZWN0KG15U2VsZWN0b3JUaW1lb3V0TWlsbGlzKTsKKyAgICAgICAgICB9IGNhdGNoIChDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY29ubmVjdFRvUGVlcnNGcm9tUXVldWUoKTsKKyAgICAgICAgICBwcm9jZXNzV3JpdGVUYXNrcygpOworICAgICAgICAgIGxvZ2dlci50cmFjZSgic2VsZWN0IGtleXMgZnJvbSBzZWxlY3Rvci4gS2V5cyBjb3VudCBpcyAiICsgc2VsZWN0ZWQpOworICAgICAgICAgIGlmIChzZWxlY3RlZCAhPSAwKSB7CisgICAgICAgICAgICBwcm9jZXNzU2VsZWN0ZWRLZXlzKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChuZWVkUnVuQ2xlYW51cCgpKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIHRvIHNlbGVjdCBjaGFubmVsIGtleXMuIEVycm9yIG1lc3NhZ2Uge30iLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiZXhjZXB0aW9uIG9uIGN5Y2xlIGl0ZXJhdGlvbiIsIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldE5hbWUob2xkTmFtZSk7CisgICAgICBteVNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7CisgICAgbGFzdENsZWFudXBUaW1lID0gbXlUaW1lU2VydmljZS5ub3coKTsKKyAgICBmb3IgKFNlbGVjdGlvbktleSBrZXkgOiBzZWxlY3Rvci5rZXlzKCkpIHsKKyAgICAgIGlmICgha2V5LmlzVmFsaWQoKSkgY29udGludWU7CisgICAgICBteUNsZWFudXBQcm9jZXNzb3IucHJvY2Vzc0NsZWFudXAoa2V5KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gbmVlZFJ1bkNsZWFudXAoKSB7CisgICAgcmV0dXJuIChteVRpbWVTZXJ2aWNlLm5vdygpIC0gbGFzdENsZWFudXBUaW1lKSA+IG15Q2xlYW51cFRpbWVvdXRNaWxsaXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJvY2Vzc1dyaXRlVGFza3MoKSB7CisKKyAgICBmaW5hbCBJdGVyYXRvcjxXcml0ZVRhc2s+IGl0ZXJhdG9yID0gbXlXcml0ZVF1ZXVlLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgV3JpdGVUYXNrIHdyaXRlVGFzayA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIGlmIChzdG9wIHx8IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGxvZ2dlci50cmFjZSgidHJ5IHJlZ2lzdGVyIGNoYW5uZWwgZm9yIHdyaXRlLiBXcml0ZSB0YXNrIGlzIHt9Iiwgd3JpdGVUYXNrKTsKKyAgICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKSB3cml0ZVRhc2suZ2V0U29ja2V0Q2hhbm5lbCgpOworICAgICAgaWYgKCFzb2NrZXRDaGFubmVsLmlzT3BlbigpKSB7CisgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICB3cml0ZVRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRmFpbGVkKGdldERlZmF1bHRXcml0ZUVycm9yTWVzc2FnZVdpdGhTdWZmaXgoc29ja2V0Q2hhbm5lbCwgIkNoYW5uZWwgaXMgbm90IG9wZW4iKSwgbmV3IENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNvY2tldENoYW5uZWwua2V5Rm9yKHNlbGVjdG9yKTsKKyAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICBsb2dnZXIud2FybigidW5hYmxlIHRvIGZpbmQga2V5IGZvciBjaGFubmVsIHt9Iiwgc29ja2V0Q2hhbm5lbCk7CisgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICB3cml0ZVRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRmFpbGVkKGdldERlZmF1bHRXcml0ZUVycm9yTWVzc2FnZVdpdGhTdWZmaXgoc29ja2V0Q2hhbm5lbCwgIkNhbiBub3QgZmluZCBrZXkgZm9yIHRoZSBjaGFubmVsIiksIG5ldyBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uKCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIE9iamVjdCBhdHRhY2htZW50ID0ga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBXcml0ZUF0dGFjaG1lbnQpKSB7CisgICAgICAgIGxvZ2dlci5lcnJvcigiaW5jb3JyZWN0IGF0dGFjaG1lbnQge30gZm9yIGNoYW5uZWwge30iLCBhdHRhY2htZW50LCBzb2NrZXRDaGFubmVsKTsKKyAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIHdyaXRlVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoZ2V0RGVmYXVsdFdyaXRlRXJyb3JNZXNzYWdlV2l0aFN1ZmZpeChzb2NrZXRDaGFubmVsLCAiSW5jb3JyZWN0IGF0dGFjaG1lbnQgaW5zdGFuY2UgZm9yIHRoZSBrZXkiKSwgbmV3IENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgV3JpdGVBdHRhY2htZW50IGtleUF0dGFjaG1lbnQgPSAoV3JpdGVBdHRhY2htZW50KSBhdHRhY2htZW50OworICAgICAgaWYgKGtleUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpLm9mZmVyKHdyaXRlVGFzaykpIHsKKyAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAga2V5LmludGVyZXN0T3BzKGtleS5pbnRlcmVzdE9wcygpIHwgU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FuY2VsbGVkS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB3cml0ZVRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRmFpbGVkKGdldERlZmF1bHRXcml0ZUVycm9yTWVzc2FnZVdpdGhTdWZmaXgoc29ja2V0Q2hhbm5lbCwgIktleSBpcyBjYW5jZWxsZWQiKSwgbmV3IENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFdyaXRlRXJyb3JNZXNzYWdlV2l0aFN1ZmZpeChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFN0cmluZyBzdWZmaXgpIHsKKyAgICByZXR1cm4gInVuYWJsZSB3cml0ZSBkYXRhIHRvIGNoYW5uZWwgIiArIHNvY2tldENoYW5uZWwgKyAiLiAiICsgc3VmZml4OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1BlZXJzRnJvbVF1ZXVlKCkgeworICAgIENvbm5lY3RUYXNrIGNvbm5lY3RUYXNrOworICAgIHdoaWxlICgoY29ubmVjdFRhc2sgPSBteUNvbm5lY3RRdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKKyAgICAgIGlmIChzdG9wIHx8IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGxvZ2dlci5kZWJ1ZygidHJ5IGNvbm5lY3QgdG8gcGVlci4gQ29ubmVjdCB0YXNrIGlzIHt9IiwgY29ubmVjdFRhc2spOworICAgICAgdHJ5IHsKKyAgICAgICAgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgICAgICBzb2NrZXRDaGFubmVsLnJlZ2lzdGVyKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfQ09OTkVDVCwgY29ubmVjdFRhc2spOworICAgICAgICBzb2NrZXRDaGFubmVsLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGNvbm5lY3RUYXNrLmdldEhvc3QoKSwgY29ubmVjdFRhc2suZ2V0UG9ydCgpKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIGNvbm5lY3QuIENvbm5lY3QgdGFzayBpcyB7fSIsIGNvbm5lY3RUYXNrLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBzdG9wKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBzdG9wID0gdHJ1ZTsKKyAgICBpZiAodGltZW91dCA8PSAwKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIG15U2VtYXBob3JlLnRyeUFjcXVpcmUodGltZW91dCwgdGltZVVuaXQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWxlY3RlZEtleXMoKSB7CisgICAgU2V0PFNlbGVjdGlvbktleT4gc2VsZWN0aW9uS2V5cyA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpOworICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IHNlbGVjdGlvbktleXMpIHsKKyAgICAgIGlmIChzdG9wIHx8IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHByb2Nlc3NTZWxlY3RlZEtleShrZXkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nZ2VyLndhcm4oImVycm9yIHt9IGluIHByb2Nlc3Npbmcga2V5LiBDbG9zZSBjaGFubmVsIHt9IiwgZS5nZXRNZXNzYWdlKCksIGtleS5jaGFubmVsKCkpOworICAgICAgICBsb2dnZXIuZGVidWcoIiIsIGUpOworICAgICAgICB0cnkgeworICAgICAgICAgIGtleS5jaGFubmVsKCkuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIGNsb3NlIGJhZCBjaGFubmVsIiwgaW9lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzZWxlY3Rpb25LZXlzLmNsZWFyKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlbGVjdGVkS2V5KFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgcHJvY2VzcyBrZXkgZm9yIGNoYW5uZWwge30iLCBrZXkuY2hhbm5lbCgpKTsKKyAgICBteUNsZWFudXBQcm9jZXNzb3IucHJvY2Vzc1NlbGVjdGVkKGtleSk7CisgICAgaWYgKCFrZXkuY2hhbm5lbCgpLmlzT3BlbigpKSB7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoS2V5UHJvY2Vzc29yIGtleVByb2Nlc3NvciA6IG15S2V5UHJvY2Vzc29ycykgeworICAgICAgaWYgKGtleVByb2Nlc3Nvci5hY2NlcHQoa2V5KSkgeworICAgICAgICBrZXlQcm9jZXNzb3IucHJvY2VzcyhrZXkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG9mZmVyQ29ubmVjdChDb25uZWN0VGFzayBjb25uZWN0VGFzaywgaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgaWYgKCFteU5ld0Nvbm5lY3Rpb25BbGxvd2VyLmlzTmV3Q29ubmVjdGlvbkFsbG93ZWQoKSkgeworICAgICAgbG9nZ2VyLmluZm8oImNhbiBub3QgYWRkIGNvbm5lY3QgdGFzayB7fSB0byBxdWV1ZS4gTmV3IGNvbm5lY3Rpb24gaXMgbm90IGFsbG93ZWQiLCBjb25uZWN0VGFzayk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBhZGRUYXNrVG9RdWV1ZShjb25uZWN0VGFzaywgdGltZW91dCwgdGltZVVuaXQsIG15Q29ubmVjdFF1ZXVlKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG9mZmVyV3JpdGUoV3JpdGVUYXNrIHdyaXRlVGFzaywgaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgYm9vbGVhbiBkb25lID0gYWRkVGFza1RvUXVldWUod3JpdGVUYXNrLCB0aW1lb3V0LCB0aW1lVW5pdCwgbXlXcml0ZVF1ZXVlKTsKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgIHdyaXRlVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoInVuYWJsZSBhZGQgdGFzayAiICsgd3JpdGVUYXNrICsgIiB0byB0aGUgcXVldWUuIE1heWJlIHF1ZXVlIGlzIG92ZXJsb2FkIiwgbnVsbCk7CisgICAgfQorICAgIHJldHVybiBkb25lOworICB9CisKKyAgcHJpdmF0ZSA8VD4gYm9vbGVhbiBhZGRUYXNrVG9RdWV1ZShUIHRhc2ssIGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCwgQmxvY2tpbmdRdWV1ZTxUPiBxdWV1ZSkgeworICAgIHRyeSB7CisgICAgICBpZiAocXVldWUub2ZmZXIodGFzaywgdGltZW91dCwgdGltZVVuaXQpKSB7CisgICAgICAgIGxvZ2dlci50cmFjZSgiYWRkZWQgdGFzayB7fS4gV2FrZSB1cCBzZWxlY3RvciIsIHRhc2spOworICAgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmRlYnVnKCJUYXNrIHt9IGludGVycnVwdGVkIGJlZm9yZSB3YXMgYWRkZWQgdG8gcXVldWUiLCB0YXNrKTsKKyAgICB9CisgICAgbG9nZ2VyLmRlYnVnKCJUYXNrIHt9IHdhcyBub3QgYWRkZWQiLCB0YXNrKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIHNldENsZWFudXBUaW1lb3V0KGxvbmcgdGltZW91dE1pbGxpcykgeworICAgIHRoaXMubXlDbGVhbnVwVGltZW91dE1pbGxpcyA9IHRpbWVvdXRNaWxsaXM7CisgIH0KKworICB2b2lkIHNldFNlbGVjdG9yU2VsZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIG15U2VsZWN0b3JUaW1lb3V0TWlsbGlzID0gdGltZW91dDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvRmlyc3RBdmFpbGFibGVDaGFubmVsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvRmlyc3RBdmFpbGFibGVDaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYTdlZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9GaXJzdEF2YWlsYWJsZUNoYW5uZWwuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBGaXJzdEF2YWlsYWJsZUNoYW5uZWwgaW1wbGVtZW50cyBTZXJ2ZXJDaGFubmVsUmVnaXN0ZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmlyc3RBdmFpbGFibGVDaGFubmVsLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIGludCBmaXJzdFRyeVBvcnQ7CisgIHByaXZhdGUgZmluYWwgaW50IGxhc3RUcnlQb3J0OworCisgIHB1YmxpYyBGaXJzdEF2YWlsYWJsZUNoYW5uZWwoaW50IGZpcnN0VHJ5UG9ydCwgaW50IGxhc3RUcnlQb3J0KSB7CisgICAgdGhpcy5maXJzdFRyeVBvcnQgPSBmaXJzdFRyeVBvcnQ7CisgICAgdGhpcy5sYXN0VHJ5UG9ydCA9IGxhc3RUcnlQb3J0OworICB9CisKKyAgQE5vdE51bGwKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXJ2ZXJTb2NrZXRDaGFubmVsIGNoYW5uZWxGb3IoU2VsZWN0b3Igc2VsZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBteVNlcnZlclNvY2tldENoYW5uZWwgPSBzZWxlY3Rvci5wcm92aWRlcigpLm9wZW5TZXJ2ZXJTb2NrZXRDaGFubmVsKCk7CisgICAgbXlTZXJ2ZXJTb2NrZXRDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICBpbnQgYmluZFBvcnQgPSAtMTsKKyAgICBmb3IgKGludCBwb3J0ID0gZmlyc3RUcnlQb3J0OyBwb3J0IDw9IGxhc3RUcnlQb3J0OyBwb3J0KyspIHsKKyAgICAgIHRyeSB7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHRyeUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCk7CisgICAgICAgIG15U2VydmVyU29ja2V0Q2hhbm5lbC5zb2NrZXQoKS5iaW5kKHRyeUFkZHJlc3MpOworICAgICAgICBiaW5kUG9ydCA9IHRyeUFkZHJlc3MuZ2V0UG9ydCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy90cnkgbmV4dCBwb3J0CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiQ291bGQgbm90IGJpbmQgdG8gcG9ydCB7fSwgdHJ5aW5nIG5leHQgcG9ydC4uLiIsIHBvcnQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYmluZFBvcnQgPT0gLTEpIHsKKyAgICAgIGxvZ2dlci5lcnJvcihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiTm8gYXZhaWxhYmxlIHBvcnRzIGluIHJhbmdlIFslZCwgJWRdIGZvciB0aGUgQml0VG9ycmVudCBjbGllbnQhIiwgZmlyc3RUcnlQb3J0LCBsYXN0VHJ5UG9ydAorICAgICAgKSk7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIGF2YWlsYWJsZSBwb3J0IGZvciB0aGUgQml0VG9ycmVudCBjbGllbnQhIik7CisgICAgfQorICAgIHJldHVybiBteVNlcnZlclNvY2tldENoYW5uZWw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9OZXdDb25uZWN0aW9uQWxsb3dlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL05ld0Nvbm5lY3Rpb25BbGxvd2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmODM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9OZXdDb25uZWN0aW9uQWxsb3dlci5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGludGVyZmFjZSBOZXdDb25uZWN0aW9uQWxsb3dlciB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gYWNjZXB0IG5ldyBjb25uZWN0aW9uIG9yIGNhbiBjb25uZWN0IHRvIG90aGVyIHBlZXIKKyAgICovCisgIGJvb2xlYW4gaXNOZXdDb25uZWN0aW9uQWxsb3dlZCgpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvUmVhZEF0dGFjaG1lbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9SZWFkQXR0YWNobWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzJlMzAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvUmVhZEF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGludGVyZmFjZSBSZWFkQXR0YWNobWVudCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY29ubmVjdGlvbiBsaXN0ZW5lciwgYXNzb2NpYXRlZCB3aXRoIGtleSB3aXRoIGN1cnJlbnQgYXR0YWNobWVudAorICAgKi8KKyAgQ29ubmVjdGlvbkxpc3RlbmVyIGdldENvbm5lY3Rpb25MaXN0ZW5lcigpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1JlYWRXcml0ZUF0dGFjaG1lbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9SZWFkV3JpdGVBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMDZlNAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9SZWFkV3JpdGVBdHRhY2htZW50LmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworCitwdWJsaWMgY2xhc3MgUmVhZFdyaXRlQXR0YWNobWVudCBpbXBsZW1lbnRzIFJlYWRBdHRhY2htZW50LCBXcml0ZUF0dGFjaG1lbnQsIFRpbWVvdXRBdHRhY2htZW50IHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgV1JJVEVfVEFTS19RVUVVRV9TSVpFID0gMTUwOworCisgIHByaXZhdGUgbG9uZyBsYXN0Q29tbXVuaWNhdGlvblRpbWU7CisgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIG15VGltZW91dE1pbGxpczsKKyAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFdyaXRlVGFzaz4gd3JpdGVUYXNrczsKKworICBwdWJsaWMgUmVhZFdyaXRlQXR0YWNobWVudChDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyLCBsb25nIGxhc3RDb21tdW5pY2F0aW9uVGltZSwgbG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBjb25uZWN0aW9uTGlzdGVuZXI7CisgICAgdGhpcy53cml0ZVRhc2tzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPihXUklURV9UQVNLX1FVRVVFX1NJWkUpOworICAgIHRoaXMubGFzdENvbW11bmljYXRpb25UaW1lID0gbGFzdENvbW11bmljYXRpb25UaW1lOworICAgIHRoaXMubXlUaW1lb3V0TWlsbGlzID0gdGltZW91dE1pbGxpczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ29ubmVjdGlvbkxpc3RlbmVyIGdldENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKKyAgICByZXR1cm4gY29ubmVjdGlvbkxpc3RlbmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCbG9ja2luZ1F1ZXVlPFdyaXRlVGFzaz4gZ2V0V3JpdGVUYXNrcygpIHsKKyAgICByZXR1cm4gd3JpdGVUYXNrczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1RpbWVvdXRFbGFwc2VkKGxvbmcgY3VycmVudFRpbWVNaWxsaXMpIHsKKyAgICBsb25nIG1pblRpbWVGb3JLZWVwQWxpdmUgPSBjdXJyZW50VGltZU1pbGxpcyAtIG15VGltZW91dE1pbGxpczsKKyAgICByZXR1cm4gbWluVGltZUZvcktlZXBBbGl2ZSA+IGxhc3RDb21tdW5pY2F0aW9uVGltZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb21tdW5pY2F0ZWROb3cobG9uZyBjdXJyZW50VGltZU1pbGxpcykgeworICAgIGxhc3RDb21tdW5pY2F0aW9uVGltZSA9IGN1cnJlbnRUaW1lTWlsbGlzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGltZW91dEVsYXBzZWQoU29ja2V0Q2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNvbm5lY3Rpb25MaXN0ZW5lci5vbkVycm9yKGNoYW5uZWwsIG5ldyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU2VsZWN0b3JGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU2VsZWN0b3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiOTliMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9TZWxlY3RvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworCitwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdG9yRmFjdG9yeSB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbmV3IHtAbGluayBTZWxlY3Rvcn0gaW5zdGFuY2UKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnkgaW8gZXJyb3Igb2NjdXJzCisgICAqLworICBTZWxlY3RvciBuZXdTZWxlY3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1NlcnZlckNoYW5uZWxSZWdpc3Rlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1NlcnZlckNoYW5uZWxSZWdpc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjljNWQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU2VydmVyQ2hhbm5lbFJlZ2lzdGVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlckNoYW5uZWxSZWdpc3RlciB7CisKKyAgLyoqCisgICAqIENyZWF0ZSBuZXcgY2hhbm5lbCBhbmQgYmluZCB0byBzcGVjaWZpZWQgc2VsZWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHNlbGVjdG9yIHNwZWNpZmllZCBzZWxlY3RvcgorICAgKiBAcmV0dXJuIG5ldyBjcmVhdGVkIHNlcnZlciBjaGFubmVsCisgICAqLworICBATm90TnVsbAorICBTZXJ2ZXJTb2NrZXRDaGFubmVsIGNoYW5uZWxGb3IoU2VsZWN0b3Igc2VsZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRBdHRhY2htZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dEF0dGFjaG1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDc4NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRBdHRhY2htZW50LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgaW50ZXJmYWNlIFRpbWVvdXRBdHRhY2htZW50IHsKKworICAvKioKKyAgICogQHBhcmFtIGN1cnJlbnRUaW1lTWlsbGlzIGN1cnJlbnQgdGltZSBmb3IgdGltZW91dCBjYWxjdWxhdGlvbgorICAgKiBAcmV0dXJuIHRydWUsIGlmIGFuZCBvbmx5IGlmIHRpbWVvdXQgd2FzIGVsYXBzZWQKKyAgICovCisgIGJvb2xlYW4gaXNUaW1lb3V0RWxhcHNlZChsb25nIGN1cnJlbnRUaW1lTWlsbGlzKTsKKworICAvKioKKyAgICogc2V0IGxhc3QgY29tbXVuaWNhdGlvbiB0aW1lIHRvIGN1cnJlbnQgdGltZQorICAgKgorICAgKiBAcGFyYW0gY3VycmVudFRpbWVNaWxsaXMgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgKi8KKyAgdm9pZCBjb21tdW5pY2F0ZWROb3cobG9uZyBjdXJyZW50VGltZU1pbGxpcyk7CisKKyAgLyoqCisgICAqIG11c3QgYmUgaW52b2tlZCBpZiB0aW1lb3V0IHdhcyBlbGFwc2VkCisgICAqCisgICAqIEBwYXJhbSBjaGFubmVsIHNwZWNpZmllZCBjaGFubmVsIGZvciBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0YWNobWVudAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIHZvaWQgb25UaW1lb3V0RWxhcHNlZChTb2NrZXRDaGFubmVsIGNoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRTdG9yYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dFN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE0ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRTdG9yYWdlLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGltZW91dFN0b3JhZ2UgeworCisgIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpcyk7CisKKyAgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCk7CisKKyAgbG9uZyBnZXRUaW1lb3V0TWlsbGlzKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9UaW1lb3V0U3RvcmFnZUltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9UaW1lb3V0U3RvcmFnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjlmMGRhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRTdG9yYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitwdWJsaWMgY2xhc3MgVGltZW91dFN0b3JhZ2VJbXBsIGltcGxlbWVudHMgVGltZW91dFN0b3JhZ2UgeworCisgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyB0aW1lb3V0TWlsbGlzID0gbmV3IEF0b21pY0xvbmcoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpcykgeworICAgIHRpbWVvdXRNaWxsaXMuc2V0KG1pbGxpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBzZXRUaW1lb3V0KHRpbWVVbml0LnRvTWlsbGlzKHRpbWVvdXQpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRUaW1lb3V0TWlsbGlzKCkgeworICAgIHJldHVybiB0aW1lb3V0TWlsbGlzLmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVBdHRhY2htZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NzI3OQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworCitwdWJsaWMgaW50ZXJmYWNlIFdyaXRlQXR0YWNobWVudCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gcXVldWUgZm9yIG9mZmVyL3BlZWsgd3JpdGUgdGFza3MKKyAgICovCisgIEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPiBnZXRXcml0ZVRhc2tzKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDNlNTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGludGVyZmFjZSBXcml0ZUxpc3RlbmVyIHsKKworICAvKioKKyAgICogaW52b2tlZCBpZiB3cml0ZSBpcyBmYWlsZWQgYnkgYW55IHJlYXNvbgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBkZXNjcmlwdGlvbgorICAgKiBAcGFyYW0gZSAgICAgICBleGNlcHRpb24gaWYgZXhpc3QuIE90aGVyd2lzZSBudWxsCisgICAqLworICB2b2lkIG9uV3JpdGVGYWlsZWQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKTsKKworICAvKioKKyAgICogaW52b2tlZCBpZiB3cml0ZSBkb25lIGNvcnJlY3RseQorICAgKi8KKyAgdm9pZCBvbldyaXRlRG9uZSgpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVUYXNrLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV3JpdGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4NzUyYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZVRhc2suamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworCitwdWJsaWMgY2xhc3MgV3JpdGVUYXNrIHsKKworICBwcml2YXRlIGZpbmFsIEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWw7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOworICBwcml2YXRlIGZpbmFsIFdyaXRlTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgcHVibGljIFdyaXRlVGFzayhCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsLCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIsIFdyaXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICB0aGlzLnNvY2tldENoYW5uZWwgPSBzb2NrZXRDaGFubmVsOworICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7CisgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOworICB9CisKKyAgcHVibGljIEJ5dGVDaGFubmVsIGdldFNvY2tldENoYW5uZWwoKSB7CisgICAgcmV0dXJuIHNvY2tldENoYW5uZWw7CisgIH0KKworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlQnVmZmVyKCkgeworICAgIHJldHVybiBieXRlQnVmZmVyOworICB9CisKKyAgcHVibGljIFdyaXRlTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgcmV0dXJuIGxpc3RlbmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJXcml0ZVRhc2t7IiArCisgICAgICAgICAgICAic29ja2V0Q2hhbm5lbD0iICsgc29ja2V0Q2hhbm5lbCArCisgICAgICAgICAgICAiLCBieXRlQnVmZmVyPSIgKyBieXRlQnVmZmVyICsKKyAgICAgICAgICAgICIsIGxpc3RlbmVyPSIgKyBsaXN0ZW5lciArCisgICAgICAgICAgICAnfSc7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0FjY2VwdGFibGVLZXlQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0FjY2VwdGFibGVLZXlQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2IwN2MyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQWNjZXB0YWJsZUtleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLio7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworcHVibGljIGNsYXNzIEFjY2VwdGFibGVLZXlQcm9jZXNzb3IgaW1wbGVtZW50cyBLZXlQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWNjZXB0YWJsZUtleVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBteVNlbGVjdG9yOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteVNlcnZlclNvY2tldExvY2FsQWRkcmVzczsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lU2VydmljZSBteVRpbWVTZXJ2aWNlOworICBwcml2YXRlIGZpbmFsIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIG15TmV3Q29ubmVjdGlvbkFsbG93ZXI7CisgIHByaXZhdGUgZmluYWwgVGltZW91dFN0b3JhZ2UgbXlUaW1lb3V0U3RvcmFnZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15U2VuZEJ1ZmZlclNpemU7CisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBteVJlY2VpdmVCdWZmZXJTaXplOworCisgIHB1YmxpYyBBY2NlcHRhYmxlS2V5UHJvY2Vzc29yKFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmVyU29ja2V0TG9jYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lU2VydmljZSB0aW1lU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbmV3Q29ubmVjdGlvbkFsbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXRTdG9yYWdlIHRpbWVvdXRTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIHNlbmRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIHJlY2VpdmVCdWZmZXJTaXplKSB7CisgICAgdGhpcy5teVNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgdGhpcy5teVNlcnZlclNvY2tldExvY2FsQWRkcmVzcyA9IHNlcnZlclNvY2tldExvY2FsQWRkcmVzczsKKyAgICB0aGlzLm15VGltZVNlcnZpY2UgPSB0aW1lU2VydmljZTsKKyAgICB0aGlzLm15TmV3Q29ubmVjdGlvbkFsbG93ZXIgPSBuZXdDb25uZWN0aW9uQWxsb3dlcjsKKyAgICB0aGlzLm15VGltZW91dFN0b3JhZ2UgPSB0aW1lb3V0U3RvcmFnZTsKKyAgICB0aGlzLm15U2VuZEJ1ZmZlclNpemUgPSBzZW5kQnVmZmVyU2l6ZTsKKyAgICB0aGlzLm15UmVjZWl2ZUJ1ZmZlclNpemUgPSByZWNlaXZlQnVmZmVyU2l6ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgaWYgKCEoY2hhbm5lbCBpbnN0YW5jZW9mIFNlcnZlclNvY2tldENoYW5uZWwpKSB7CisgICAgICBsb2dnZXIuZXJyb3IoImluY29ycmVjdCBpbnN0YW5jZSBvZiBzZXJ2ZXIgY2hhbm5lbC4gQ2FuIG5vdCBhY2NlcHQgY29ubmVjdGlvbnMiKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBBY2NlcHRBdHRhY2htZW50KSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJpbmNvcnJlY3QgaW5zdGFuY2Ugb2Ygc2VydmVyIGNoYW5uZWwga2V5IGF0dGFjaG1lbnQiKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ2hhbm5lbExpc3RlbmVyRmFjdG9yeSBjaGFubmVsTGlzdGVuZXJGYWN0b3J5ID0gKChBY2NlcHRBdHRhY2htZW50KSBhdHRhY2htZW50KS5nZXRDaGFubmVsTGlzdGVuZXJGYWN0b3J5KCk7CisKKyAgICBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSAoKFNlcnZlclNvY2tldENoYW5uZWwpIGtleS5jaGFubmVsKCkpLmFjY2VwdCgpOworICAgIGxvZ2dlci50cmFjZSgic2VydmVyIHt9IGdldCBuZXcgY29ubmVjdGlvbiBmcm9tIHt9IiwgbmV3IE9iamVjdFtde215U2VydmVyU29ja2V0TG9jYWxBZGRyZXNzLCBzb2NrZXRDaGFubmVsLnNvY2tldCgpfSk7CisKKyAgICBpZiAoIW15TmV3Q29ubmVjdGlvbkFsbG93ZXIuaXNOZXdDb25uZWN0aW9uQWxsb3dlZCgpKSB7CisgICAgICBsb2dnZXIuaW5mbygibmV3IGNvbm5lY3Rpb24gaXMgbm90IGFsbG93ZWQuIE5ldyBjb25uZWN0aW9uIGlzIGNsb3NlZCIpOworICAgICAgc29ja2V0Q2hhbm5lbC5jbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENvbm5lY3Rpb25MaXN0ZW5lciBzdGF0ZUNvbm5lY3Rpb25MaXN0ZW5lciA9IGNoYW5uZWxMaXN0ZW5lckZhY3RvcnkubmV3Q2hhbm5lbExpc3RlbmVyKCk7CisgICAgc3RhdGVDb25uZWN0aW9uTGlzdGVuZXIub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoc29ja2V0Q2hhbm5lbCk7CisgICAgc29ja2V0Q2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgS2V5UHJvY2Vzc29yVXRpbC5zZXRCdWZmZXJzU2l6ZUlmTmVjZXNzYXJ5KHNvY2tldENoYW5uZWwsIG15U2VuZEJ1ZmZlclNpemUuZ2V0KCksIG15UmVjZWl2ZUJ1ZmZlclNpemUuZ2V0KCkpOworICAgIFJlYWRXcml0ZUF0dGFjaG1lbnQga2V5QXR0YWNobWVudCA9IG5ldyBSZWFkV3JpdGVBdHRhY2htZW50KHN0YXRlQ29ubmVjdGlvbkxpc3RlbmVyLCBteVRpbWVTZXJ2aWNlLm5vdygpLCBteVRpbWVvdXRTdG9yYWdlLmdldFRpbWVvdXRNaWxsaXMoKSk7CisgICAgc29ja2V0Q2hhbm5lbC5yZWdpc3RlcihteVNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCwga2V5QXR0YWNobWVudCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICByZXR1cm4ga2V5LmlzVmFsaWQoKSAmJiBrZXkuaXNBY2NlcHRhYmxlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBLZXlQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBLZXlQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU3Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cEtleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5UaW1lU2VydmljZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5UaW1lb3V0QXR0YWNobWVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIENsZWFudXBLZXlQcm9jZXNzb3IgaW1wbGVtZW50cyBDbGVhbnVwUHJvY2Vzc29yIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENsZWFudXBLZXlQcm9jZXNzb3IuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKworICBwdWJsaWMgQ2xlYW51cEtleVByb2Nlc3NvcihUaW1lU2VydmljZSB0aW1lU2VydmljZSkgeworICAgIHRoaXMubXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NDbGVhbnVwKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICBUaW1lb3V0QXR0YWNobWVudCBhdHRhY2htZW50ID0gS2V5UHJvY2Vzc29yVXRpbC5nZXRBdHRhY2htZW50QXNUaW1lb3V0T3JOdWxsKGtleSk7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYXR0YWNobWVudC5pc1RpbWVvdXRFbGFwc2VkKG15VGltZVNlcnZpY2Uubm93KCkpKSB7CisKKyAgICAgIFNvY2tldENoYW5uZWwgY2hhbm5lbCA9IEtleVByb2Nlc3NvclV0aWwuZ2V0Q2FzdGVkQ2hhbm5lbE9yTnVsbChrZXkpOworICAgICAgaWYgKGNoYW5uZWwgPT0gbnVsbCkgeworICAgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgbG9nZ2VyLmRlYnVnKCJjaGFubmVsIHt9IHdhcyBpbmFjdGl2ZSBpbiBzcGVjaWZpZWQgdGltZW91dC4gQ2xvc2UgY2hhbm5lbC4uLiIsIGNoYW5uZWwpOworICAgICAgdHJ5IHsKKyAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICAgIGF0dGFjaG1lbnQub25UaW1lb3V0RWxhcHNlZChjaGFubmVsKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIGNsb3NlIGNoYW5uZWwge30iLCBjaGFubmVsLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJvY2Vzc1NlbGVjdGVkKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICBUaW1lb3V0QXR0YWNobWVudCBhdHRhY2htZW50ID0gS2V5UHJvY2Vzc29yVXRpbC5nZXRBdHRhY2htZW50QXNUaW1lb3V0T3JOdWxsKGtleSk7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdHRhY2htZW50LmNvbW11bmljYXRlZE5vdyhteVRpbWVTZXJ2aWNlLm5vdygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ2xlYW51cFByb2Nlc3NvciB7CisKKyAgLyoqCisgICAqIGludm9rZWQgd2hlbiB0aGUgY2xlYW51cCBwcm9jZWR1cmUgaXMgcnVubmluZy4gUHJvY2Vzc29yIGNhbiBjYW5jZWwga2V5IGFuZC9vciBjbG9zZSBjaGFubmVsIGlmIG5lY2Vzc2FyeQorICAgKgorICAgKiBAcGFyYW0ga2V5IHNwZWNpZmllZCBrZXkKKyAgICovCisgIHZvaWQgcHJvY2Vzc0NsZWFudXAoU2VsZWN0aW9uS2V5IGtleSk7CisKKyAgLyoqCisgICAqIGludm9rZWQgd2hlbiBnZXQgYW55IGFjdGl2aXR5IGZvciBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleQorICAgKgorICAgKiBAcGFyYW0ga2V5IHNwZWNpZmllZCBrZXkKKyAgICovCisgIHZvaWQgcHJvY2Vzc1NlbGVjdGVkKFNlbGVjdGlvbktleSBrZXkpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Db25uZWN0YWJsZUtleVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ29ubmVjdGFibGVLZXlQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY0NzRhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ29ubmVjdGFibGVLZXlQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29yczsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5UaW1lU2VydmljZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0VGFzazsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlJlYWRXcml0ZUF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5UaW1lb3V0U3RvcmFnZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk5vUm91dGVUb0hvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0YWJsZUtleVByb2Nlc3NvciBpbXBsZW1lbnRzIEtleVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25uZWN0YWJsZUtleVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBteVNlbGVjdG9yOworICBwcml2YXRlIGZpbmFsIFRpbWVTZXJ2aWNlIG15VGltZVNlcnZpY2U7CisgIHByaXZhdGUgZmluYWwgVGltZW91dFN0b3JhZ2UgbXlUaW1lb3V0U3RvcmFnZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15U2VuZEJ1ZmZlclNpemU7CisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBteVJlY2VpdmVCdWZmZXJTaXplOworCisgIHB1YmxpYyBDb25uZWN0YWJsZUtleVByb2Nlc3NvcihTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dFN0b3JhZ2UgdGltZW91dFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIHNlbmRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljSW50ZWdlciByZWNlaXZlQnVmZmVyU2l6ZSkgeworICAgIHRoaXMubXlTZWxlY3RvciA9IHNlbGVjdG9yOworICAgIHRoaXMubXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICAgIHRoaXMubXlUaW1lb3V0U3RvcmFnZSA9IHRpbWVvdXRTdG9yYWdlOworICAgIHRoaXMubXlTZW5kQnVmZmVyU2l6ZSA9IHNlbmRCdWZmZXJTaXplOworICAgIHRoaXMubXlSZWNlaXZlQnVmZmVyU2l6ZSA9IHJlY2VpdmVCdWZmZXJTaXplOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICBpZiAoIShjaGFubmVsIGluc3RhbmNlb2YgU29ja2V0Q2hhbm5lbCkpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJpbmNvcnJlY3QgaW5zdGFuY2Ugb2YgY2hhbm5lbC4gVGhlIGtleSBpcyBjYW5jZWxsZWQiKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gKFNvY2tldENoYW5uZWwpIGNoYW5uZWw7CisgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDb25uZWN0VGFzaykpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJpbmNvcnJlY3QgaW5zdGFuY2Ugb2YgYXR0YWNobWVudCBmb3IgY2hhbm5lbCB7fS4gVGhlIGtleSBmb3IgdGhlIGNoYW5uZWwgaXMgY2FuY2VsbGVkIiwgc29ja2V0Q2hhbm5lbCk7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZpbmFsIENvbm5lY3RUYXNrIGNvbm5lY3RUYXNrID0gKENvbm5lY3RUYXNrKSBhdHRhY2htZW50OworICAgIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXIgPSBjb25uZWN0VGFzay5nZXRDb25uZWN0aW9uTGlzdGVuZXIoKTsKKyAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdEZpbmlzaGVkOworICAgIHRyeSB7CisgICAgICBpc0Nvbm5lY3RGaW5pc2hlZCA9IHNvY2tldENoYW5uZWwuZmluaXNoQ29ubmVjdCgpOworICAgIH0gY2F0Y2ggKE5vUm91dGVUb0hvc3RFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmluZm8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHt9Ont9LCByZWNlaXZlZCBOb1JvdXRlVG9Ib3N0RXhjZXB0aW9uIiwgY29ubmVjdFRhc2suZ2V0SG9zdCgpLCBjb25uZWN0VGFzay5nZXRQb3J0KCkpOworICAgICAgY29ubmVjdGlvbkxpc3RlbmVyLm9uRXJyb3Ioc29ja2V0Q2hhbm5lbCwgZSk7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuaW5mbygiQ291bGQgbm90IGNvbm5lY3QgdG8ge306e30sIHJlY2VpdmVkIENvbm5lY3RFeGNlcHRpb24iLCBjb25uZWN0VGFzay5nZXRIb3N0KCksIGNvbm5lY3RUYXNrLmdldFBvcnQoKSk7CisgICAgICBjb25uZWN0aW9uTGlzdGVuZXIub25FcnJvcihzb2NrZXRDaGFubmVsLCBlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFpc0Nvbm5lY3RGaW5pc2hlZCkgeworICAgICAgbG9nZ2VyLmluZm8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHt9Ont9IiwgY29ubmVjdFRhc2suZ2V0SG9zdCgpLCBjb25uZWN0VGFzay5nZXRQb3J0KCkpOworICAgICAgY29ubmVjdGlvbkxpc3RlbmVyLm9uRXJyb3Ioc29ja2V0Q2hhbm5lbCwgbnVsbCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgIEtleVByb2Nlc3NvclV0aWwuc2V0QnVmZmVyc1NpemVJZk5lY2Vzc2FyeShzb2NrZXRDaGFubmVsLCBteVNlbmRCdWZmZXJTaXplLmdldCgpLCBteVJlY2VpdmVCdWZmZXJTaXplLmdldCgpKTsKKyAgICBSZWFkV3JpdGVBdHRhY2htZW50IGtleUF0dGFjaG1lbnQgPSBuZXcgUmVhZFdyaXRlQXR0YWNobWVudChjb25uZWN0aW9uTGlzdGVuZXIsIG15VGltZVNlcnZpY2Uubm93KCksIG15VGltZW91dFN0b3JhZ2UuZ2V0VGltZW91dE1pbGxpcygpKTsKKyAgICBzb2NrZXRDaGFubmVsLnJlZ2lzdGVyKG15U2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFELCBrZXlBdHRhY2htZW50KTsKKyAgICBsb2dnZXIuZGVidWcoInNldHVwIG5ldyBUQ1AgY29ubmVjdGlvbiB3aXRoIHt9Iiwgc29ja2V0Q2hhbm5lbCk7CisgICAgY29ubmVjdGlvbkxpc3RlbmVyLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKHNvY2tldENoYW5uZWwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgcmV0dXJuIGtleS5pc1ZhbGlkKCkgJiYga2V5LmlzQ29ubmVjdGFibGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvSW52YWxpZEtleVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvSW52YWxpZEtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWY0OGYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9JbnZhbGlkS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5SZWFkQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DYW5jZWxsZWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBJbnZhbGlkS2V5UHJvY2Vzc29yIGltcGxlbWVudHMgS2V5UHJvY2Vzc29yIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEludmFsaWRLZXlQcm9jZXNzb3IuY2xhc3MpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGZpbmFsIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlYWRBdHRhY2htZW50KSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIShjaGFubmVsIGluc3RhbmNlb2YgU29ja2V0Q2hhbm5lbCkpIHsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmluYWwgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gKFNvY2tldENoYW5uZWwpIGNoYW5uZWw7CisgICAgZmluYWwgUmVhZEF0dGFjaG1lbnQgcmVhZEF0dGFjaG1lbnQgPSAoUmVhZEF0dGFjaG1lbnQpIGF0dGFjaG1lbnQ7CisKKyAgICBsb2dnZXIudHJhY2UoImRyb3AgaW52YWxpZCBrZXkge30iLCBjaGFubmVsKTsKKyAgICByZWFkQXR0YWNobWVudC5nZXRDb25uZWN0aW9uTGlzdGVuZXIoKS5vbkVycm9yKHNvY2tldENoYW5uZWwsIG5ldyBDYW5jZWxsZWRLZXlFeGNlcHRpb24oKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICByZXR1cm4gIWtleS5pc1ZhbGlkKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0tleVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvS2V5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4ZjUxZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0tleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CisKK3B1YmxpYyBpbnRlcmZhY2UgS2V5UHJvY2Vzc29yIHsKKworICAvKioKKyAgICogcHJvY2Vzc2VzIHRoZSBwYXNzZWQga2V5CisgICAqCisgICAqIEBwYXJhbSBrZXkga2V5IGZvciBwcm9jZXNzaW5nCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBwcm9jZXNzKFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogQHBhcmFtIGtleSBzcGVjaWZpZWQga2V5IGZvciBjaGVjayBhY2NlcHRhbmNlCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiBwcm9jZXNzb3IgY2FuIHByb2Nlc3MgdGhpcyBrZXkuCisgICAqLworICBib29sZWFuIGFjY2VwdChTZWxlY3Rpb25LZXkga2V5KTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvS2V5UHJvY2Vzc29yVXRpbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvS2V5UHJvY2Vzc29yVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTc5NDIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9LZXlQcm9jZXNzb3JVdGlsLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5UaW1lb3V0QXR0YWNobWVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBLZXlQcm9jZXNzb3JVdGlsIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEtleVByb2Nlc3NvclV0aWwuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgVGltZW91dEF0dGFjaG1lbnQgZ2V0QXR0YWNobWVudEFzVGltZW91dE9yTnVsbChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgVGltZW91dEF0dGFjaG1lbnQpIHsKKyAgICAgIHJldHVybiAoVGltZW91dEF0dGFjaG1lbnQpIGF0dGFjaG1lbnQ7CisgICAgfQorICAgIGxvZ2dlci5lcnJvcigidW5hYmxlIHRvIGNhc3QgYXR0YWNobWVudCB7fSB0byB0aW1lb3V0IGF0dGFjaG1lbnQgdHlwZSIsIGF0dGFjaG1lbnQpOworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTb2NrZXRDaGFubmVsIGdldENhc3RlZENoYW5uZWxPck51bGwoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgIGlmIChjaGFubmVsIGluc3RhbmNlb2YgU29ja2V0Q2hhbm5lbCkgeworICAgICAgcmV0dXJuIChTb2NrZXRDaGFubmVsKSBjaGFubmVsOworICAgIH0KKyAgICBsb2dnZXIuZXJyb3IoInVuYWJsZSB0byBjYXN0IGNoYW5uZWwge30gdG8gc3BlY2lmaWVkIHR5cGUiKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCdWZmZXJzU2l6ZUlmTmVjZXNzYXJ5KFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgaW50IHNlbmRCdWZmZXJTaXplLCBpbnQgcmVjZWl2ZUJ1ZmZlclNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU29ja2V0IHNvY2tldCA9IHNvY2tldENoYW5uZWwuc29ja2V0KCk7CisgICAgaWYgKHNlbmRCdWZmZXJTaXplID4gMCkgeworICAgICAgc29ja2V0LnNldFNlbmRCdWZmZXJTaXplKHNlbmRCdWZmZXJTaXplKTsKKyAgICB9CisgICAgaWYgKHJlY2VpdmVCdWZmZXJTaXplID4gMCkgeworICAgICAgc29ja2V0LnNldFJlY2VpdmVCdWZmZXJTaXplKHJlY2VpdmVCdWZmZXJTaXplKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1JlYWRhYmxlS2V5UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9SZWFkYWJsZUtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDk5MTkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9SZWFkYWJsZUtleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuUmVhZEF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBSZWFkYWJsZUtleVByb2Nlc3NvciBpbXBsZW1lbnRzIEtleVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSZWFkYWJsZUtleVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlTZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3M7CisKKyAgcHVibGljIFJlYWRhYmxlS2V5UHJvY2Vzc29yKFN0cmluZyBzZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3MpIHsKKyAgICB0aGlzLm15U2VydmVyU29ja2V0TG9jYWxBZGRyZXNzID0gc2VydmVyU29ja2V0TG9jYWxBZGRyZXNzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICBpZiAoIShjaGFubmVsIGluc3RhbmNlb2YgU29ja2V0Q2hhbm5lbCkpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJpbmNvcnJlY3QgaW5zdGFuY2Ugb2YgY2hhbm5lbC4gVGhlIGtleSBpcyBjYW5jZWxsZWQiKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDsKKyAgICBsb2dnZXIudHJhY2UoInNlcnZlciB7fSBnZXQgbmV3IGRhdGEgZnJvbSB7fSIsIG15U2VydmVyU29ja2V0TG9jYWxBZGRyZXNzLCBzb2NrZXRDaGFubmVsKTsKKworICAgIE9iamVjdCBhdHRhY2htZW50ID0ga2V5LmF0dGFjaG1lbnQoKTsKKyAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUmVhZEF0dGFjaG1lbnQpKSB7CisgICAgICBsb2dnZXIud2FybigiaW5jb3JyZWN0IGluc3RhbmNlIG9mIGF0dGFjaG1lbnQgZm9yIGNoYW5uZWwge30iLCBuZXcgT2JqZWN0W117c29ja2V0Q2hhbm5lbC5zb2NrZXQoKX0pOworICAgICAgc29ja2V0Q2hhbm5lbC5jbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyID0gKChSZWFkQXR0YWNobWVudCkgYXR0YWNobWVudCkuZ2V0Q29ubmVjdGlvbkxpc3RlbmVyKCk7CisgICAgY29ubmVjdGlvbkxpc3RlbmVyLm9uTmV3RGF0YUF2YWlsYWJsZShzb2NrZXRDaGFubmVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIHJldHVybiBrZXkuaXNWYWxpZCgpICYmIGtleS5pc1JlYWRhYmxlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1dyaXRhYmxlS2V5UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Xcml0YWJsZUtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTViZTIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Xcml0YWJsZUtleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLldyaXRlQXR0YWNobWVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLldyaXRlVGFzazsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIFdyaXRhYmxlS2V5UHJvY2Vzc29yIGltcGxlbWVudHMgS2V5UHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFdyaXRhYmxlS2V5UHJvY2Vzc29yLmNsYXNzKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJvY2VzcyhTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgIGlmICghKGNoYW5uZWwgaW5zdGFuY2VvZiBTb2NrZXRDaGFubmVsKSkgeworICAgICAgbG9nZ2VyLndhcm4oImluY29ycmVjdCBpbnN0YW5jZSBvZiBjaGFubmVsLiBUaGUga2V5IGlzIGNhbmNlbGxlZCIpOworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKSBjaGFubmVsOworCisgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBXcml0ZUF0dGFjaG1lbnQpKSB7CisgICAgICBsb2dnZXIuZXJyb3IoImluY29ycmVjdCBpbnN0YW5jZSBvZiBhdHRhY2htZW50IGZvciBjaGFubmVsIHt9IiwgY2hhbm5lbCk7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgV3JpdGVBdHRhY2htZW50IGtleUF0dGFjaG1lbnQgPSAoV3JpdGVBdHRhY2htZW50KSBhdHRhY2htZW50OworCisgICAgaWYgKGtleUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpLmlzRW1wdHkoKSkgeworICAgICAga2V5LmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9SRUFEKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXcml0ZVRhc2sgcHJvY2Vzc2VkVGFzayA9IGtleUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpLnBlZWsoKTsKKworICAgIHRyeSB7CisgICAgICBpbnQgd3JpdGVDb3VudCA9IHNvY2tldENoYW5uZWwud3JpdGUocHJvY2Vzc2VkVGFzay5nZXRCeXRlQnVmZmVyKCkpOworICAgICAgaWYgKHdyaXRlQ291bnQgPCAwKSB7CisgICAgICAgIHByb2Nlc3NlZFRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRmFpbGVkKCJSZWFjaGVkIGVuZCBvZiBzdHJlYW0gd2hpbGUgd3JpdGluZyIsIG51bGwpOworICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBzdHJlYW0gd2hpbGUgd3JpdGluZyIpOworICAgICAgfQorCisgICAgICBpZiAoIXByb2Nlc3NlZFRhc2suZ2V0Qnl0ZUJ1ZmZlcigpLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgIHByb2Nlc3NlZFRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRG9uZSgpOworICAgICAgICBrZXlBdHRhY2htZW50LmdldFdyaXRlVGFza3MoKS5yZW1vdmUoKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHByb2Nlc3NlZFRhc2suZ2V0TGlzdGVuZXIoKS5vbldyaXRlRmFpbGVkKCJJL08gZXJyb3Igb2NjdXJzIG9uIHdyaXRlIHRvIGNoYW5uZWwgIiArIHNvY2tldENoYW5uZWwsIG5ldyBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uKGUpKTsKKyAgICAgIGtleUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpLmNsZWFyKCk7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgcmV0dXJuIGtleS5pc1ZhbGlkKCkgJiYga2V5LmlzV3JpdGFibGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25NYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWZmZTgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lk1vY2tUaW1lU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLio7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbk1hbmFnZXJUZXN0IHsKKworICBwcml2YXRlIENvbm5lY3Rpb25NYW5hZ2VyIG15Q29ubmVjdGlvbk1hbmFnZXI7CisgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIG15RXhlY3V0b3JTZXJ2aWNlOworICBwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7CisgIHByaXZhdGUgQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0IG15Q29udGV4dDsKKworICBwdWJsaWMgQ29ubmVjdGlvbk1hbmFnZXJUZXN0KCkgeworICAgIGlmIChMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLmdldEFsbEFwcGVuZGVycygpLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgcmV0dXJuOworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKG5ldyBQYXR0ZXJuTGF5b3V0KCJbJWR7TU1kZCBISDptbTpzcyxTU1N9ICV0XSAlNnAgLSAlMjAuMjBjIC0gJW0gJW4iKSkpOworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuQUxMKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnNldExldmVsKExldmVsLklORk8pOworICAgIG15Q29udGV4dCA9IG1vY2soQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0LmNsYXNzKTsKKyAgICBteUV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgIHdoZW4obXlDb250ZXh0LmdldEV4ZWN1dG9yKCkpLnRoZW5SZXR1cm4obXlFeGVjdXRvclNlcnZpY2UpOworICAgIGZpbmFsIFNlbGVjdG9yRmFjdG9yeSBzZWxlY3RvckZhY3RvcnkgPSBtb2NrKFNlbGVjdG9yRmFjdG9yeS5jbGFzcyk7CisgICAgd2hlbihzZWxlY3RvckZhY3RvcnkubmV3U2VsZWN0b3IoKSkudGhlblJldHVybihTZWxlY3Rvci5vcGVuKCkpOworICAgIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIG5ld0Nvbm5lY3Rpb25BbGxvd2VyID0gbW9jayhOZXdDb25uZWN0aW9uQWxsb3dlci5jbGFzcyk7CisgICAgd2hlbihuZXdDb25uZWN0aW9uQWxsb3dlci5pc05ld0Nvbm5lY3Rpb25BbGxvd2VkKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgbXlDb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigKKyAgICAgICAgICAgIG15Q29udGV4dCwKKyAgICAgICAgICAgIG5ldyBNb2NrVGltZVNlcnZpY2UoKSwKKyAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb25BbGxvd2VyLAorICAgICAgICAgICAgbmV3Q29ubmVjdGlvbkFsbG93ZXIsCisgICAgICAgICAgICBzZWxlY3RvckZhY3RvcnksCisgICAgICAgICAgICBuZXcgQXRvbWljSW50ZWdlcigpLAorICAgICAgICAgICAgbmV3IEF0b21pY0ludGVnZXIoKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0RG91YmxlSW5pdFRocm93RXhjZXB0aW9uKCkgeworICAgIHRyeSB7CisgICAgICBteUNvbm5lY3Rpb25NYW5hZ2VyLmluaXRBbmRSdW5Xb3JrZXIobmV3IEZpcnN0QXZhaWxhYmxlQ2hhbm5lbCg2ODgxLCA2ODg5KSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZmFpbCgidW5hYmxlIHRvIGluaXQgYW5kIHJ1biB3b3JrZXIiLCBlKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIG15Q29ubmVjdGlvbk1hbmFnZXIuaW5pdEFuZFJ1bldvcmtlcihuZXcgRmlyc3RBdmFpbGFibGVDaGFubmVsKDY4ODEsIDY4ODkpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJ1bmFibGUgdG8gaW5pdCBhbmQgcnVuIHdvcmtlciIsIGUpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNhbkFjY2VwdEFuZFJlYWREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciBhY2NlcHRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciByZWFkQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY29ubmVjdENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGxhc3RSZWFkQnl0ZXNDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgZmluYWwgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMCk7CisKKyAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKworICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25OZXdEYXRhQXZhaWxhYmxlKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZENvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBsYXN0UmVhZEJ5dGVzQ291bnQuc2V0KHNvY2tldENoYW5uZWwucmVhZChieXRlQnVmZmVyKSk7CisgICAgICAgIGlmIChsYXN0UmVhZEJ5dGVzQ291bnQuZ2V0KCkgPT0gLTEpIHsKKyAgICAgICAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgc2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFjY2VwdENvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBUaHJvd2FibGUgZXgpIHsKKworICAgICAgfQorICAgIH07CisKKyAgICB3aGVuKG15Q29udGV4dC5uZXdDaGFubmVsTGlzdGVuZXIoKSkudGhlblJldHVybihjb25uZWN0aW9uTGlzdGVuZXIpOworCisgICAgbXlDb25uZWN0aW9uTWFuYWdlci5pbml0QW5kUnVuV29ya2VyKG5ldyBGaXJzdEF2YWlsYWJsZUNoYW5uZWwoNjg4MSwgNjg4OSkpOworCisgICAgYXNzZXJ0RXF1YWxzKGFjY2VwdENvdW50LmdldCgpLCAwKTsKKyAgICBhc3NlcnRFcXVhbHMocmVhZENvdW50LmdldCgpLCAwKTsKKyAgICBpbnQgc2VydmVyUG9ydCA9IG15Q29ubmVjdGlvbk1hbmFnZXIuZ2V0QmluZFBvcnQoKTsKKworICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBzZXJ2ZXJQb3J0KTsKKworICAgIHRyeUFjcXVpcmVPckZhaWwoc2VtYXBob3JlKTsvL3dhaXQgdW50aWwgY29ubmVjdGlvbiBpcyBhY2NlcHRlZAorCisgICAgYXNzZXJ0VHJ1ZShzb2NrZXQuaXNDb25uZWN0ZWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFjY2VwdENvdW50LmdldCgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMocmVhZENvdW50LmdldCgpLCAwKTsKKworICAgIFNvY2tldCBzb2NrZXRTZWNvbmQgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBzZXJ2ZXJQb3J0KTsKKworICAgIHRyeUFjcXVpcmVPckZhaWwoc2VtYXBob3JlKTsvL3dhaXQgdW50aWwgY29ubmVjdGlvbiBpcyBhY2NlcHRlZAorCisgICAgYXNzZXJ0VHJ1ZShzb2NrZXRTZWNvbmQuaXNDb25uZWN0ZWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFjY2VwdENvdW50LmdldCgpLCAyKTsKKyAgICBhc3NlcnRFcXVhbHMocmVhZENvdW50LmdldCgpLCAwKTsKKyAgICBzb2NrZXRTZWNvbmQuY2xvc2UoKTsKKyAgICB0cnlBY3F1aXJlT3JGYWlsKHNlbWFwaG9yZSk7Ly93YWl0IHJlYWQgdGhhdCBjb25uZWN0aW9uIGlzIGNsb3NlZAorICAgIGFzc2VydEVxdWFscyhyZWFkQ291bnQuZ2V0KCksIDEpOworICAgIGFzc2VydEVxdWFscyhhY2NlcHRDb3VudC5nZXQoKSwgMik7CisgICAgYXNzZXJ0RXF1YWxzKGxhc3RSZWFkQnl0ZXNDb3VudC5nZXQoKSwgLTEpOworICAgIGJ5dGVCdWZmZXIucmV3aW5kKCk7CisgICAgYXNzZXJ0RXF1YWxzKGJ5dGVCdWZmZXIuZ2V0KCksIDApOworICAgIGJ5dGVCdWZmZXIucmV3aW5kKCk7CisgICAgU3RyaW5nIHdyaXRlU3RyID0gImFiYyI7CisgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICBvdXRwdXRTdHJlYW0ud3JpdGUod3JpdGVTdHIuZ2V0Qnl0ZXMoKSk7CisgICAgdHJ5QWNxdWlyZU9yRmFpbChzZW1hcGhvcmUpOy8vd2FpdCB1bnRpbCByZWFkIGJ5dGVzCisgICAgYXNzZXJ0RXF1YWxzKHJlYWRDb3VudC5nZXQoKSwgMik7CisgICAgYXNzZXJ0RXF1YWxzKGxhc3RSZWFkQnl0ZXNDb3VudC5nZXQoKSwgMyk7CisgICAgYnl0ZVtdIGV4cGVjdGVkID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5jYXBhY2l0eSgpXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KHdyaXRlU3RyLmdldEJ5dGVzKCksIDAsIGV4cGVjdGVkLCAwLCB3cml0ZVN0ci5sZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGJ5dGVCdWZmZXIuYXJyYXkoKSwgZXhwZWN0ZWQpOworICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgIHNvY2tldC5jbG9zZSgpOworICAgIHRyeUFjcXVpcmVPckZhaWwoc2VtYXBob3JlKTsvL3dhaXQgcmVhZCB0aGF0IGNvbm5lY3Rpb24gaXMgY2xvc2VkCisgICAgYXNzZXJ0RXF1YWxzKHJlYWRDb3VudC5nZXQoKSwgMyk7CisKKyAgICBpbnQgb3RoZXJQZWVyUG9ydCA9IDc1NzU7CisgICAgU2VydmVyU29ja2V0IHNzID0gbmV3IFNlcnZlclNvY2tldChvdGhlclBlZXJQb3J0KTsKKyAgICBhc3NlcnRFcXVhbHMoY29ubmVjdENvdW50LmdldCgpLCAwKTsKKyAgICBteUNvbm5lY3Rpb25NYW5hZ2VyLm9mZmVyQ29ubmVjdChuZXcgQ29ubmVjdFRhc2soIjEyNy4wLjAuMSIsIG90aGVyUGVlclBvcnQsIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uTmV3RGF0YUF2YWlsYWJsZShTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbm5lY3RDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgc2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGV4KSB7CisKKyAgICAgIH0KKyAgICB9LCAwLCAxMDApLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICBzcy5hY2NlcHQoKTsKKyAgICB0cnlBY3F1aXJlT3JGYWlsKHNlbWFwaG9yZSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbm5lY3RDb3VudC5nZXQoKSwgMSk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aGlzLm15Q29ubmVjdGlvbk1hbmFnZXIuY2xvc2UoKTsKKyAgICBteUV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgIGFzc2VydFRydWUobXlFeGVjdXRvclNlcnZpY2UuYXdhaXRUZXJtaW5hdGlvbigxMCwgVGltZVVuaXQuU0VDT05EUykpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRyeUFjcXVpcmVPckZhaWwoU2VtYXBob3JlIHNlbWFwaG9yZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBpZiAoIXNlbWFwaG9yZS50cnlBY3F1aXJlKDUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkgeworICAgICAgZmFpbCgiZG9uJ3QgZ2V0IHNpZ25hbCBmcm9tIGNvbm5lY3Rpb24gcmVjZWl2ZXIgdGhhdCBjb25uZWN0aW9uIHNlbGVjdGVkIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbldvcmtlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzN2QxNjMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbldvcmtlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Nb2NrVGltZVNlcnZpY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzLkNsZWFudXBQcm9jZXNzb3I7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzLktleVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uV29ya2VyVGVzdCB7CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFudXBJc0NhbGxlZCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgZmluYWwgU2VsZWN0aW9uS2V5IG1vY2tLZXkgPSBtb2NrKFNlbGVjdGlvbktleS5jbGFzcyk7CisgICAgZmluYWwgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgIGZpbmFsIEtleVByb2Nlc3NvciBhY2NlcHRQcm9jZXNzb3IgPSBtb2NrKEtleVByb2Nlc3Nvci5jbGFzcyk7CisgICAgZmluYWwgS2V5UHJvY2Vzc29yIG5vdEFjY2VwdFByb2Nlc3NvciA9IG1vY2soS2V5UHJvY2Vzc29yLmNsYXNzKTsKKworICAgIFNlbGVjdG9yIG1vY2tTZWxlY3RvciA9IG1vY2soU2VsZWN0b3IuY2xhc3MpOworICAgIHdoZW4obW9ja1NlbGVjdG9yLnNlbGVjdChhbnlMb25nKCkpKS50aGVuUmV0dXJuKDEpLnRoZW5UaHJvdyhuZXcgQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24oKSk7CisgICAgd2hlbihtb2NrU2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkpLnRoZW5SZXR1cm4obmV3IEhhc2hTZXQ8U2VsZWN0aW9uS2V5PihDb2xsZWN0aW9ucy5zaW5nbGV0b24obW9ja0tleSkpKTsKKyAgICB3aGVuKG1vY2tLZXkuaXNWYWxpZCgpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4obW9ja0tleS5jaGFubmVsKCkpLnRoZW5SZXR1cm4oY2hhbm5lbCk7CisgICAgd2hlbihhY2NlcHRQcm9jZXNzb3IuYWNjZXB0KG1vY2tLZXkpKS50aGVuUmV0dXJuKHRydWUpOworICAgIHdoZW4obm90QWNjZXB0UHJvY2Vzc29yLmFjY2VwdChtb2NrS2V5KSkudGhlblJldHVybihmYWxzZSk7CisgICAgQ29ubmVjdGlvbldvcmtlciBjb25uZWN0aW9uV29ya2VyID0gbmV3IENvbm5lY3Rpb25Xb3JrZXIoCisgICAgICAgICAgICBtb2NrU2VsZWN0b3IsCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGFjY2VwdFByb2Nlc3Nvciwgbm90QWNjZXB0UHJvY2Vzc29yKSwKKyAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIG5ldyBNb2NrVGltZVNlcnZpY2UoKSwKKyAgICAgICAgICAgIG1vY2soQ2xlYW51cFByb2Nlc3Nvci5jbGFzcyksCisgICAgICAgICAgICBtb2NrKE5ld0Nvbm5lY3Rpb25BbGxvd2VyLmNsYXNzKSk7CisgICAgY29ubmVjdGlvbldvcmtlci5ydW4oKTsKKyAgICB2ZXJpZnkobW9ja1NlbGVjdG9yKS5zZWxlY3RlZEtleXMoKTsKKyAgICB2ZXJpZnkoYWNjZXB0UHJvY2Vzc29yKS5hY2NlcHQobW9ja0tleSk7CisgICAgdmVyaWZ5KGFjY2VwdFByb2Nlc3NvcikucHJvY2Vzcyhtb2NrS2V5KTsKKyAgICB2ZXJpZnkobm90QWNjZXB0UHJvY2Vzc29yKS5hY2NlcHQobW9ja0tleSk7CisgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG5vdEFjY2VwdFByb2Nlc3Nvcik7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1N0YXRlQ2hhbm5lbExpc3RlbmVyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1N0YXRlQ2hhbm5lbExpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzhmYWMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU3RhdGVDaGFubmVsTGlzdGVuZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK3B1YmxpYyBjbGFzcyBTdGF0ZUNoYW5uZWxMaXN0ZW5lclRlc3QgeworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dvcmtpbmdSZWNlaXZlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xb3JraW5nUmVjZWl2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZDE3YQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xb3JraW5nUmVjZWl2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK3B1YmxpYyBjbGFzcyBXb3JraW5nUmVjZWl2ZXJUZXN0IHsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBLZXlQcm9jZXNzb3JUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwS2V5UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTdkMzAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwS2V5UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuTW9ja1RpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuVGltZW91dEF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgQ2xlYW51cEtleVByb2Nlc3NvclRlc3QgeworCisgIHByaXZhdGUgZmluYWwgaW50IENMT1NFX1RJTUVPVVQgPSAxMDA7CisKKyAgcHJpdmF0ZSBNb2NrVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKyAgcHJpdmF0ZSBUaW1lb3V0QXR0YWNobWVudCBteVRpbWVvdXRBdHRhY2htZW50OworICBwcml2YXRlIFNlbGVjdGlvbktleSBteUtleTsKKyAgcHJpdmF0ZSBTZWxlY3RhYmxlQ2hhbm5lbCBteUNoYW5uZWw7CisgIHByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIG15Q29ubmVjdGlvbkxpc3RlbmVyOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBteVRpbWVTZXJ2aWNlID0gbmV3IE1vY2tUaW1lU2VydmljZSgpOworICAgIG15Q29ubmVjdGlvbkxpc3RlbmVyID0gbW9jayhDb25uZWN0aW9uTGlzdGVuZXIuY2xhc3MpOworICAgIG15VGltZW91dEF0dGFjaG1lbnQgPSBtb2NrKFRpbWVvdXRBdHRhY2htZW50LmNsYXNzKTsKKyAgICBteUtleSA9IG1vY2soU2VsZWN0aW9uS2V5LmNsYXNzKTsKKyAgICBteUNoYW5uZWwgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICB3aGVuKG15S2V5LmNoYW5uZWwoKSkudGhlblJldHVybihteUNoYW5uZWwpOworICAgIHdoZW4obXlLZXkuaW50ZXJlc3RPcHMoKSkudGhlblJldHVybihTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgbXlLZXkuYXR0YWNoKG15VGltZW91dEF0dGFjaG1lbnQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkKCkgeworCisgICAgbG9uZyBvbGRUaW1lID0gMTA7CisgICAgbXlUaW1lU2VydmljZS5zZXRUaW1lKG9sZFRpbWUpOworCisgICAgQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBLZXlQcm9jZXNzb3IobXlUaW1lU2VydmljZSk7CisgICAgY2xlYW51cFByb2Nlc3Nvci5wcm9jZXNzU2VsZWN0ZWQobXlLZXkpOworCisgICAgdmVyaWZ5KG15VGltZW91dEF0dGFjaG1lbnQpLmNvbW11bmljYXRlZE5vdyhlcShvbGRUaW1lKSk7CisKKyAgICBsb25nIG5ld1RpbWUgPSAxMDA7CisgICAgbXlUaW1lU2VydmljZS5zZXRUaW1lKG5ld1RpbWUpOworCisgICAgY2xlYW51cFByb2Nlc3Nvci5wcm9jZXNzU2VsZWN0ZWQobXlLZXkpOworCisgICAgdmVyaWZ5KG15VGltZW91dEF0dGFjaG1lbnQpLmNvbW11bmljYXRlZE5vdyhlcShuZXdUaW1lKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW51cFdpbGxDbG9zZVdpdGhUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICB3aGVuKG15VGltZW91dEF0dGFjaG1lbnQuaXNUaW1lb3V0RWxhcHNlZChhbnlMb25nKCkpKS50aGVuUmV0dXJuKHRydWUpOworCisgICAgQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBLZXlQcm9jZXNzb3IobXlUaW1lU2VydmljZSk7CisgICAgY2xlYW51cFByb2Nlc3Nvci5wcm9jZXNzQ2xlYW51cChteUtleSk7CisKKyAgICB2ZXJpZnkobXlLZXkpLmNhbmNlbCgpOworICAgIHZlcmlmeShteUtleSkuY2hhbm5lbCgpOworICAgIHZlcmlmeShteVRpbWVvdXRBdHRhY2htZW50KS5vblRpbWVvdXRFbGFwc2VkKGFueShTb2NrZXRDaGFubmVsLmNsYXNzKSk7CisgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG15S2V5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwV2l0aG91dENsb3NlKCkgeworICAgIHdoZW4obXlUaW1lb3V0QXR0YWNobWVudC5pc1RpbWVvdXRFbGFwc2VkKGFueUxvbmcoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOworCisgICAgbXlUaW1lU2VydmljZS5zZXRUaW1lKDIwMCk7CisKKyAgICBDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cEtleVByb2Nlc3NvcihteVRpbWVTZXJ2aWNlKTsKKyAgICBjbGVhbnVwUHJvY2Vzc29yLnByb2Nlc3NDbGVhbnVwKG15S2V5KTsKKworICAgIHZlcmlmeShteVRpbWVvdXRBdHRhY2htZW50KS5pc1RpbWVvdXRFbGFwc2VkKG15VGltZVNlcnZpY2Uubm93KCkpOworICAgIHZlcmlmeShteUtleSwgbmV2ZXIoKSkuY2FuY2VsKCk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBteUNoYW5uZWwuY2xvc2UoKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1dyaXRhYmxlS2V5UHJvY2Vzc29yVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvV3JpdGFibGVLZXlQcm9jZXNzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4NDk1MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1dyaXRhYmxlS2V5UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29yczsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVBdHRhY2htZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLldyaXRlVGFzazsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBXcml0YWJsZUtleVByb2Nlc3NvclRlc3QgeworCisgIHByaXZhdGUgU2VsZWN0aW9uS2V5IG15S2V5OworICBwcml2YXRlIFNvY2tldENoYW5uZWwgbXlDaGFubmVsOworICBwcml2YXRlIFdyaXRhYmxlS2V5UHJvY2Vzc29yIG15V3JpdGFibGVLZXlQcm9jZXNzb3I7CisgIHByaXZhdGUgV3JpdGVBdHRhY2htZW50IG15V3JpdGVBdHRhY2htZW50OworICBwcml2YXRlIEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPiBteVF1ZXVlOworCisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBteUtleSA9IG1vY2soU2VsZWN0aW9uS2V5LmNsYXNzKTsKKyAgICBteUNoYW5uZWwgPSBtb2NrKFNvY2tldENoYW5uZWwuY2xhc3MpOworICAgIG15V3JpdGFibGVLZXlQcm9jZXNzb3IgPSBuZXcgV3JpdGFibGVLZXlQcm9jZXNzb3IoKTsKKyAgICB3aGVuKG15S2V5LmNoYW5uZWwoKSkudGhlblJldHVybihteUNoYW5uZWwpOworICAgIHdoZW4obXlLZXkuaW50ZXJlc3RPcHMoKSkudGhlblJldHVybihTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOworICAgIG15V3JpdGVBdHRhY2htZW50ID0gbW9jayhXcml0ZUF0dGFjaG1lbnQuY2xhc3MpOworICAgIG15UXVldWUgPSBtb2NrKEJsb2NraW5nUXVldWUuY2xhc3MpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRoYXRPbldyaXRlRG9uZUludm9rZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwKTsKKworICAgIC8vaW1pdGF0ZSB3cml0aW5nIGJ5dGUgYnVmZmVyCisgICAgd2hlbihteUNoYW5uZWwud3JpdGUoZXEoZGF0YSkpKS50aGVuKG5ldyBBbnN3ZXI8SW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJbnRlZ2VyIGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb25Pbk1vY2spIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBkYXRhLnBvc2l0aW9uKGRhdGEuY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBkYXRhLmNhcGFjaXR5KCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBXcml0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbW9jayhXcml0ZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIHdoZW4obXlRdWV1ZS5wZWVrKCkpLnRoZW5SZXR1cm4obmV3IFdyaXRlVGFzayhteUNoYW5uZWwsIGRhdGEsIGxpc3RlbmVyKSk7CisgICAgd2hlbihteVdyaXRlQXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkpLnRoZW5SZXR1cm4obXlRdWV1ZSk7CisKKyAgICBteUtleS5hdHRhY2gobXlXcml0ZUF0dGFjaG1lbnQpOworCisgICAgbXlXcml0YWJsZUtleVByb2Nlc3Nvci5wcm9jZXNzKG15S2V5KTsKKworICAgIHZlcmlmeShsaXN0ZW5lcikub25Xcml0ZURvbmUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0T25Xcml0ZUZhaWxlZEludm9rZWRJZkNoYW5uZWxUaHJvd0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHdoZW4obXlDaGFubmVsLndyaXRlKGFueShCeXRlQnVmZmVyLmNsYXNzKSkpLnRoZW5UaHJvdyhuZXcgSU9FeGNlcHRpb24oKSk7CisKKyAgICBXcml0ZUxpc3RlbmVyIGxpc3RlbmVyID0gbW9jayhXcml0ZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIHdoZW4obXlRdWV1ZS5wZWVrKCkpLnRoZW5SZXR1cm4obmV3IFdyaXRlVGFzayhteUNoYW5uZWwsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSksIGxpc3RlbmVyKSk7CisgICAgd2hlbihteVdyaXRlQXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkpLnRoZW5SZXR1cm4obXlRdWV1ZSk7CisgICAgbXlLZXkuYXR0YWNoKG15V3JpdGVBdHRhY2htZW50KTsKKworICAgIG15V3JpdGFibGVLZXlQcm9jZXNzb3IucHJvY2VzcyhteUtleSk7CisKKyAgICB2ZXJpZnkobGlzdGVuZXIpLm9uV3JpdGVGYWlsZWQoYW55U3RyaW5nKCksIGFueShUaHJvd2FibGUuY2xhc3MpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNoZWNrVGhhdFdyaXRlVGFza0RvZXNudFJlbW92ZWRJZkJ1ZmZlcklzTm90V3JpdHRlbkluT25lU3RlcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTApOworCisgICAgLy9pbWl0YXRlIHdyaXRpbmcgb25seSBvbmUgYnl0ZSBvZiBieXRlIGJ1ZmZlcgorICAgIHdoZW4obXlDaGFubmVsLndyaXRlKGVxKGRhdGEpKSkudGhlbihuZXcgQW5zd2VyPEludGVnZXI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgSW50ZWdlciBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uT25Nb2NrKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZGF0YS5wb3NpdGlvbihkYXRhLmNhcGFjaXR5KCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIGRhdGEucG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIFdyaXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBtb2NrKFdyaXRlTGlzdGVuZXIuY2xhc3MpOworCisgICAgd2hlbihteVF1ZXVlLnBlZWsoKSkudGhlblJldHVybihuZXcgV3JpdGVUYXNrKG15Q2hhbm5lbCwgZGF0YSwgbGlzdGVuZXIpKTsKKyAgICB3aGVuKG15V3JpdGVBdHRhY2htZW50LmdldFdyaXRlVGFza3MoKSkudGhlblJldHVybihteVF1ZXVlKTsKKworICAgIG15S2V5LmF0dGFjaChteVdyaXRlQXR0YWNobWVudCk7CisKKyAgICBteVdyaXRhYmxlS2V5UHJvY2Vzc29yLnByb2Nlc3MobXlLZXkpOworCisgICAgdmVyaWZ5KGxpc3RlbmVyLCBuZXZlcigpKS5vbldyaXRlRG9uZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvcG9tLnhtbCBiL3R0b3JyZW50LW1hc3Rlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDFiMzMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvcG9tLnhtbApAQCAtMCwwICsxLDIyNyBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5vc3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9zcy1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjc8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT5KYXZhIEJpdFRvcnJlbnQgbGlicmFyeTwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIHR0b3JyZW50IGlzIGEgcHVyZS1KYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCaXRUb3JyZW50IHByb3RvY29sLAorICAgICAgICBpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbCBCRVBzLiBJdCBhbHNvIHByb3ZpZGVzIGEgc3RhbmRhbG9uZSBjbGllbnQsCisgICAgICAgIGEgdHJhY2tlciBhbmQgYSB0b3JyZW50IG1hbmlwdWxhdGlvbiB1dGlsaXR5LgorPCEtLSAgICAgICAgdHRvcnJlbnQg5pivIEJpdFRvcnJlbnQg5Y2P6K6u55qE57qvIEphdmEg5a6e546w44CB5YyF5ous5a+55aSa5LiqIEJFUCDnmoTmlK/mjIHjgILlroPov5jmj5DkvpvkuobkuIDkuKrni6znq4vlrqLmiLfnq6/jgIHot5/ouKrlmajlkowgdG9ycmVudCDmk43kvZzlt6XlhbfjgIItLT4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+bmV0d29yazwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmJlbmNvZGluZzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnR0b3JyZW50LXRyYWNrZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50dG9ycmVudC1jbGllbnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jb21tb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50ZXN0czwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnRlc3QtYXBpPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2xpPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+VHVybiwgSW5jLjwvbmFtZT4KKyAgICAgICAgPHVybD5odHRwOi8vd3d3LnR1cm4uY29tPC91cmw+CisgICAgPC9vcmdhbml6YXRpb24+CisKKyAgICA8c2NtPgorICAgICAgICA8Y29ubmVjdGlvbj5zY206Z2l0OmdpdDovL2dpdGh1Yi5jb20vdHVybi90dG9ycmVudC5naXQ8L2Nvbm5lY3Rpb24+CisgICAgICAgIDx1cmw+aHR0cDovL2dpdGh1Yi5jb20vdHVybi90dG9ycmVudDwvdXJsPgorICAgIDwvc2NtPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIHZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICA8L2xpY2Vuc2VzPgorCisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5HaXRIdWI8L3N5c3RlbT4KKyAgICAgICAgPHVybD5odHRwczovL2dpdGh1Yi5jb20vdHVybi90dG9ycmVudC9pc3N1ZXM8L3VybD4KKyAgICA8L2lzc3VlTWFuYWdlbWVudD4KKworICAgIDxkZXZlbG9wZXJzPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPGlkPm1wZXRhenpvbmk8L2lkPgorICAgICAgICAgICAgPG5hbWU+TWF4aW1lIFBldGF6em9uaTwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5tcGV0YXp6b25pQHR1cm4uY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5idWxpeC5vcmc8L3VybD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+VHVybiwgSW5jPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uVXJsPmh0dHA6Ly93d3cudHVybi5jb208L29yZ2FuaXphdGlvblVybD4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5tYWludGFpbmVyPC9yb2xlPgorICAgICAgICAgICAgICAgIDxyb2xlPmFyY2hpdGVjdDwvcm9sZT4KKyAgICAgICAgICAgICAgICA8cm9sZT5kZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICAgICAgPHRpbWV6b25lPi04PC90aW1lem9uZT4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxwaWNVcmw+aHR0cHM6Ly9zZWN1cmUuZ3JhdmF0YXIuY29tL2F2YXRhci82ZjcwNWUwYzI5OWJjYTI5NDQ0NGRlM2E2YTMzMDhiMzwvcGljVXJsPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICA8L2RldmVsb3BlcnM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgICAgIDxqYXZhLnZlcnNpb24+MS44PC9qYXZhLnZlcnNpb24+CisgICAgICAgIDxtYXZlbi5jb21waWxlci5zb3VyY2U+JHtqYXZhLnZlcnNpb259PC9tYXZlbi5jb21waWxlci5zb3VyY2U+CisgICAgICAgIDxtYXZlbi5jb21waWxlci50YXJnZXQ+JHtqYXZhLnZlcnNpb259PC9tYXZlbi5jb21waWxlci50YXJnZXQ+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPHJlcG9zaXRvcmllcz4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICA8aWQ+amJvc3MtdGhpcmRwYXJ0eS1yZWxlYXNlczwvaWQ+CisgICAgICAgICAgICA8bmFtZT5KQm9zcyBUaGlyZHBhcnR5IFJlbGVhc2VzPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL3JlcG9zaXRvcnkuamJvc3Mub3JnL25leHVzL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3RoaXJkcGFydHktcmVsZWFzZXMvPC91cmw+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8L3JlcG9zaXRvcmllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTIuMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTE8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zaW1wbGVmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjEuMjE8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnRlc3RuZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjYuOC44PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc2Y8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXJnczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpldGJyYWluczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFubm90YXRpb25zLWphdmE1PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+UkVMRUFTRTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxkZWZhdWx0R29hbD5wYWNrYWdlPC9kZWZhdWx0R29hbD4KKyAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L2J1aWxkPC9kaXJlY3Rvcnk+CisKKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2phdmEudmVyc2lvbn08L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+JHtqYXZhLnZlcnNpb259PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorCisgICAgICAgIDxwbHVnaW5zPgorPCEtLSAgICAgICAgICAgIDxwbHVnaW4+LS0+Cis8IS0tICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4tLT4KKzwhLS0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPi0tPgorPCEtLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4tLT4KKzwhLS0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+LS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPi0tPgorPCEtLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjY8L3RhcmdldD4tLT4KKzwhLS0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPi0tPgorPCEtLSAgICAgICAgICAgIDwvcGx1Z2luPi0tPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xMi4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG14NzY4TTwvYXJnTGluZT4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbS50dXJuLnR0b3JyZW50LmxvZ0xldmVsPiR7dGVzdExvZ0xldmVsfTwvY29tLnR1cm4udHRvcnJlbnQubG9nTGV2ZWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8amF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI+JHtqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcn0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YnVpbGREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX08L2J1aWxkRGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LWRlcGVuZGVuY2llczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJlcGFyZS1wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5LWRlcGVuZGVuY2llczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGVSZWxlYXNlcz5mYWxzZTwvb3ZlcldyaXRlUmVsZWFzZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZVNuYXBzaG90cz5mYWxzZTwvb3ZlcldyaXRlU25hcHNob3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGVJZk5ld2VyPnRydWU8L292ZXJXcml0ZUlmTmV3ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkQ2xhc3NwYXRoPnRydWU8L2FkZENsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxjbGFzc3BhdGhQcmVmaXg+bGliPC9jbGFzc3BhdGhQcmVmaXg+IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1haW5DbGFzcz50ZXN0Lm9yZy5DbGllbnRlPC9tYWluQ2xhc3M+IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENsYXNzLVBhdGg+bGliLzwvQ2xhc3MtUGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvcG9tLnhtbCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDc3MjIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvcG9tLnhtbApAQCAtMCwwICsxLDI2IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC90ZXN0LWFwaTwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly90dXJuLmdpdGh1Yi5jb20vdHRvcnJlbnQvPC91cmw+CisgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdGVzdC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L01vY2tUaW1lU2VydmljZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvTW9ja1RpbWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MDZkNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L01vY2tUaW1lU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVGltZVNlcnZpY2U7CisKK3B1YmxpYyBjbGFzcyBNb2NrVGltZVNlcnZpY2UgaW1wbGVtZW50cyBUaW1lU2VydmljZSB7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHRpbWUgPSAwOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBub3coKSB7CisgICAgcmV0dXJuIHRpbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUaW1lKGxvbmcgdGltZSkgeworICAgIHRoaXMudGltZSA9IHRpbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1RlbXBGaWxlcy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvVGVtcEZpbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1RlbXBGaWxlcy5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQGF1dGhvciBQYXZlbC5TaGVyCisgKiBEYXRlOiAwNS4wMy4yMDA4CisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wRmlsZXMgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIG91ckN1cnJlbnRUZW1wRGlyID0gRmlsZVV0aWxzLmdldFRlbXBEaXJlY3RvcnkoKTsKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlIG15Q3VycmVudFRlbXBEaXI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIG91clJhbmRvbTsKKworICBzdGF0aWMgeworICAgIG91clJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICBvdXJSYW5kb20uc2V0U2VlZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZT4gbXlGaWxlc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICBwcml2YXRlIGZpbmFsIFRocmVhZCBteVNodXRkb3duSG9vazsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG15SW5zaWRlU2h1dGRvd25Ib29rOworCisgIHB1YmxpYyBUZW1wRmlsZXMoKSB7CisgICAgbXlDdXJyZW50VGVtcERpciA9IG91ckN1cnJlbnRUZW1wRGlyOworICAgIGlmICghbXlDdXJyZW50VGVtcERpci5pc0RpcmVjdG9yeSgpKSB7CisKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXAgZGlyZWN0b3J5IGlzIG5vdCBhIGRpcmVjdG9yeSwgd2FzIGRlbGV0ZWQgYnkgc29tZSBwcm9jZXNzOiAiICsgbXlDdXJyZW50VGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArCisgICAgICAgICAgICAgICJcbmphdmEuaW8udG1wZGlyOiAiICsgRmlsZVV0aWxzLmdldFRlbXBEaXJlY3RvcnkoKSk7CisgICAgfQorCisgICAgbXlTaHV0ZG93bkhvb2sgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbXlJbnNpZGVTaHV0ZG93bkhvb2sgPSB0cnVlOworICAgICAgICBjbGVhbnVwKCk7CisgICAgICB9CisgICAgfSk7CisgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG15U2h1dGRvd25Ib29rKTsKKyAgfQorCisgIHByaXZhdGUgRmlsZSBkb0NyZWF0ZVRlbXBEaXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4OworICAgIHN1ZmZpeCA9IHN1ZmZpeCA9PSBudWxsID8gIi50bXAiIDogc3VmZml4OworCisgICAgZG8geworICAgICAgaW50IGNvdW50ID0gb3VyUmFuZG9tLm5leHRJbnQoKTsKKyAgICAgIGZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKG15Q3VycmVudFRlbXBEaXIsIHByZWZpeCArIGNvdW50ICsgc3VmZml4KTsKKyAgICAgIGlmICghZi5leGlzdHMoKSAmJiBmLm1rZGlycygpKSB7CisgICAgICAgIHJldHVybiBmLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICh0cnVlKTsKKworICB9CisKKyAgcHJpdmF0ZSBGaWxlIGRvQ3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlIGZpbGUgPSBkb0NyZWF0ZVRlbXBEaXIocHJlZml4LCBzdWZmaXgpOworICAgIGZpbGUuZGVsZXRlKCk7CisgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgcmV0dXJuIGZpbGU7CisgIH0KKworICBwdWJsaWMgZmluYWwgRmlsZSBjcmVhdGVUZW1wRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZSB0ZW1wRmlsZSA9IGRvQ3JlYXRlVGVtcEZpbGUoInRlc3QiLCBudWxsKTsKKyAgICByZWdpc3RlckFzVGVtcEZpbGUodGVtcEZpbGUpOworICAgIHJldHVybiB0ZW1wRmlsZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNUZW1wRmlsZShmaW5hbCBGaWxlIHRlbXBGaWxlKSB7CisgICAgbXlGaWxlc1RvRGVsZXRlLmFkZCh0ZW1wRmlsZSk7CisgIH0KKworICBwdWJsaWMgZmluYWwgRmlsZSBjcmVhdGVUZW1wRmlsZShpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRlbXBGaWxlID0gY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBpbnQgYnVmTGVuID0gTWF0aC5taW4oOCAqIDEwMjQsIHNpemUpOworICAgIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgaWYgKGJ1ZkxlbiA9PSAwKSByZXR1cm4gdGVtcEZpbGU7CisgICAgZmluYWwgT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSkpOworICAgIHRyeSB7CisgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbYnVmTGVuXTsKKworICAgICAgaW50IG51bVdyaXR0ZW4gPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC8gYnVmLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgICAgZm9zLndyaXRlKGJ1Zik7CisgICAgICAgIG51bVdyaXR0ZW4gKz0gYnVmLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgaWYgKHNpemUgPiBudW1Xcml0dGVuKSB7CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgc2l6ZSAtIG51bVdyaXR0ZW4pOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBmb3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcEZpbGU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciBjcmVhdGVkIHRlbXAgZGlyZWN0b3J5LgorICAgKiBBbHNvIHN0b3JlcyB0aGUgdmFsdWUgaW50byB0aGlzIG9iamVjdCBhY2Nlc3NlZCB3aXRoIHtAbGluayAjZ2V0Q3VycmVudFRlbXBEaXIoKX0KKyAgICoKKyAgICogQHJldHVybiBhIEZpbGUgb2JqZWN0IGZvciBjcmVhdGVkIHRlbXAgZGlyZWN0b3J5CisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxzLgorICAgKi8KKyAgcHVibGljIGZpbmFsIEZpbGUgY3JlYXRlVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZSBmID0gZG9DcmVhdGVUZW1wRGlyKCJ0ZXN0IiwgIiIpOworICAgIHJlZ2lzdGVyQXNUZW1wRmlsZShmKTsKKyAgICByZXR1cm4gZjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSB0ZXN0IG9yIG51bGwgaWYgbm8gdGVzdCBpcyBydW5uaW5nIG9yIG5vIGRpcmVjdG9yeSBpcyBjcmVhdGVkIHlldC4KKyAgICoKKyAgICogQHJldHVybiBzZWUgYWJvdmUKKyAgICovCisgIHB1YmxpYyBGaWxlIGdldEN1cnJlbnRUZW1wRGlyKCkgeworICAgIHJldHVybiBteUN1cnJlbnRUZW1wRGlyOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICB0cnkgeworICAgICAgZm9yIChGaWxlIGZpbGUgOiBteUZpbGVzVG9EZWxldGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBGaWxlVXRpbHMuZm9yY2VEZWxldGUoZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBteUZpbGVzVG9EZWxldGUuY2xlYXIoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKCFteUluc2lkZVNodXRkb3duSG9vaykgeworICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5yZW1vdmVTaHV0ZG93bkhvb2sobXlTaHV0ZG93bkhvb2spOworICAgICAgfQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1V0aWxzLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2UwZjEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOworCitwdWJsaWMgY2xhc3MgVXRpbHMgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dfUFJPUEVSVFlfS0VZID0gImNvbS50dXJuLnR0b3JyZW50LmxvZ0xldmVsIjsKKworICBwdWJsaWMgc3RhdGljIExldmVsIGdldExvZ0xldmVsKCkgeworICAgIGZpbmFsIFN0cmluZyBsZXZlbFN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShMT0dfUFJPUEVSVFlfS0VZKTsKKyAgICByZXR1cm4gTGV2ZWwudG9MZXZlbChsZXZlbFN0ciwgTGV2ZWwuSU5GTyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1dhaXRGb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1dhaXRGb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI5MzliCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvV2FpdEZvci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXYWl0Rm9yIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBPTExfSU5URVJWQUwgPSA1MDA7CisKKyAgcHJpdmF0ZSBib29sZWFuIG15UmVzdWx0ID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIFdhaXRGb3IoKSB7CisgICAgdGhpcyg2MCAqIDEwMDApOworICB9CisKKyAgcHJvdGVjdGVkIFdhaXRGb3IobG9uZyB0aW1lb3V0KSB7CisgICAgbG9uZyBtYXhUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OworICAgIHRyeSB7CisgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBtYXhUaW1lICYmICFjb25kaXRpb24oKSkgeworICAgICAgICBUaHJlYWQuc2xlZXAoUE9MTF9JTlRFUlZBTCk7CisgICAgICB9CisgICAgICBpZiAoY29uZGl0aW9uKCkpIHsKKyAgICAgICAgbXlSZXN1bHQgPSB0cnVlOworICAgICAgfQorICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc015UmVzdWx0KCkgeworICAgIHJldHVybiBteVJlc3VsdDsKKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbmRpdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZlY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPG5hbWU+dHRvcnJlbnQvY29tbW9uPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC10ZXN0czwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC10ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9Db21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0NvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNGJlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9Db21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbW11bmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIENvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeSB7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9QT09MX1NJWkUgPSAxMDsKKworICBwdWJsaWMgQ29tbXVuaWNhdGlvbk1hbmFnZXIgZ2V0Q2xpZW50KFN0cmluZyBuYW1lKSB7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoCisgICAgICAgICAgICBERUZBVUxUX1BPT0xfU0laRSwgREVGQVVMVF9QT09MX1NJWkUsCisgICAgICAgICAgICAwTCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLAorICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KDQwMDApKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgcGllY2VWYWxpZGF0b3JFeGVjdXRvciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoCisgICAgICAgICAgICBERUZBVUxUX1BPT0xfU0laRSwgREVGQVVMVF9QT09MX1NJWkUsCisgICAgICAgICAgICAwTCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLAorICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KDQwMCkpOworICAgIHJldHVybiBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXhlY3V0b3JTZXJ2aWNlLCBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKworICAgICAgICBpbnQgdGltZW91dCA9IDYwOworICAgICAgICBUaW1lVW5pdCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgICAgIHBpZWNlVmFsaWRhdG9yRXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghcGllY2VWYWxpZGF0b3JFeGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKHRpbWVvdXQsIHRpbWVVbml0KSkgeworICAgICAgICAgICAgICBsb2dnZXIud2FybigidW5hYmxlIHRvIHRlcm1pbmF0ZSBleGVjdXRvciBzZXJ2aWNlIGluIHt9IHt9IiwgdGltZW91dCwgdGltZVVuaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBzaHV0ZG93bkNvcnJlY3RseSA9IGV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgICAgICAgICAgIGlmICghc2h1dGRvd25Db3JyZWN0bHkpIHsKKyAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oInVuYWJsZSB0byB0ZXJtaW5hdGUgZXhlY3V0b3Igc2VydmljZSBpbiB7fSB7fSIsIHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuYWJsZSB0byBhd2FpdCB0ZXJtaW5hdGlvbiBleGVjdXRvciBzZXJ2aWNlLCB0aHJlYWQgd2FzIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9EdW1teVBlZXJBY3Rpdml0eUxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9EdW1teVBlZXJBY3Rpdml0eUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhMDhiNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0R1bW15UGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlBlZXJBY3Rpdml0eUxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCitwdWJsaWMgY2xhc3MgRHVtbXlQZWVyQWN0aXZpdHlMaXN0ZW5lciBpbXBsZW1lbnRzIFBlZXJBY3Rpdml0eUxpc3RlbmVyIHsKKworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQZWVyQ2hva2VkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBlZXJSZWFkeShTaGFyaW5nUGVlciBwZWVyKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZnRlclBlZXJSZW1vdmVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVCaXRmaWVsZEF2YWlsYWJpbGl0eShTaGFyaW5nUGVlciBwZWVyLCBCaXRTZXQgYXZhaWxhYmxlUGllY2VzKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZVNlbnQoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGVlckRpc2Nvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVJT0V4Y2VwdGlvbihTaGFyaW5nUGVlciBwZWVyLCBJT0V4Y2VwdGlvbiBpb2UpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZU5ld1BlZXJDb25uZWN0ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db21tdW5pY2F0aW9uTWFuYWdlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db21tdW5pY2F0aW9uTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2JjMjViCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUwOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC4qOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5GaWxlU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5GdWxseVBpZWNlU3RvcmFnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5QZWVyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkZpcnN0QXZhaWxhYmxlQ2hhbm5lbDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlNlcnZlckNoYW5uZWxSZWdpc3RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZWRQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNoZWNrc3VtOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LkNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeS5ERUZBVUxUX1BPT0xfU0laRTsKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyLkFOTk9VTkNFX1VSTDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworLyoqCisgKiBAYXV0aG9yIFNlcmdleS5QYWsKKyAqIERhdGU6IDcvMjYvMTMKKyAqIFRpbWU6IDI6MzIgUE0KKyAqLworQFRlc3QodGltZU91dCA9IDYwMDAwMCkKK3B1YmxpYyBjbGFzcyBDb21tdW5pY2F0aW9uTWFuYWdlclRlc3QgeworCisgIHByaXZhdGUgQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5IGNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeTsKKworICBwcml2YXRlIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0VTID0gInNyYy90ZXN0L3Jlc291cmNlcyI7CisgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworICBwcml2YXRlIFRlbXBGaWxlcyB0ZW1wRmlsZXM7CisKKyAgcHVibGljIENvbW11bmljYXRpb25NYW5hZ2VyVGVzdCgpIHsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5KCk7CisgICAgaWYgKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICByZXR1cm47CisgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIobmV3IFBhdHRlcm5MYXlvdXQoIlslZHtNTWRkIEhIOm1tOnNzLFNTU30gJXRdICU2cCAtICUyMC4yMGMgLSAlbSAlbiIpKSk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0ZW1wRmlsZXMgPSBuZXcgVGVtcEZpbGVzKCk7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4oKTsKKyAgICBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnNldExldmVsKFV0aWxzLmdldExvZ0xldmVsKCkpOworICAgIHN0YXJ0VHJhY2tlcigpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNhdmVUb3JyZW50KFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50LCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICBmb3Mud3JpdGUobmV3IFRvcnJlbnRTZXJpYWxpemVyKCkuc2VyaWFsaXplKHRvcnJlbnQpKTsKKyAgICBmb3MuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0U2VlZGVySXNOb3RSZWNlaXZlZEhhdmVNZXNzYWdlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSB3b3JrZXJFUyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMTApOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSB2YWxpZGF0b3JFUyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNCk7CisgICAgZmluYWwgQXRvbWljQm9vbGVhbiBpc1NlZWRlclJlY2VpdmVkSGF2ZU1lc3NhZ2UgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKHdvcmtlckVTLCB2YWxpZGF0b3JFUykgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTaGFyaW5nUGVlciBjcmVhdGVTaGFyaW5nUGVlcihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIEJ5dGVCdWZmZXIgcGVlcklkLCBTaGFyZWRUb3JyZW50IHRvcnJlbnQsIEJ5dGVDaGFubmVsIGNoYW5uZWwsIFN0cmluZyBjbGllbnRJZGVudGlmaWVyLCBpbnQgY2xpZW50VmVyc2lvbikgeworICAgICAgICByZXR1cm4gbmV3IFNoYXJpbmdQZWVyKGhvc3QsIHBvcnQsIHBlZXJJZCwgdG9ycmVudCwgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSwgdGhpcywgY2hhbm5lbCwgIlRPIiwgMTIzNCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVNZXNzYWdlKFBlZXJNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIFBlZXJNZXNzYWdlLkhhdmVNZXNzYWdlKSB7CisgICAgICAgICAgICAgIGlzU2VlZGVyUmVjZWl2ZWRIYXZlTWVzc2FnZS5zZXQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICAgICAgd29ya2VyRVMuc2h1dGRvd24oKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd24oKTsKKyAgICAgIH0KKyAgICB9OworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoc2VlZGVyKTsKKworICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoMTAwICogMTAyNSAqIDEwMjQpOworICAgIFVSTCBhbm5vdW5jZSA9IG5ldyBVUkwoImh0dHA6Ly8xMjcuMC4wLjE6Njk2OS9hbm5vdW5jZSIpOworICAgIFVSSSBhbm5vdW5jZVVSSSA9IGFubm91bmNlLnRvVVJJKCk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgYW5ub3VuY2VVUkksICJUZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgd2FpdEZvclNlZWRlcklzQW5ub3Vuc2VkT25UcmFja2VyKHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCAxNSk7CisgICAgYXNzZXJ0RmFsc2UoaXNTZWVkZXJSZWNlaXZlZEhhdmVNZXNzYWdlLmdldCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3YWl0RG93bmxvYWRDb21wbGV0ZShUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciwgaW50IHRpbWVvdXRTZWMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgZmluYWwgU2VtYXBob3JlIHNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgVG9ycmVudExpc3RlbmVyV3JhcHBlciBsaXN0ZW5lciA9IG5ldyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb3dubG9hZENvbXBsZXRlKCkgeworICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgfQorICAgIH07CisgICAgdHJ5IHsKKyAgICAgIHRvcnJlbnRNYW5hZ2VyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgIGJvb2xlYW4gcmVzID0gc2VtYXBob3JlLnRyeUFjcXVpcmUodGltZW91dFNlYywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICBpZiAoIXJlcykgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBkb3dubG9hZCBmaWxlIGluICIgKyB0aW1lb3V0U2VjICsgIiBzZWNvbmRzIik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRvcnJlbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd2FpdEZvclNlZWRlcklzQW5ub3Vuc2VkT25UcmFja2VyKGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIGZpbmFsIFdhaXRGb3Igd2FpdEZvciA9IG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50KGhleEluZm9IYXNoKSAhPSBudWxsOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSk7CisgIH0KKworCisgIC8vICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSA1MCkKKyAgcHVibGljIHZvaWQgZG93bmxvYWRfbXVsdGlwbGVfZmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24geworICAgIGludCBudW1GaWxlcyA9IDUwOworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBmaW5hbCBGaWxlIHNyY0RpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoInNlZWRlciIpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBudWxsOworCisKKyAgICB0cnkgeworICAgICAgVVJMIGFubm91bmNlID0gbmV3IFVSTCgiaHR0cDovLzEyNy4wLjAuMTo2OTY5L2Fubm91bmNlIik7CisgICAgICBVUkkgYW5ub3VuY2VVUkkgPSBhbm5vdW5jZS50b1VSSSgpOworICAgICAgZmluYWwgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICBMaXN0PEZpbGU+IGZpbGVzVG9TaGFyZSA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykgeworICAgICAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQpOworICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIHRlbXBGaWxlLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGVtcEZpbGUucmVuYW1lVG8oc3JjRmlsZSkpOworCisgICAgICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHNyY0ZpbGUsIGFubm91bmNlVVJJLCAiVGVzdCIpOworICAgICAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoc3JjRmlsZS5nZXRQYXJlbnRGaWxlKCksIHNyY0ZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICAgICAgZmlsZXNUb1NoYXJlLmFkZChzcmNGaWxlKTsKKyAgICAgICAgbmFtZXMuYWRkKHNyY0ZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChGaWxlIGYgOiBmaWxlc1RvU2hhcmUpIHsKKyAgICAgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50RmlsZSgpLCBmLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgICAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZi5nZXRQYXJlbnQoKSk7CisgICAgICB9CisgICAgICBsZWVjaCA9IGNyZWF0ZUNsaWVudCgibGVlY2hlciIpOworICAgICAgbGVlY2guc3RhcnQobmV3IEluZXRBZGRyZXNzW117SW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCl9LCA1LCBudWxsLCBuZXcgU2VsZWN0b3JGYWN0b3J5SW1wbCgpKTsKKyAgICAgIGZvciAoRmlsZSBmIDogZmlsZXNUb1NoYXJlKSB7CisgICAgICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShmLmdldFBhcmVudEZpbGUoKSwgZi5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICAgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgfQorCisgICAgICBuZXcgV2FpdEZvcig2MCAqIDEwMDApIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKworICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHN0cmluZ3MgPSBsaXN0RmlsZU5hbWVzKGRvd25sb2FkRGlyKTsKKyAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJ0SXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3RyaW5ncykgeworICAgICAgICAgICAgaWYgKHMuZW5kc1dpdGgoIi5wYXJ0IikpIHsKKyAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgcGFydEl0ZW1zLmFkZChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNvdW50IDwgNSkgeworCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiQ291bnQ6ICVkLiBJdGVtczogJXMlbiIsIGNvdW50LCBBcnJheXMudG9TdHJpbmcocGFydEl0ZW1zLnRvQXJyYXkoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gc3RyaW5ncy5jb250YWluc0FsbChuYW1lcyk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGFzc2VydEVxdWFscyhsaXN0RmlsZU5hbWVzKGRvd25sb2FkRGlyKSwgbmFtZXMpOworICAgIH0gZmluYWxseSB7CisgICAgICBsZWVjaC5zdG9wKCk7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU2V0PFN0cmluZz4gbGlzdEZpbGVOYW1lcyhGaWxlIGRvd25sb2FkRGlyKSB7CisgICAgaWYgKGRvd25sb2FkRGlyID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIEZpbGVbXSBmaWxlcyA9IGRvd25sb2FkRGlyLmxpc3RGaWxlcygpOworICAgIGlmIChmaWxlcyA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7CisgICAgICBuYW1lcy5hZGQoZi5nZXROYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gbmFtZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SHVuZ1NlZWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUwMCAqIDEwMjUgKiAxMDI0KTsKKyAgICBVUkwgYW5ub3VuY2UgPSBuZXcgVVJMKCJodHRwOi8vMTI3LjAuMC4xOjY5NjkvYW5ub3VuY2UiKTsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBhbm5vdW5jZS50b1VSSSgpOworCisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIGFubm91bmNlVVJJLCAiVGVzdCIpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlbXBGaWxlLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGdvb2RTZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBnb29kU2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpLCBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworCisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxMCk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBodW5nU2VlZGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGVzLCB2YWxpZGF0b3JFUykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIGVzLnNodXRkb3duTm93KCk7CisgICAgICAgIHZhbGlkYXRvckVTLnNodXRkb3duTm93KCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFNoYXJpbmdQZWVyIGNyZWF0ZVNoYXJpbmdQZWVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgQnl0ZUJ1ZmZlciBwZWVySWQsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCwgQnl0ZUNoYW5uZWwgY2hhbm5lbCwgU3RyaW5nIGNsaWVudElkZW50aWZpZXIsIGludCBjbGllbnRWZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU2hhcmluZ1BlZXIoaG9zdCwgcG9ydCwgcGVlcklkLCB0b3JyZW50LCBnZXRDb25uZWN0aW9uTWFuYWdlcigpLCB0aGlzLCBjaGFubmVsLCBjbGllbnRJZGVudGlmaWVyLCBjbGllbnRWZXJzaW9uKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShQZWVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZSkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5oYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfQorICAgIH07CisgICAgaHVuZ1NlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZS5nZXRQYXJlbnQoKSwgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKworICAgIGZpbmFsIEZpbGUgZG93bmxvYWREaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIEVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisKKyAgICB0cnkgeworICAgICAgaHVuZ1NlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBnb29kU2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIGFzc2VydEZpbGVzRXF1YWwodGVtcEZpbGUsIG5ldyBGaWxlKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZ29vZFNlZWRlci5zdG9wKCk7CisgICAgICBsZWVjaC5zdG9wKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgbGFyZ2VfZmlsZV9kb3dubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoMjAxICogMTAyNSAqIDEwMjQpOworICAgIFVSTCBhbm5vdW5jZSA9IG5ldyBVUkwoImh0dHA6Ly8xMjcuMC4wLjE6Njk2OS9hbm5vdW5jZSIpOworICAgIFVSSSBhbm5vdW5jZVVSSSA9IGFubm91bmNlLnRvVVJJKCk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgYW5ub3VuY2VVUkksICJUZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpLCBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworCisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKworICAgIHRyeSB7CisgICAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgICAgbGVlY2guc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICB3YWl0Rm9yRmlsZUluRGlyKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RmlsZXNFcXVhbCh0ZW1wRmlsZSwgbmV3IEZpbGUoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSkpOworICAgIH0gZmluYWxseSB7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgICAgbGVlY2guc3RvcCgpOworICAgIH0KKyAgfQorCisgIC8vIFRPRE86IDI0LjA5LjIwMTggZmxha3kgdGVzdCwgaXQncyBuZWVkZWQgdG8gZGVidWcgYW5kIGZpeAorICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIHRlc3RNYW55TGVlY2hlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDQwMCAqIDEwMjUgKiAxMDI0KTsKKyAgICBVUkwgYW5ub3VuY2UgPSBuZXcgVVJMKCJodHRwOi8vMTI3LjAuMC4xOjY5NjkvYW5ub3VuY2UiKTsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBhbm5vdW5jZS50b1VSSSgpOworCisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIGFubm91bmNlVVJJLCAiVGVzdCIpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlbXBGaWxlLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZS5nZXRQYXJlbnQoKSwgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKworICAgIExpc3Q8TWFwLkVudHJ5PENvbW11bmljYXRpb25NYW5hZ2VyLCBGaWxlPj4gbGVlY2hlcnMgPSBuZXcgQXJyYXlMaXN0PE1hcC5FbnRyeTxDb21tdW5pY2F0aW9uTWFuYWdlciwgRmlsZT4+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIGZpbmFsIEZpbGUgZG93bmxvYWREaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDbGllbnQoKTsKKyAgICAgIGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldEFic29sdXRlUGF0aCgpLCBFbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworICAgICAgbGVlY2hlcnMuYWRkKG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTxDb21tdW5pY2F0aW9uTWFuYWdlciwgRmlsZT4obGVlY2gsIGRvd25sb2FkRGlyKSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxDb21tdW5pY2F0aW9uTWFuYWdlciwgRmlsZT4gZW50cnkgOiBsZWVjaGVycykgeworICAgICAgICBlbnRyeS5nZXRLZXkoKS5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoTWFwLkVudHJ5PENvbW11bmljYXRpb25NYW5hZ2VyLCBGaWxlPiBsZWVjaGVyIDogbGVlY2hlcnMpIHsKKyAgICAgICAgRmlsZSBkb3dubG9hZERpciA9IGxlZWNoZXIuZ2V0VmFsdWUoKTsKKyAgICAgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RmlsZXNFcXVhbCh0ZW1wRmlsZSwgbmV3IEZpbGUoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSkpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgICAgZm9yIChNYXAuRW50cnk8Q29tbXVuaWNhdGlvbk1hbmFnZXIsIEZpbGU+IGUgOiBsZWVjaGVycykgeworICAgICAgICBlLmdldEtleSgpLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAVGVzdChlbmFibGVkID0gZmFsc2UpCisgIHB1YmxpYyB2b2lkIGVuZGdhbWVNb2RlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgZmluYWwgaW50IG51bVNlZWRlcnMgPSAyOworICAgIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IHNlZWRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPigpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgc2tpcFBpZWNlc0NvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZWVkZXJzOyBpKyspIHsKKyAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBlcyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMTApOworICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihlcywgdmFsaWRhdG9yRVMpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICAgIGVzLnNodXRkb3duTm93KCk7CisgICAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2hhcmluZ1BlZXIgY3JlYXRlU2hhcmluZ1BlZXIoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBCeXRlQnVmZmVyIHBlZXJJZCwgU2hhcmVkVG9ycmVudCB0b3JyZW50LCBCeXRlQ2hhbm5lbCBjaGFubmVsLCBTdHJpbmcgY2xpZW50SWRlbnRpZmllciwgaW50IGNsaWVudFZlcnNpb24pIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFNoYXJpbmdQZWVyKGhvc3QsIHBvcnQsIHBlZXJJZCwgdG9ycmVudCwgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSwgdGhpcywgY2hhbm5lbCwgIlRPIiwgMTIzNCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZW5kKFBlZXJNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFBlZXJNZXNzYWdlLlBpZWNlTWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChza2lwUGllY2VzQ291bnQuZ2V0QW5kRGVjcmVtZW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN1cGVyLnNlbmQobWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIHNlZWRlcnMuYWRkKHNlZWRlcik7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuYWRkKHNlZWRlcik7CisgICAgfQorICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoMTAyNCAqIDIwICogMTAyNCk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgdGhpcy50cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZWVkZXJzOyBpKyspIHsKKyAgICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gc2VlZGVycy5nZXQoaSk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgfQorCisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaC5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRQYXJlbnQoKSk7CisgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDIwKTsKKworICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSk7CisKKyAgfQorCisKKyAgcHVibGljIHZvaWQgbW9yZV90aGFuX29uZV9zZWVkZXJfZm9yX3NhbWVfdG9ycmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHRoaXMudHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKS5zaXplKCkpOworCisgICAgZmluYWwgaW50IG51bVNlZWRlcnMgPSA1OworICAgIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IHNlZWRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VlZGVyczsgaSsrKSB7CisgICAgICBzZWVkZXJzLmFkZChjcmVhdGVDbGllbnQoKSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoMTAwICogMTAyNCk7CisKKyAgICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCB0aGlzLnRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKyAgICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlbXBGaWxlLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlZWRlcnM7IGkrKykgeworICAgICAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA9IHNlZWRlcnMuZ2V0KGkpOworICAgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIH0KKworICAgICAgbmV3IFdhaXRGb3IoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgZm9yIChUcmFja2VkVG9ycmVudCB0dCA6IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkpIHsKKyAgICAgICAgICAgIGlmICh0dC5nZXRQZWVycygpLnNpemUoKSA9PSBudW1TZWVkZXJzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIENvbGxlY3Rpb248VHJhY2tlZFRvcnJlbnQ+IHRvcnJlbnRzID0gdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpOworICAgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnRzLnNpemUoKSwgMSk7CisgICAgICBhc3NlcnRFcXVhbHMobnVtU2VlZGVycywgdG9ycmVudHMuaXRlcmF0b3IoKS5uZXh0KCkuc2VlZGVycygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZm9yIChDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA6IHNlZWRlcnMpIHsKKyAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRoYXREb3dubG9hZFN0YXRpc3RpY1Byb3ZpZGVkVG9UcmFja2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woOCk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50T2ZUcmFja2VyUmVzcG9uc2VzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihleGVjdXRvclNlcnZpY2UsIHZhbGlkYXRvckVTKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZURpc2NvdmVyZWRQZWVycyhMaXN0PFBlZXI+IHBlZXJzLCBTdHJpbmcgaGV4SW5mb0hhc2gpIHsKKyAgICAgICAgc3VwZXIuaGFuZGxlRGlzY292ZXJlZFBlZXJzKHBlZXJzLCBoZXhJbmZvSGFzaCk7CisgICAgICAgIGNvdW50T2ZUcmFja2VyUmVzcG9uc2VzLmluY3JlbWVudEFuZEdldCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgICAgIHZhbGlkYXRvckVTLnNodXRkb3duTm93KCk7CisgICAgICB9CisgICAgfTsKKworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQobGVlY2hlcik7CisKKyAgICBmaW5hbCBpbnQgZmlsZVNpemUgPSAyICogMTAyNSAqIDEwMjQ7CisgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZShmaWxlU2l6ZSk7CisgICAgVVJMIGFubm91bmNlID0gbmV3IFVSTCgiaHR0cDovLzEyNy4wLjAuMTo2OTY5L2Fubm91bmNlIik7CisgICAgVVJJIGFubm91bmNlVVJJID0gYW5ub3VuY2UudG9VUkkoKTsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCBhbm5vdW5jZVVSSSwgIlRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZW1wRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBTdHJpbmcgaGFzaCA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSkuZ2V0SGV4SW5mb0hhc2goKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBmaW5hbCBMb2FkZWRUb3JyZW50IGFubm91bmNlYWJsZVRvcnJlbnQgPSBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmdldExvYWRlZFRvcnJlbnQoaGFzaCk7CisKKyAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHNoYXJlZFRvcnJlbnQgPSBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLnB1dElmQWJzZW50QWN0aXZlVG9ycmVudChhbm5vdW5jZWFibGVUb3JyZW50LmdldFRvcnJlbnRIYXNoKCkuZ2V0SGV4SW5mb0hhc2goKSwKKyAgICAgICAgICAgIGxlZWNoZXIuZ2V0VG9ycmVudExvYWRlcigpLmxvYWRUb3JyZW50KGFubm91bmNlYWJsZVRvcnJlbnQpKTsKKworICAgIHNoYXJlZFRvcnJlbnQuaW5pdCgpOworCisgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50T2ZUcmFja2VyUmVzcG9uc2VzLmdldCgpID09IDE7CisgICAgICB9CisgICAgfTsKKworICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHRyYWNrZWRUb3JyZW50ID0gdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudChhbm5vdW5jZWFibGVUb3JyZW50LmdldFRvcnJlbnRIYXNoKCkuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFRvcnJlbnQuZ2V0UGVlcnMoKS5zaXplKCksIDEpOworCisgICAgZmluYWwgVHJhY2tlZFBlZXIgdHJhY2tlZFBlZXIgPSB0cmFja2VkVG9ycmVudC5nZXRQZWVycygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldFVwbG9hZGVkKCksIDApOworICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXREb3dubG9hZGVkKCksIDApOworICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXRMZWZ0KCksIGZpbGVTaXplKTsKKworICAgIFBpZWNlIHBpZWNlID0gc2hhcmVkVG9ycmVudC5nZXRQaWVjZSgxKTsKKyAgICBzaGFyZWRUb3JyZW50LmhhbmRsZVBpZWNlQ29tcGxldGVkKG51bGwsIHBpZWNlKTsKKyAgICBzaGFyZWRUb3JyZW50Lm1hcmtDb21wbGV0ZWQocGllY2UpOworCisgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50T2ZUcmFja2VyUmVzcG9uc2VzLmdldCgpID49IDI7CisgICAgICB9CisgICAgfTsKKyAgICBpbnQgZG93bmxvYWRlZCA9IDUxMiAqIDEwMjQ7Ly9vbmUgcGllY2UKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0VXBsb2FkZWQoKSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldERvd25sb2FkZWQoKSwgZG93bmxvYWRlZCk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldExlZnQoKSwgZmlsZVNpemUgLSBkb3dubG9hZGVkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG5vX2Z1bGxfc2VlZGVyX3Rlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIGludCBwaWVjZVNpemUgPSA0OCAqIDEwMjQ7IC8vIGxvd2VyIHBpZWNlIHNpemUgdG8gcmVkdWNlIGRpc2sgdXNhZ2UKKyAgICBmaW5hbCBpbnQgbnVtU2VlZGVycyA9IDY7CisgICAgZmluYWwgaW50IHBpZWNlc0NvdW50ID0gbnVtU2VlZGVycyAqIDMgKyAxNTsKKworICAgIGZpbmFsIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IGNsaWVudHNMaXN0OworICAgIGNsaWVudHNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4ocGllY2VzQ291bnQpOworCisgICAgZmluYWwgTWVzc2FnZURpZ2VzdCBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKworICAgIHRyeSB7CisgICAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKHBpZWNlc0NvdW50ICogcGllY2VTaXplKTsKKyAgICAgIExpc3Q8RmlsZT4gdGFyZ2V0RmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisKKyAgICAgIFN0cmluZyBoYXNoID0gY3JlYXRlTXVsdGlwbGVTZWVkZXJzV2l0aERpZmZlcmVudFBpZWNlcyh0ZW1wRmlsZSwgcGllY2VzQ291bnQsIHBpZWNlU2l6ZSwgbnVtU2VlZGVycywgY2xpZW50c0xpc3QsIHRhcmdldEZpbGVzKTsKKyAgICAgIFN0cmluZyBiYXNlTUQ1ID0gZ2V0RmlsZU1ENSh0ZW1wRmlsZSwgbWQ1KTsKKyAgICAgIGFzc2VydEVxdWFscyhudW1TZWVkZXJzLCB0YXJnZXRGaWxlcy5zaXplKCkpOworCisgICAgICB2YWxpZGF0ZU11bHRpcGxlQ2xpZW50c1Jlc3VsdHMoY2xpZW50c0xpc3QsIG1kNSwgdGVtcEZpbGUsIGJhc2VNRDUsIGhhc2gsIHRhcmdldEZpbGVzKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyIDogY2xpZW50c0xpc3QpIHsKKyAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgY29ycnVwdGVkX3NlZWRlcl9yZXBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIGludCBwaWVjZVNpemUgPSA0OCAqIDEwMjQ7IC8vIGxvd2VyIHBpZWNlIHNpemUgdG8gcmVkdWNlIGRpc2sgdXNhZ2UKKyAgICBmaW5hbCBpbnQgbnVtU2VlZGVycyA9IDY7CisgICAgZmluYWwgaW50IHBpZWNlc0NvdW50ID0gbnVtU2VlZGVycyArIDc7CisKKyAgICBmaW5hbCBMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPiBjbGllbnRzTGlzdDsKKyAgICBjbGllbnRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+KHBpZWNlc0NvdW50KTsKKworICAgIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisKKyAgICB0cnkgeworICAgICAgRmlsZSBiYXNlRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZShwaWVjZXNDb3VudCAqIHBpZWNlU2l6ZSk7CisgICAgICBMaXN0PEZpbGU+IHRhcmdldEZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworCisgICAgICBTdHJpbmcgaGFzaCA9IGNyZWF0ZU11bHRpcGxlU2VlZGVyc1dpdGhEaWZmZXJlbnRQaWVjZXMoYmFzZUZpbGUsIHBpZWNlc0NvdW50LCBwaWVjZVNpemUsIG51bVNlZWRlcnMsIGNsaWVudHNMaXN0LCB0YXJnZXRGaWxlcyk7CisgICAgICBhc3NlcnRFcXVhbHMobnVtU2VlZGVycywgdGFyZ2V0RmlsZXMuc2l6ZSgpKTsKKyAgICAgIFN0cmluZyBiYXNlTUQ1ID0gZ2V0RmlsZU1ENShiYXNlRmlsZSwgbWQ1KTsKKyAgICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGZpcnN0Q29tbXVuaWNhdGlvbk1hbmFnZXIgPSBjbGllbnRzTGlzdC5nZXQoMCk7CisKKyAgICAgIG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICAgIHJldHVybiBmaXJzdENvbW11bmljYXRpb25NYW5hZ2VyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpID49IDE7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCA9IGZpcnN0Q29tbXVuaWNhdGlvbk1hbmFnZXIuZ2V0VG9ycmVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRhcmdldEZpbGVzLmdldCgwKS5nZXRQYXJlbnRGaWxlKCksIFRvcnJlbnRVdGlscy5nZXRUb3JyZW50RmlsZU5hbWVzKHRvcnJlbnQpLmdldCgwKSk7CisgICAgICBmaW5hbCBpbnQgb2xkQnl0ZTsKKyAgICAgIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAicnciKTsKKyAgICAgICAgcmFmLnNlZWsoMCk7CisgICAgICAgIG9sZEJ5dGUgPSByYWYucmVhZCgpOworICAgICAgICByYWYuc2VlaygwKTsKKyAgICAgICAgLy8gcmVwbGFjaW5nIHRoZSBieXRlCisgICAgICAgIGlmIChvbGRCeXRlICE9IDM1KSB7CisgICAgICAgICAgcmFmLndyaXRlKDM1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByYWYud3JpdGUoNDUpOworICAgICAgICB9CisgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgfQorICAgICAgZmluYWwgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoNjAgKiAxMDAwKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgZm9yIChDb21tdW5pY2F0aW9uTWFuYWdlciBjbGllbnQgOiBjbGllbnRzTGlzdCkgeworICAgICAgICAgICAgZmluYWwgU2hhcmVkVG9ycmVudCBuZXh0ID0gY2xpZW50LmdldFRvcnJlbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgICBpZiAobmV4dC5nZXRDb21wbGV0ZWRQaWVjZXMoKS5jYXJkaW5hbGl0eSgpIDwgbmV4dC5nZXRQaWVjZUNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGlmICghd2FpdEZvci5pc015UmVzdWx0KCkpIHsKKyAgICAgICAgZmFpbCgiQWxsIHNlZWRlcnMgZGlkbid0IGdldCB0aGVpciBmaWxlcyIpOworICAgICAgfQorICAgICAgVGhyZWFkLnNsZWVwKDEwICogMTAwMCk7CisgICAgICB7CisgICAgICAgIGJ5dGVbXSBwaWVjZSA9IG5ldyBieXRlW3BpZWNlU2l6ZV07CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJhc2VGaWxlKTsKKyAgICAgICAgZmluLnJlYWQocGllY2UpOworICAgICAgICBmaW4uY2xvc2UoKTsKKyAgICAgICAgUmFuZG9tQWNjZXNzRmlsZSByYWY7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7CisgICAgICAgICAgcmFmLnNlZWsoMCk7CisgICAgICAgICAgcmFmLndyaXRlKG9sZEJ5dGUpOworICAgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YWxpZGF0ZU11bHRpcGxlQ2xpZW50c1Jlc3VsdHMoY2xpZW50c0xpc3QsIG1kNSwgYmFzZUZpbGUsIGJhc2VNRDUsIGhhc2gsIHRhcmdldEZpbGVzKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyIDogY2xpZW50c0xpc3QpIHsKKyAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0VG9ycmVudHNIYXZlTGF6eUluaXRBbmRSZW1vdmluZ0FmdGVyRG93bmxvYWQoKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDAgKiAxMDI1ICogMTAyNCk7CisgICAgVVJMIGFubm91bmNlID0gbmV3IFVSTCgiaHR0cDovLzEyNy4wLjAuMTo2OTY5L2Fubm91bmNlIik7CisgICAgVVJJIGFubm91bmNlVVJJID0gYW5ub3VuY2UudG9VUkkoKTsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCBhbm5vdW5jZVVSSSwgIlRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZW1wRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIGFzc2VydEVxdWFscygxLCBzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYW5ub3VuY2VhYmxlVG9ycmVudHMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygwLCBzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygwLCBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpKTsKKworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gc2VlZGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICAgICAgICBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpID09IDE7CisgICAgICB9CisgICAgfTsKKworICAgIGFzc2VydFRydWUod2FpdEZvci5pc015UmVzdWx0KCksICJUb3JyZW50IHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIik7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgc2VlZGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGVlY2hlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSk7CisKKyAgICB3YWl0Rm9yRmlsZUluRGlyKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpOworICAgIGFzc2VydEZpbGVzRXF1YWwodGVtcEZpbGUsIG5ldyBGaWxlKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpKTsKKworICAgIHdhaXRGb3IgPSBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgIGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkgPT0gMDsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSwgIlRvcnJlbnQgd2FzIG5vdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZCIpOworCisgICAgYXNzZXJ0RXF1YWxzKDAsIHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkpOworCisgIH0KKworICBwdWJsaWMgdm9pZCBjb3JydXB0ZWRfc2VlZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgZmluYWwgaW50IHBpZWNlU2l6ZSA9IDQ4ICogMTAyNDsgLy8gbG93ZXIgcGllY2Ugc2l6ZSB0byByZWR1Y2UgZGlzayB1c2FnZQorICAgIGZpbmFsIGludCBwaWVjZXNDb3VudCA9IDM1OworCisgICAgZmluYWwgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gY2xpZW50c0xpc3Q7CisgICAgY2xpZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPihwaWVjZXNDb3VudCk7CisKKyAgICBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworCisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIEZpbGUgYmFzZUZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUocGllY2VzQ291bnQgKiBwaWVjZVNpemUpOworICAgICAgZmluYWwgRmlsZSBiYWRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKHBpZWNlc0NvdW50ICogcGllY2VTaXplKTsKKworICAgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIyID0gY3JlYXRlQW5kU3RhcnRDbGllbnQoKTsKKyAgICAgIGZpbmFsIEZpbGUgY2xpZW50MkRpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgICBmaW5hbCBGaWxlIGNsaWVudDJGaWxlID0gbmV3IEZpbGUoY2xpZW50MkRpciwgYmFzZUZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShiYWRGaWxlLCBjbGllbnQyRmlsZSk7CisKKyAgICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGJhc2VGaWxlLCBudWxsLCB0aGlzLnRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgbnVsbCwgIlRlc3QiLCBwaWVjZVNpemUpOworICAgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlcjIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY2xpZW50MkRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoID0gY3JlYXRlQW5kU3RhcnRDbGllbnQoKTsKKyAgICAgIGZpbmFsIEZpbGUgbGVlY2hEZXN0RGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+IHRocm93bkV4Y2VwdGlvbiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8RXhjZXB0aW9uPigpOworICAgICAgZmluYWwgVGhyZWFkIHRoID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbGVlY2hEZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCAxMCk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbi5zZXQoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgdGguc3RhcnQoKTsKKyAgICAgIGZpbmFsIFdhaXRGb3Igd2FpdEZvciA9IG5ldyBXYWl0Rm9yKDMwICogMTAwMCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICAgIHJldHVybiB0aC5nZXRTdGF0ZSgpID09IFRocmVhZC5TdGF0ZS5URVJNSU5BVEVEOworICAgICAgICB9CisgICAgICB9OworCisgICAgICBmaW5hbCBNYXA8VGhyZWFkLCBTdGFja1RyYWNlRWxlbWVudFtdPiBhbGxTdGFja1RyYWNlcyA9IFRocmVhZC5nZXRBbGxTdGFja1RyYWNlcygpOworICAgICAgZm9yIChNYXAuRW50cnk8VGhyZWFkLCBTdGFja1RyYWNlRWxlbWVudFtdPiBlbnRyeSA6IGFsbFN0YWNrVHJhY2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVzOiVuIiwgZW50cnkuZ2V0S2V5KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlbGVtLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFzc2VydFRydWUod2FpdEZvci5pc015UmVzdWx0KCkpOworICAgICAgYXNzZXJ0Tm90TnVsbCh0aHJvd25FeGNlcHRpb24uZ2V0KCkpOworICAgICAgYXNzZXJ0VHJ1ZSh0aHJvd25FeGNlcHRpb24uZ2V0KCkuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJVbmFibGUgdG8gZG93bmxvYWQiKSk7CisKKyAgICB9IGZpbmFsbHkgeworICAgICAgZm9yIChDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA6IGNsaWVudHNMaXN0KSB7CisgICAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB1bmxvY2tfZmlsZV93aGVuX25vX2xlZWNoZXJzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiA3KTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICBkb3dubG9hZEFuZFN0b3AodG9ycmVudCwgMTUgKiAxMDAwLCBjcmVhdGVDbGllbnQoKSk7CisgICAgVGhyZWFkLnNsZWVwKDIgKiAxMDAwKTsKKyAgICBhc3NlcnRUcnVlKGR3bmxGaWxlLmV4aXN0cygpICYmIGR3bmxGaWxlLmlzRmlsZSgpKTsKKyAgICBmaW5hbCBib29sZWFuIGRlbGV0ZSA9IGR3bmxGaWxlLmRlbGV0ZSgpOworICAgIGFzc2VydFRydWUoZGVsZXRlICYmICFkd25sRmlsZS5leGlzdHMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkb3dubG9hZF9tYW55X3RpbWVzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiA3KTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgZG93bmxvYWRBbmRTdG9wKHRvcnJlbnQsIDI1MCAqIDEwMDAsIGNyZWF0ZUNsaWVudCgpKTsKKyAgICAgIFRocmVhZC5zbGVlcCgzICogMTAwMCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RUb0FsbERpc2NvdmVyZWRQZWVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woOCk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGV4ZWN1dG9yU2VydmljZSwgdmFsaWRhdG9yRVMpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd25Ob3coKTsKKyAgICAgIH0KKyAgICB9OworICAgIGxlZWNoZXIuc2V0TWF4SW5Db25uZWN0aW9uc0NvdW50KDEwKTsKKyAgICBsZWVjaGVyLnNldE1heE91dENvbm5lY3Rpb25zQ291bnQoMTApOworCisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMzQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSkuZ2V0SGV4SW5mb0hhc2goKTsKKyAgICBmaW5hbCBMaXN0PFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0cyA9IG5ldyBBcnJheUxpc3Q8U2VydmVyU29ja2V0PigpOworCisgICAgZmluYWwgaW50IHN0YXJ0UG9ydCA9IDY4ODU7CisgICAgaW50IHBvcnQgPSBzdGFydFBvcnQ7CisgICAgUGVlclVJRFtdIHBlZXJVaWRzID0gbmV3IFBlZXJVSURbXXsKKyAgICAgICAgICAgIG5ldyBQZWVyVUlEKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgcG9ydCsrKSwgaGV4SW5mb0hhc2gpLAorICAgICAgICAgICAgbmV3IFBlZXJVSUQobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCBwb3J0KyspLCBoZXhJbmZvSGFzaCksCisgICAgICAgICAgICBuZXcgUGVlclVJRChuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIHBvcnQpLCBoZXhJbmZvSGFzaCkKKyAgICB9OworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBlcyA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgIHRyeSB7CisgICAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoNTAwMCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICAgIHJldHVybiB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50KGhleEluZm9IYXNoKSAhPSBudWxsOworICAgICAgICB9CisgICAgICB9OworCisgICAgICBhc3NlcnRUcnVlKHdhaXRGb3IuaXNNeVJlc3VsdCgpKTsKKworICAgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdHJhY2tlZFRvcnJlbnQgPSB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50KGhleEluZm9IYXNoKTsKKyAgICAgIE1hcDxQZWVyVUlELCBUcmFja2VkUGVlcj4gdHJhY2tlZFBlZXJNYXAgPSBuZXcgSGFzaE1hcDxQZWVyVUlELCBUcmFja2VkUGVlcj4oKTsKKworICAgICAgcG9ydCA9IHN0YXJ0UG9ydDsKKyAgICAgIGZvciAoUGVlclVJRCB1aWQgOiBwZWVyVWlkcykgeworICAgICAgICB0cmFja2VkUGVlck1hcC5wdXQodWlkLCBuZXcgVHJhY2tlZFBlZXIodHJhY2tlZFRvcnJlbnQsICIxMjcuMC4wLjEiLCBwb3J0LCBCeXRlQnVmZmVyLndyYXAoImlkIi5nZXRCeXRlcyhDb25zdGFudHMuQllURV9FTkNPRElORykpKSk7CisgICAgICAgIHNlcnZlclNvY2tldHMuYWRkKG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgICBwb3J0Kys7CisgICAgICB9CisKKyAgICAgIHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCkucHV0QWxsKHRyYWNrZWRQZWVyTWFwKTsKKworICAgICAgLy93YWl0IHVudGlsIGFsbCBzZXJ2ZXIgc29ja2V0cyBhY2NlcHQgY29ubmVjdGlvbiBmcm9tIGxlZWNoZXIKKyAgICAgIGZvciAoZmluYWwgU2VydmVyU29ja2V0IHNzIDogc2VydmVyU29ja2V0cykgeworICAgICAgICBmaW5hbCBGdXR1cmU8Pz4gZnV0dXJlID0gZXMuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmaW5hbCBTb2NrZXQgc29ja2V0ID0gc3MuYWNjZXB0KCk7CisgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuIG5vdCBhY2NlcHQgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZnV0dXJlLmdldCgxMCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZmFpbCgiZ2V0IGV4ZWN1dGlvbiBleGNlcHRpb24gb24gYWNjZXB0IGNvbm5lY3Rpb24iLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZmFpbCgibm90IHJlY2VpdmVkIGNvbm5lY3Rpb24gZnJvbSBsZWVjaGVyIGluIHNwZWNpZmllZCB0aW1lb3V0IiwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0gZmluYWxseSB7CisgICAgICBmb3IgKFNlcnZlclNvY2tldCBzcyA6IHNlcnZlclNvY2tldHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZmFpbCgiY2FuIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0IiwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVzLnNodXRkb3duKCk7CisgICAgICBsZWVjaGVyLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBkb3dubG9hZF9pb19lcnJvcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworCisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMzQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgaW50ZXJydXB0cyA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBlcyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woREVGQVVMVF9QT09MX1NJWkUpOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSB2YWxpZGF0b3JFUyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNCk7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXMsIHZhbGlkYXRvckVTKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5oYW5kbGVQaWVjZUNvbXBsZXRlZChwZWVyLCBwaWVjZSk7CisgICAgICAgIGlmIChwaWVjZS5nZXRJbmRleCgpICUgNCA9PSAwICYmIGludGVycnVwdHMuaW5jcmVtZW50QW5kR2V0KCkgPD0gMikgeworICAgICAgICAgIHBlZXIudW5iaW5kKHRydWUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgc3VwZXIuc3RvcCh0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgICAgIGVzLnNodXRkb3duKCk7CisgICAgICAgIHZhbGlkYXRvckVTLnNodXRkb3duKCk7CisgICAgICB9CisgICAgfTsKKyAgICAvL21hbnVhbGx5IGFkZCBsZWVjaCBoZXJlIGZvciBncmFjZWZ1bCBzaHV0ZG93bi4KKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuYWRkKGxlZWNoKTsKKyAgICBkb3dubG9hZEFuZFN0b3AodG9ycmVudCwgNDUgKiAxMDAwLCBsZWVjaCk7CisgICAgVGhyZWFkLnNsZWVwKDIgKiAxMDAwKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkX3VuaW50ZXJydXB0aWJseV9wb3NpdGl2ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDI0KTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgMTApOworICB9CisKKyAgcHVibGljIHZvaWQgZG93bmxvYWRfdW5pbnRlcnJ1cHRpYmx5X25lZ2F0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciBkb3dubG9hZGVkUGllY2VzQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDI0KTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChERUZBVUxUX1BPT0xfU0laRSk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGVzLCB2YWxpZGF0b3JFUykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdG9wKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBzdXBlci5zdG9wKHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgICAgICAgZXMuc2h1dGRvd24oKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd24oKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZUNvbXBsZXRlZChTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaGFuZGxlUGllY2VDb21wbGV0ZWQocGVlciwgcGllY2UpOworICAgICAgICBpZiAoZG93bmxvYWRlZFBpZWNlc0NvdW50LmluY3JlbWVudEFuZEdldCgpID4gMTApIHsKKyAgICAgICAgICBzZWVkZXIuc3RvcCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuYWRkKGxlZWNoZXIpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGZpbmFsIEZpbGUgZGVzdERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHRyeSB7CisgICAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgNyk7CisgICAgICBmYWlsKCJNdXN0IGZhaWwsIGJlY2F1c2UgZmlsZSB3YXNuJ3QgZG93bmxvYWRlZCBjb21wbGV0ZWx5Iik7CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworCisgICAgICBMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgPSBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmdldExvYWRlZFRvcnJlbnQodG9ycmVudE1hbmFnZXIuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICBsb2FkZWRUb3JyZW50LmdldFBpZWNlU3RvcmFnZSgpLmNsb3NlKCk7CisKKyAgICAgIC8vIGRlbGV0ZSAucGFydCBmaWxlCisgICAgICBGaWxlW10gZGVzdERpckZpbGVzID0gZGVzdERpci5saXN0RmlsZXMoKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZGVzdERpckZpbGVzKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBkZXN0RGlyRmlsZXMubGVuZ3RoKTsKKyAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IGRlc3REaXJGaWxlc1swXTsKKyAgICAgIGlmICghdGFyZ2V0RmlsZS5kZWxldGUoKSkgeworICAgICAgICBmYWlsKCJVbmFibGUgdG8gcmVtb3ZlIGZpbGUgIiArIHRhcmdldEZpbGUpOworICAgICAgfQorICAgICAgLy8gZW5zdXJlIC5wYXJ0IHdhcyBkZWxldGVkOgorICAgICAgZGVzdERpckZpbGVzID0gZGVzdERpci5saXN0RmlsZXMoKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZGVzdERpckZpbGVzKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBkZXN0RGlyRmlsZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkX3VuaW50ZXJydXB0aWJseV90aW1lb3V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHBpZWNlc0Rvd25sb2FkZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKERFRkFVTFRfUE9PTF9TSVpFKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXMsIHZhbGlkYXRvckVTKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB7CisgICAgICAgIHBpZWNlc0Rvd25sb2FkZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVGhyZWFkLnNsZWVwKHBpZWNlc0Rvd25sb2FkZWQuZ2V0KCkgKiA1MDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIHN1cGVyLnN0b3AodGltZW91dCwgdGltZVVuaXQpOworICAgICAgICBlcy5zaHV0ZG93bigpOworICAgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bigpOworICAgICAgfQorICAgIH07CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChsZWVjaGVyKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICB0cnkgeworICAgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDcpOworICAgICAgZmFpbCgiTXVzdCBmYWlsLCBiZWNhdXNlIGZpbGUgd2Fzbid0IGRvd25sb2FkZWQgY29tcGxldGVseSIpOworICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlZCkgeworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNhblN0YXJ0QW5kU3RvcENsaWVudFR3aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChERUZBVUxUX1BPT0xfU0laRSk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihlcywgdmFsaWRhdG9yRVMpOworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoY29tbXVuaWNhdGlvbk1hbmFnZXIpOworICAgIHRyeSB7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGVzLnNodXRkb3duKCk7CisgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bigpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHBlZXJfZGllc19kdXJpbmdfZG93bmxvYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZDEgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkMiA9IGNyZWF0ZUNsaWVudCgpOworCisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQwKTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkMS5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgc2VlZDEuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWQxLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisgICAgc2VlZDIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIHNlZWQyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBzZWVkMi5zZXRBbm5vdW5jZUludGVydmFsKDUpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGxlZWNoZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2Ugc2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisgICAgZmluYWwgRnV0dXJlPD8+IGZ1dHVyZSA9IHNlcnZpY2Uuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIFRocmVhZC5zbGVlcCg1ICogMTAwMCk7CisgICAgICAgICAgc2VlZDEucmVtb3ZlVG9ycmVudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICAgIFRocmVhZC5zbGVlcCgzICogMTAwMCk7CisgICAgICAgICAgc2VlZDEuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgICAgICAgIHNlZWQyLnJlbW92ZVRvcnJlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgdHJ5IHsKKyAgICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCA2MCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZ1dHVyZS5jYW5jZWwodHJ1ZSk7CisgICAgICBzZXJ2aWNlLnNodXRkb3duKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdG9ycmVudExpc3RlbmVyc1Bvc2l0aXZlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDI0ICsgMSk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHBpZWNlTG9hZGVkSW52b2NhdGlvbkNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvbm5lY3RlZEludm9jYXRpb25Db3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgZmluYWwgU2VtYXBob3JlIGRpc2Nvbm5lY3RlZExvY2sgPSBuZXcgU2VtYXBob3JlKDApOworICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBmaW5hbCBBdG9taWNMb25nIHRvdGFsRG93bmxvYWRlZCA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgdG9ycmVudE1hbmFnZXIuYWRkTGlzdGVuZXIobmV3IFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBpZWNlRG93bmxvYWRlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgdG90YWxEb3dubG9hZGVkLmFkZEFuZEdldChwaWVjZUluZm9ybWF0aW9uLmdldFNpemUoKSk7CisgICAgICAgIHBpZWNlTG9hZGVkSW52b2NhdGlvbkNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBlZXJDb25uZWN0ZWQoUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworICAgICAgICBjb25uZWN0ZWRJbnZvY2F0aW9uQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcGVlckRpc2Nvbm5lY3RlZChQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIGRpc2Nvbm5lY3RlZExvY2sucmVsZWFzZSgpOworICAgICAgfQorICAgIH0pOworICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMocGllY2VMb2FkZWRJbnZvY2F0aW9uQ291bnQuZ2V0KCksIHRvcnJlbnQuZ2V0UGllY2VzQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGNvbm5lY3RlZEludm9jYXRpb25Db3VudC5nZXQoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKHRvdGFsRG93bmxvYWRlZC5nZXQoKSwgZHdubEZpbGUubGVuZ3RoKCkpOworICAgIGlmICghZGlzY29ubmVjdGVkTG9jay50cnlBY3F1aXJlKDEwLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgZmFpbCgiY29ubmVjdGlvbiB3aXRoIHNlZWRlciBtdXN0IGJlIGNsb3NlZCBhZnRlciBkb3dubG9hZCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zaW5nUGllY2VTdG9yYWdlV2hlbkRvd25sb2FkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVBbmRTdGFydENsaWVudCgpOworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDI0KTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworICAgIGZpbmFsIFBpZWNlU3RvcmFnZSBzZWVkZXJTdG9yYWdlID0gRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN0b3JhZ2UodG9ycmVudCwgbmV3IEZpbGVTdG9yYWdlKGR3bmxGaWxlLCAwLCBkd25sRmlsZS5sZW5ndGgoKSkpOworICAgIHNlZWRlci5hZGRUb3JyZW50KG5ldyBUb3JyZW50TWV0YWRhdGFQcm92aWRlcigpIHsKKyAgICAgIEBOb3ROdWxsCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBUb3JyZW50TWV0YWRhdGEgZ2V0VG9ycmVudE1ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gdG9ycmVudDsKKyAgICAgIH0KKyAgICB9LCBzZWVkZXJTdG9yYWdlKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVBbmRTdGFydENsaWVudCgpOworCisgICAgZmluYWwgUGllY2VTdG9yYWdlIGxlZWNoZXJTdG9yYWdlID0gRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN0b3JhZ2UodG9ycmVudCwgbmV3IEZpbGVTdG9yYWdlKHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpLCAwLCBkd25sRmlsZS5sZW5ndGgoKSkpOworICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2hlci5hZGRUb3JyZW50KG5ldyBUb3JyZW50TWV0YWRhdGFQcm92aWRlcigpIHsKKyAgICAgIEBOb3ROdWxsCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBUb3JyZW50TWV0YWRhdGEgZ2V0VG9ycmVudE1ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gdG9ycmVudDsKKyAgICAgIH0KKyAgICB9LCBsZWVjaGVyU3RvcmFnZSk7CisKKyAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8VGhyb3dhYmxlPiBleGNlcHRpb25Ib2xkZXIgPSBuZXcgQXRvbWljUmVmZXJlbmNlPFRocm93YWJsZT4oKTsKKyAgICB0b3JyZW50TWFuYWdlci5hZGRMaXN0ZW5lcihuZXcgVG9ycmVudExpc3RlbmVyV3JhcHBlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcGllY2VEb3dubG9hZGVkKFBpZWNlSW5mb3JtYXRpb24gcGllY2VJbmZvcm1hdGlvbiwgUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgIHNlZWRlclN0b3JhZ2UuY2xvc2UoKTsKKyAgICAgICAgICBsZWVjaGVyU3RvcmFnZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZXhjZXB0aW9uSG9sZGVyLnNldChlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDEwKTsKKyAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gZXhjZXB0aW9uSG9sZGVyLmdldCgpOworICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgeworICAgICAgZmFpbCgiIiwgdGhyb3dhYmxlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJzV2l0aEJhZFNlZWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDI0MCk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGR3bmxGaWxlLCAicnciKTsKKyAgICAvL2NoYW5naW5nIG9uZSBieXRlIGluIGZpbGUuIFNvIG9uZSBwaWVjZQorICAgIHRyeSB7CisgICAgICBsb25nIHBvcyA9IGR3bmxGaWxlLmxlbmd0aCgpIC8gMjsKKyAgICAgIHJhZi5zZWVrKHBvcyk7CisgICAgICBpbnQgb2xkQnl0ZSA9IHJhZi5yZWFkKCk7CisgICAgICByYWYuc2Vlayhwb3MpOworICAgICAgcmFmLndyaXRlKG9sZEJ5dGUgKyAxKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmFmLmNsb3NlKCk7CisgICAgfQorICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSwgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciBwaWVjZUxvYWRlZEludm9jYXRpb25Db3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHRvcnJlbnRNYW5hZ2VyLmFkZExpc3RlbmVyKG5ldyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwaWVjZURvd25sb2FkZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIHBpZWNlTG9hZGVkSW52b2NhdGlvbkNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgfQorICAgIH0pOworICAgIHRyeSB7CisgICAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgMTUpOworICAgICAgZmFpbCgiRG93bmxvYWRpbmcgbXVzdCBiZSBmYWlsZWQgYmVjYXVzZSBzZWVkZXIgZG9lc24ndCBoYXZlIHZhbGlkIHBpZWNlIik7CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhwaWVjZUxvYWRlZEludm9jYXRpb25Db3VudC5nZXQoKSwgdG9ycmVudC5nZXRQaWVjZXNDb3VudCgpIC0gMSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBpbnRlcnJ1cHRfZG93bmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiA2MCk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIGludGVycnVwdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICBmaW5hbCBUaHJlYWQgdGggPSBuZXcgVGhyZWFkKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCAzMCk7CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpbnRlcnJ1cHRlZC5zZXQodHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgaW50ZXJydXB0ZWQuc2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICB0aC5zdGFydCgpOworICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgIHRoLmludGVycnVwdCgpOworICAgIG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiAhdGguaXNBbGl2ZSgpOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKGludGVycnVwdGVkLmdldCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfY29ubmVjdF90b191bmtub3duX2hvc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnQgPSBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL2ZpbGUxLmphci50b3JyZW50Iik7CisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdHQgPSBUcmFja2VkVG9ycmVudC5sb2FkKHRvcnJlbnQpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUFuZFN0YXJ0Q2xpZW50KCk7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUFuZFN0YXJ0Q2xpZW50KCk7CisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgYW5ub3VuY2UgPSB0cmFja2VyLmFubm91bmNlKHR0KTsKKyAgICBmaW5hbCBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgIGZpbmFsIEZpbGUgbGVlY2hGb2xkZXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgaSsrKSB7CisgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzIwXTsKKyAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoZGF0YSk7CisgICAgICBhbm5vdW5jZS5hZGRQZWVyKG5ldyBUcmFja2VkUGVlcih0dCwgIm15X3Vua25vd25fYW5kX3VucmVhY2hhYmxlaG9zdCIgKyBpLCA2ODgxLCBCeXRlQnVmZmVyLndyYXAoZGF0YSkpKTsKKyAgICB9CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi90b3JyZW50cyIsICJmaWxlMS5qYXIudG9ycmVudCIpOworICAgIEZpbGUgcGFyZW50RmlsZXMgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvcGFyZW50RmlsZXMiKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcGFyZW50RmlsZXMuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbGVlY2hGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHdhaXRGb3JGaWxlSW5EaXIobGVlY2hGb2xkZXIsICJmaWxlMS5qYXIiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3Rfc2VlZGluZ19kb2VzX25vdF9jaGFuZ2VfZmlsZV9tb2RpZmljYXRpb25fZGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIEZpbGUgc3JjRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDI0KTsKKyAgICBsb25nIHRpbWUgPSBzcmNGaWxlLmxhc3RNb2RpZmllZCgpOworCisgICAgVGhyZWFkLnNsZWVwKDEwMDApOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQW5kU3RhcnRDbGllbnQoKTsKKworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHNyY0ZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKworICAgIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHNyY0ZpbGUuZ2V0UGFyZW50KCksIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsIHNyY0ZpbGUuZ2V0TmFtZSgpKTsKKworICAgIGFzc2VydEVxdWFscyh0aW1lLCBzcmNGaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb3dubG9hZEFuZFN0b3AoVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQsIGxvbmcgdGltZW91dCwgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgRmlsZSB0ZW1wRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIHdhaXRGb3JGaWxlSW5EaXIodGVtcERpciwgdG9ycmVudC5nZXRGaWxlcygpLmdldCgwKS5nZXRSZWxhdGl2ZVBhdGhBc1N0cmluZygpKTsKKworICAgIGxlZWNoLnN0b3AoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU11bHRpcGxlQ2xpZW50c1Jlc3VsdHMoZmluYWwgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gY2xpZW50c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBtZDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBiYXNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZU1ENSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEZpbGU+IHRhcmdldEZpbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgZmluYWwgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoNzUgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgYm9vbGVhbiByZXR2YWwgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgaWYgKCFyZXR2YWwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBGaWxlIHRhcmdldCA9IHRhcmdldEZpbGVzLmdldChpKTsKKyAgICAgICAgICByZXR2YWwgPSB0YXJnZXQuaXNGaWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSwgIkFsbCBzZWVkZXJzIGRpZG4ndCBnZXQgdGhlaXIgZmlsZXMiKTsKKyAgICAvLyBjaGVjayBmaWxlIGNvbnRlbnRzIGhlcmU6CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGllbnRzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgZmluYWwgTG9hZGVkVG9ycmVudCB0b3JyZW50ID0gY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmdldChpKS5nZXRUb3JyZW50c1N0b3JhZ2UoKS5nZXRMb2FkZWRUb3JyZW50KGhhc2gpOworICAgICAgZmluYWwgRmlsZSBmaWxlID0gdGFyZ2V0RmlsZXMuZ2V0KGkpOworICAgICAgYXNzZXJ0RXF1YWxzKGJhc2VNRDUsIGdldEZpbGVNRDUoZmlsZSwgbWQ1KSwgU3RyaW5nLmZvcm1hdCgiTUQ1IGhhc2ggaXMgaW52YWxpZC4gQzolcywgTzolcyAiLAorICAgICAgICAgICAgICBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBiYXNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNYW55U2VlZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGUgYXJ0aWZhY3QgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoMjU2ICogMTAyNCAqIDEwMjQpOworICAgIGludCBzZWVkZXJzQ291bnQgPSAxNTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShhcnRpZmFjdCwgdGhpcy50cmFja2VyLmdldEFubm91bmNlVVJJKCksICJ0ZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBTZXJ2ZXJDaGFubmVsUmVnaXN0ZXIgc2VydmVyQ2hhbm5lbFJlZ2lzdGVyID0gbmV3IEZpcnN0QXZhaWxhYmxlQ2hhbm5lbCg2ODgxLCAxMDAwMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWVkZXJzQ291bnQ7IGkrKykgeworICAgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgYXJ0aWZhY3QuZ2V0UGFyZW50KCksIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisgICAgICBzZWVkZXIuc3RhcnQobmV3IEluZXRBZGRyZXNzW117SW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCl9LAorICAgICAgICAgICAgICBDb25zdGFudHMuREVGQVVMVF9BTk5PVU5DRV9JTlRFUlZBTF9TRUMsCisgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgIG5ldyBTZWxlY3RvckZhY3RvcnlJbXBsKCksCisgICAgICAgICAgICAgIHNlcnZlckNoYW5uZWxSZWdpc3Rlcik7CisgICAgfQorCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoZXIuc3RhcnQobmV3IEluZXRBZGRyZXNzW117SW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCl9LAorICAgICAgICAgICAgQ29uc3RhbnRzLkRFRkFVTFRfQU5OT1VOQ0VfSU5URVJWQUxfU0VDLAorICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgIG5ldyBTZWxlY3RvckZhY3RvcnlJbXBsKCksCisgICAgICAgICAgICBzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIpOworICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgIEVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDYwKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU11bHRpcGxlU2VlZGVyc1dpdGhEaWZmZXJlbnRQaWVjZXMoRmlsZSBiYXNlRmlsZSwgaW50IHBpZWNlc0NvdW50LCBpbnQgcGllY2VTaXplLCBpbnQgbnVtU2VlZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPiBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QsIExpc3Q8RmlsZT4gdGFyZ2V0RmlsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisKKyAgICBMaXN0PGJ5dGVbXT4gcGllY2VzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPihwaWVjZXNDb3VudCk7CisgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYmFzZUZpbGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGllY2VzQ291bnQ7IGkrKykgeworICAgICAgYnl0ZVtdIHBpZWNlID0gbmV3IGJ5dGVbcGllY2VTaXplXTsKKyAgICAgIGZpbi5yZWFkKHBpZWNlKTsKKyAgICAgIHBpZWNlc0xpc3QuYWRkKHBpZWNlKTsKKyAgICB9CisgICAgZmluLmNsb3NlKCk7CisKKyAgICBmaW5hbCBsb25nIHRvcnJlbnRGaWxlTGVuZ3RoID0gYmFzZUZpbGUubGVuZ3RoKCk7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoYmFzZUZpbGUsIG51bGwsIHRoaXMudHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCBudWxsLCAiVGVzdCIsIHBpZWNlU2l6ZSk7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKGJhc2VGaWxlLmdldFBhcmVudEZpbGUoKSwgYmFzZUZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlZWRlcnM7IGkrKykgeworICAgICAgZmluYWwgRmlsZSBiYXNlRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICAgIHRhcmdldEZpbGVzLmFkZChuZXcgRmlsZShiYXNlRGlyLCBiYXNlRmlsZS5nZXROYW1lKCkpKTsKKyAgICAgIGZpbmFsIEZpbGUgc2VlZGVyUGllY2VzRmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsIGJhc2VGaWxlLmdldE5hbWUoKSk7CisgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNlZWRlclBpZWNlc0ZpbGUsICJydyIpOworICAgICAgcmFmLnNldExlbmd0aCh0b3JyZW50RmlsZUxlbmd0aCk7CisgICAgICBmb3IgKGludCBwaWVjZUlkeCA9IGk7IHBpZWNlSWR4IDwgcGllY2VzQ291bnQ7IHBpZWNlSWR4ICs9IG51bVNlZWRlcnMpIHsKKyAgICAgICAgcmFmLnNlZWsocGllY2VJZHggKiBwaWVjZVNpemUpOworICAgICAgICByYWYud3JpdGUocGllY2VzTGlzdC5nZXQocGllY2VJZHgpKTsKKyAgICAgIH0KKyAgICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gY3JlYXRlQ2xpZW50KCIgY29tbXVuaWNhdGlvbk1hbmFnZXIgaWR4ICIgKyBpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoY29tbXVuaWNhdGlvbk1hbmFnZXIpOworICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgfQorICAgIHJldHVybiB0b3JyZW50LmdldEhleEluZm9IYXNoKCk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXRGaWxlTUQ1KEZpbGUgZmlsZSwgTWVzc2FnZURpZ2VzdCBkaWdlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGlnZXN0SW5wdXRTdHJlYW0gZEluID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksIGRpZ2VzdCk7CisgICAgd2hpbGUgKGRJbi5yZWFkKCkgPj0gMCkgOworICAgIHJldHVybiBkSW4uZ2V0TWVzc2FnZURpZ2VzdCgpLnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd2FpdEZvckZpbGVJbkRpcihmaW5hbCBGaWxlIGRvd25sb2FkRGlyLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICBuZXcgV2FpdEZvcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZG93bmxvYWREaXIsIGZpbGVOYW1lKS5pc0ZpbGUoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShkb3dubG9hZERpciwgZmlsZU5hbWUpLmlzRmlsZSgpKTsKKyAgfQorCisKKyAgQEFmdGVyTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA6IGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdCkgeworICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgIH0KKyAgICBzdG9wVHJhY2tlcigpOworICAgIHRlbXBGaWxlcy5jbGVhbnVwKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3RhcnRUcmFja2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgcG9ydCA9IDY5Njk7CisgICAgdGhpcy50cmFja2VyID0gbmV3IFRyYWNrZXIocG9ydCwgImh0dHA6Ly8iICsgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArIHBvcnQgKyAiIiArIEFOTk9VTkNFX1VSTCk7CisgICAgdHJhY2tlci5zZXRBbm5vdW5jZUludGVydmFsKDUpOworICAgIHRoaXMudHJhY2tlci5zdGFydCh0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY3JlYXRlQW5kU3RhcnRDbGllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICByZXR1cm4gY29tbXVuaWNhdGlvbk1hbmFnZXI7CisgIH0KKworICBwcml2YXRlIENvbW11bmljYXRpb25NYW5hZ2VyIGNyZWF0ZUNsaWVudChTdHJpbmcgbmFtZSkgeworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gY29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5LmdldENsaWVudChuYW1lKTsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuYWRkKGNvbW11bmljYXRpb25NYW5hZ2VyKTsKKyAgICByZXR1cm4gY29tbXVuaWNhdGlvbk1hbmFnZXI7CisgIH0KKworICBwcml2YXRlIENvbW11bmljYXRpb25NYW5hZ2VyIGNyZWF0ZUNsaWVudCgpIHsKKyAgICByZXR1cm4gY3JlYXRlQ2xpZW50KCIiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdG9wVHJhY2tlcigpIHsKKyAgICB0aGlzLnRyYWNrZXIuc3RvcCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEZpbGVzRXF1YWwoRmlsZSBmMSwgRmlsZSBmMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoZjEubGVuZ3RoKCksIGYyLmxlbmd0aCgpLCAiRmlsZXMgc2l6ZXMgZGlmZmVyIik7CisgICAgQ2hlY2tzdW0gYzEgPSBGaWxlVXRpbHMuY2hlY2tzdW0oZjEsIG5ldyBDUkMzMigpKTsKKyAgICBDaGVja3N1bSBjMiA9IEZpbGVVdGlscy5jaGVja3N1bShmMiwgbmV3IENSQzMyKCkpOworICAgIGFzc2VydEVxdWFscyhjMS5nZXRWYWx1ZSgpLCBjMi5nZXRWYWx1ZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE1YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitAVGVzdAorcHVibGljIGNsYXNzIFRyYWNrZXJDbGllbnRUZXN0IHsKKworICBwcml2YXRlIFRyYWNrZXIgdHJhY2tlcjsKKworICBwdWJsaWMgVHJhY2tlckNsaWVudFRlc3QoKSB7CisgICAgaWYgKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICByZXR1cm47CisgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIobmV3IFBhdHRlcm5MYXlvdXQoIlslZHtNTWRkIEhIOm1tOnNzLFNTU31dICU2cCAtICUyMC4yMGMgLSAlbSAlbiIpKSk7CisgICAgTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5zZXRMZXZlbChVdGlscy5nZXRMb2dMZXZlbCgpKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdGFydFRyYWNrZXIoKTsKKyAgfQorCisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbXVsdGlBbm5vdW5jZVRlc3QoKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24geworICAgIExpc3Q8UGVlcj4gcGVlcnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBQZWVyKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgNjg4MSksIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSkpKTsKKyAgICBmaW5hbCBVUkkgdHJhY2tlclVSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZSIpOworICAgIFRyYWNrZXJDbGllbnQgY2xpZW50ID0gbmV3IEhUVFBUcmFja2VyQ2xpZW50KHBlZXJzLCB0cmFja2VyVVJJKTsKKworICAgIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGZpcnN0VG9ycmVudCA9IGdldE1vY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSk7CisgICAgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gc2Vjb25kVG9ycmVudCA9IGdldE1vY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAzLCAzLCAyfSk7CisgICAgTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gdG9ycmVudHMgPSBBcnJheXMuYXNMaXN0KGZpcnN0VG9ycmVudCwgc2Vjb25kVG9ycmVudCk7CisKKyAgICBjbGllbnQubXVsdGlBbm5vdW5jZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5TVEFSVEVELCB0cnVlLCB0b3JyZW50cywgcGVlcnMpOworCisgICAgcGVlcnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBQZWVyKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgNjg4MiksIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSkpKTsKKyAgICBjbGllbnQubXVsdGlBbm5vdW5jZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5TVEFSVEVELCB0cnVlLCB0b3JyZW50cywgcGVlcnMpOworCisgICAgTGlzdDxQZWVyPiBsZWVjaGVyID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUGVlcihuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDY4ODUpLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpKSk7CisgICAgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gZmlyc3RUb3JyZW50TGVlY2ggPSBnZXRNb2NrZWRUb3JyZW50KG5ldyBieXRlW117MSwgMiwgMywgNH0pOworICAgIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHNlY29uZFRvcnJlbnRMZWVjaCA9IGdldE1vY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAzLCAzLCAyfSk7CisgICAgd2hlbihmaXJzdFRvcnJlbnRMZWVjaC5nZXRMZWZ0KCkpLnRoZW5SZXR1cm4oMTBMKTsKKyAgICB3aGVuKHNlY29uZFRvcnJlbnRMZWVjaC5nZXRMZWZ0KCkpLnRoZW5SZXR1cm4oMTBMKTsKKworICAgIEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciBsaXN0ZW5lciA9IG1vY2soQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyLmNsYXNzKTsKKworICAgIGNsaWVudC5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgY2xpZW50Lm11bHRpQW5ub3VuY2UoQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuU1RBUlRFRCwgZmFsc2UsCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KHNlY29uZFRvcnJlbnRMZWVjaCwgZmlyc3RUb3JyZW50TGVlY2gpLCBsZWVjaGVyKTsKKworICAgIHZlcmlmeShsaXN0ZW5lciwgdGltZXMoMikpLmhhbmRsZUFubm91bmNlUmVzcG9uc2UoYW55SW50KCksIGFueUludCgpLCBhbnlJbnQoKSwgYW55U3RyaW5nKCkpOworICAgIHZlcmlmeShsaXN0ZW5lciwgdGltZXMoMikpLmhhbmRsZURpc2NvdmVyZWRQZWVycyhBcmd1bWVudE1hdGNoZXJzLjxQZWVyPmFueUxpc3QoKSwgYW55U3RyaW5nKCkpOworCisgIH0KKworICBwcml2YXRlIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGdldE1vY2tlZFRvcnJlbnQoYnl0ZVtdIGhhc2gpIHsKKyAgICBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiByZXN1bHQgPSBtb2NrKEFubm91bmNlYWJsZUluZm9ybWF0aW9uLmNsYXNzKTsKKyAgICB3aGVuKHJlc3VsdC5nZXRMZWZ0KCkpLnRoZW5SZXR1cm4oMEwpOworICAgIHdoZW4ocmVzdWx0LmdldERvd25sb2FkZWQoKSkudGhlblJldHVybigwTCk7CisgICAgd2hlbihyZXN1bHQuZ2V0VXBsb2FkZWQoKSkudGhlblJldHVybigwTCk7CisgICAgd2hlbihyZXN1bHQuZ2V0SW5mb0hhc2goKSkudGhlblJldHVybihoYXNoKTsKKyAgICB3aGVuKHJlc3VsdC5nZXRIZXhJbmZvSGFzaCgpKS50aGVuUmV0dXJuKFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhoYXNoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFRyYWNrZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlciA9IG5ldyBUcmFja2VyKDY5NjkpOworICAgIHRyYWNrZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICB0cmFja2VyLnNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KDEwKTsKKyAgICB0aGlzLnRyYWNrZXIuc3RhcnQodHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3RvcFRyYWNrZXIoKSB7CisgICAgdGhpcy50cmFja2VyLnN0b3AoKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN0b3BUcmFja2VyKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5YzUyZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5IZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBUb3JyZW50VGVzdCB7CisKKyAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVfdG9ycmVudCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgVVJJIGFubm91bmNlVVJJID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdDo2OTY5L2Fubm91bmNlIik7CisgICAgU3RyaW5nIGNyZWF0ZWRCeSA9ICJUZXN0IjsKKyAgICBUb3JyZW50TWV0YWRhdGEgdCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUxLmphciIpLCBhbm5vdW5jZVVSSSwgY3JlYXRlZEJ5KTsKKyAgICBhc3NlcnRFcXVhbHMoY3JlYXRlZEJ5LCB0LmdldENyZWF0ZWRCeSgpLmdldCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYW5ub3VuY2VVUkkudG9TdHJpbmcoKSwgdC5nZXRBbm5vdW5jZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGxvYWRfdG9ycmVudF9jcmVhdGVkX2J5X3V0b3JyZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBUb3JyZW50TWV0YWRhdGEgdCA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZShuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL2ZpbGUxLmphci50b3JyZW50IikpOworICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo2OTY5L2Fubm91bmNlIiwgdC5nZXRBbm5vdW5jZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkI5MkQzODA0NkM3NkQ3Mzk0OEUxNEM0MkRGOTkyQ0FGMjU0ODlEMDgiLCB0LmdldEhleEluZm9IYXNoKCkpOworICAgIGFzc2VydEVxdWFscygidVRvcnJlbnQvMzEzMCIsIHQuZ2V0Q3JlYXRlZEJ5KCkuZ2V0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdG9ycmVudF9mcm9tX211bHRpcGxlX2ZpbGVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UiKTsKKyAgICBTdHJpbmcgY3JlYXRlZEJ5ID0gIlRlc3QyIjsKKyAgICBmaW5hbCBGaWxlIHBhcmVudERpciA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyIik7CisgICAgZmluYWwgbG9uZyBjcmVhdGlvblRpbWVTZWNzID0gMTM3NjA1MTAwMDsKKyAgICBmaW5hbCBTdHJpbmdbXSBmaWxlTmFtZXMgPSBuZXcgU3RyaW5nW10KKyAgICAgICAgICAgIHsiQWNjdVJldkNvbW1vbi5qYXIiLAorICAgICAgICAgICAgICAgICAgICAiY29tbW9ucy1pby1jaW8yLjVfMy5qYXIiLAorICAgICAgICAgICAgICAgICAgICAiY29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGluayIsCisgICAgICAgICAgICAgICAgICAgICJpbkRpci9hcHBsaWNhdGlvbi53YWRsIiwKKyAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UudmVyc2lvbiJ9OworICAgIGZpbmFsIExpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisgICAgZm9yIChTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKKyAgICAgIGZpbGVzLmFkZChuZXcgRmlsZShwYXJlbnREaXIsIGZpbGVOYW1lKSk7CisgICAgfQorICAgIFRvcnJlbnRNZXRhZGF0YSBjcmVhdGVkVG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShwYXJlbnREaXIsIGZpbGVzLCBhbm5vdW5jZVVSSSwgbnVsbCwgY3JlYXRlZEJ5LCBjcmVhdGlvblRpbWVTZWNzLCBUb3JyZW50Q3JlYXRvci5ERUZBVUxUX1BJRUNFX0xFTkdUSCk7CisgICAgRmlsZSB0b3JyZW50RmlsZVdpbiA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvcGFyZW50RGlyLndpbi50b3JyZW50Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZUxpbnV4ID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIubGludXgudG9ycmVudCIpOworICAgIGZpbmFsIGJ5dGVbXSBleHBlY3RlZEJ5dGVzV2luID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkodG9ycmVudEZpbGVXaW4pOworICAgIGZpbmFsIGJ5dGVbXSBleHBlY3RlZEJ5dGVzTGludXggPSBGaWxlVXRpbHMucmVhZEZpbGVUb0J5dGVBcnJheSh0b3JyZW50RmlsZUxpbnV4KTsKKyAgICBmaW5hbCBieXRlW10gYWN0dWFsQnl0ZXMgPSBuZXcgVG9ycmVudFNlcmlhbGl6ZXIoKS5zZXJpYWxpemUoY3JlYXRlZFRvcnJlbnQpOworCisgICAgYXNzZXJ0VHJ1ZShIZXguZW5jb2RlSGV4U3RyaW5nKGV4cGVjdGVkQnl0ZXNXaW4pLmVxdWFscyhIZXguZW5jb2RlSGV4U3RyaW5nKGFjdHVhbEJ5dGVzKSkgfHwgSGV4LmVuY29kZUhleFN0cmluZyhleHBlY3RlZEJ5dGVzTGludXgpLmVxdWFscyhIZXguZW5jb2RlSGV4U3RyaW5nKGFjdHVhbEJ5dGVzKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpbGVuYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvcGFyZW50RGlyLndpbi50b3JyZW50Iik7CisgICAgVG9ycmVudE1ldGFkYXRhIHQyID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKHRvcnJlbnRGaWxlKTsKKyAgICBmaW5hbCBMaXN0PFRvcnJlbnRGaWxlPiB0bXBGaWxlTmFtZXMgPSB0Mi5nZXRGaWxlcygpOworICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBub3JtYWxpemVkRmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRtcEZpbGVOYW1lcy5zaXplKCkpOworICAgIGZvciAoVG9ycmVudEZpbGUgdG9ycmVudEZpbGVJbmZvIDogdG1wRmlsZU5hbWVzKSB7CisgICAgICBub3JtYWxpemVkRmlsZW5hbWVzLmFkZCh0Mi5nZXREaXJlY3RvcnlOYW1lKCkgKyAiLyIgKyB0b3JyZW50RmlsZUluZm8uZ2V0UmVsYXRpdmVQYXRoQXNTdHJpbmcoKS5yZXBsYWNlQWxsKCJcXFxcIiwgIi8iKSk7CisgICAgfQorICAgIFN0cmluZ1tdIGV4cGVjdGVkRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdCisgICAgICAgICAgICB7InBhcmVudERpci9BY2N1UmV2Q29tbW9uLmphciIsCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIiLAorICAgICAgICAgICAgICAgICAgICAicGFyZW50RGlyL2NvbW1vbnMtaW8tY2lvMi41XzMuamFyLmxpbmsiLAorICAgICAgICAgICAgICAgICAgICAicGFyZW50RGlyL2luRGlyL2FwcGxpY2F0aW9uLndhZGwiLAorICAgICAgICAgICAgICAgICAgICAicGFyZW50RGlyL3N0b3JhZ2UudmVyc2lvbiJ9OworICAgIGFzc2VydEVxdWFsc05vT3JkZXIobm9ybWFsaXplZEZpbGVuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbm9ybWFsaXplZEZpbGVuYW1lcy5zaXplKCldKSwgZXhwZWN0ZWRGaWxlbmFtZXMpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlckFubm91bmNlVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyQW5ub3VuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhZDhjMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlckFubm91bmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXJVdGlscy5sb2FkVG9ycmVudDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitAVGVzdAorcHVibGljIGNsYXNzIFRyYWNrZXJBbm5vdW5jZVRlc3QgeworCisgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIgPSBuZXcgVHJhY2tlcig2OTY5KTsKKyAgICB0cmFja2VyLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisgICAgdHJhY2tlci5zZXRQZWVyQ29sbGVjdG9yRXhwaXJlVGltZW91dCgxMCk7CisgICAgdGhpcy50cmFja2VyLnN0YXJ0KGZhbHNlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RfYW5ub3VuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgYXNzZXJ0RXF1YWxzKDAsIHRoaXMudHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKS5zaXplKCkpOworCisgICAgdGhpcy50cmFja2VyLmFubm91bmNlKGxvYWRUb3JyZW50KCJmaWxlMS5qYXIudG9ycmVudCIpKTsKKworICAgIGFzc2VydEVxdWFscygxLCB0aGlzLnRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkuc2l6ZSgpKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zdG9wKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQ2ODAyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db21tdW5pY2F0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVGVtcEZpbGVzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LlV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LldhaXRGb3I7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbW11bmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5TaGFyZWRUb3JyZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZpbGVDb2xsZWN0aW9uU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyLkFOTk9VTkNFX1VSTDsKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VyVXRpbHMuVEVTVF9SRVNPVVJDRVM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0Lio7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgVHJhY2tlclRlc3QgeworCisgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworICBwcml2YXRlIFRlbXBGaWxlcyB0ZW1wRmlsZXM7CisgIC8vICBwcml2YXRlIFN0cmluZyBteUxvZ2ZpbGU7CisgIHByaXZhdGUgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4oKTsKKworICBwcml2YXRlIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeSBjb21tdW5pY2F0aW9uTWFuYWdlckZhY3Rvcnk7CisKKworICBwdWJsaWMgVHJhY2tlclRlc3QoKSB7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5ID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeSgpOworICAgIGlmIChMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLmdldEFsbEFwcGVuZGVycygpLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgcmV0dXJuOworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKG5ldyBQYXR0ZXJuTGF5b3V0KCJbJWR7TU1kZCBISDptbTpzcyxTU1N9XSAlNnAgLSAlMjAuMjBjIC0gJW0gJW4iKSkpOworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoVXRpbHMuZ2V0TG9nTGV2ZWwoKSk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVtcEZpbGVzID0gbmV3IFRlbXBGaWxlcygpOworICAgIHN0YXJ0VHJhY2tlcigpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF90cmFja2VyX2FsbF9wb3J0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IHBvcnQgPSB0cmFja2VyLmdldEFubm91bmNlVVJJKCkuZ2V0UG9ydCgpOworICAgIGZpbmFsIEVudW1lcmF0aW9uPE5ldHdvcmtJbnRlcmZhY2U+IGUgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgIGZpbmFsIE5ldHdvcmtJbnRlcmZhY2UgbmkgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxJbmV0QWRkcmVzcz4gYWRkcmVzc2VzID0gbmkuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgd2hpbGUgKGFkZHJlc3Nlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICBmaW5hbCBJbmV0QWRkcmVzcyBhZGRyID0gYWRkcmVzc2VzLm5leHRFbGVtZW50KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgU29ja2V0IHMgPSBuZXcgU29ja2V0KGFkZHIsIHBvcnQpOworICAgICAgICAgIHMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIikuc3RhcnRzV2l0aCgiMS43LiIpIHx8IGFkZHIgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBjb25uZWN0IHRvICIgKyBhZGRyLCBleCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGVlcldpdGhNYW55SW50ZXJmYWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIExpc3Q8SW5ldEFkZHJlc3M+IHNlbGZBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpOworICAgIGZpbmFsIEVudW1lcmF0aW9uPE5ldHdvcmtJbnRlcmZhY2U+IG5ldHdvcmtJbnRlcmZhY2VzID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOworICAgIHdoaWxlIChuZXR3b3JrSW50ZXJmYWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgTmV0d29ya0ludGVyZmFjZSBuaSA9IG5ldHdvcmtJbnRlcmZhY2VzLm5leHRFbGVtZW50KCk7CisgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxJbmV0QWRkcmVzcz4gaW5ldEFkZHJlc3NlcyA9IG5pLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgIHdoaWxlIChpbmV0QWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gaW5ldEFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOworICAgICAgICBpZiAoaW5ldEFkZHJlc3MgaW5zdGFuY2VvZiBJbmV0NkFkZHJlc3MpIGNvbnRpbnVlOy8vIGlnbm9yZSBJUHY2IGFkZHJlc3NlcworCisgICAgICAgIHNlbGZBZGRyZXNzZXMuYWRkKGluZXRBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBJbmV0QWRkcmVzc1tdIGluZXRBZGRyZXNzZXMgPSBzZWxmQWRkcmVzc2VzLnRvQXJyYXkobmV3IEluZXRBZGRyZXNzW3NlbGZBZGRyZXNzZXMuc2l6ZSgpXSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCA9IHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSkuZ2V0SGV4SW5mb0hhc2goKTsKKyAgICBzZWVkZXIuc3RhcnQoaW5ldEFkZHJlc3Nlcyk7CisgICAgZmluYWwgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoMTAwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA9IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQoaGV4SW5mb0hhc2gpOworICAgICAgICByZXR1cm4gdHJhY2tlZFRvcnJlbnQgIT0gbnVsbCAmJiB0cmFja2VkVG9ycmVudC5nZXRQZWVycygpLnNpemUoKSA+PSBpbmV0QWRkcmVzc2VzLmxlbmd0aDsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSk7CisKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA9IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQoaGV4SW5mb0hhc2gpOworCisgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWRJcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgZm9yIChJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA6IGluZXRBZGRyZXNzZXMpIHsKKyAgICAgIGV4cGVjdGVkSXBzLmFkZChpbmV0QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICB9CisgICAgU2V0PFN0cmluZz4gYWN0dWFsSXBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGZvciAoVHJhY2tlZFBlZXIgcGVlciA6IHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCkudmFsdWVzKCkpIHsKKyAgICAgIGFjdHVhbElwcy5hZGQocGVlci5nZXRJcCgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsSXBzLCBleHBlY3RlZElwcyk7CisgICAgYXNzZXJ0RXF1YWxzKGluZXRBZGRyZXNzZXMubGVuZ3RoLCBhY3R1YWxJcHMuc2l6ZSgpKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9zaGFyZV9hbmRfZG93bmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0dCA9IHRoaXMudHJhY2tlci5hbm5vdW5jZShsb2FkVG9ycmVudCgiZmlsZTEuamFyLnRvcnJlbnQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHR0LmdldFBlZXJzKCkuc2l6ZSgpKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCk7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi90b3JyZW50cyIsICJmaWxlMS5qYXIudG9ycmVudCIpOworICAgIEZpbGUgcGFyZW50RmlsZXMgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvcGFyZW50RmlsZXMiKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcGFyZW50RmlsZXMuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKHR0LmdldEhleEluZm9IYXNoKCksIHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hbm5vdW5jZWFibGVUb3JyZW50cygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEhleEluZm9IYXNoKCkpOworCisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIHRyeSB7CisgICAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICBsZWVjaC5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsICJmaWxlMS5qYXIiKTsKKyAgICAgIGFzc2VydEZpbGVzRXF1YWwobmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzL2ZpbGUxLmphciIpLCBuZXcgRmlsZShkb3dubG9hZERpciwgImZpbGUxLmphciIpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbGVlY2guc3RvcCgpOworICAgICAgc2VlZGVyLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0cmFja2VyX2FjY2VwdHNfdG9ycmVudF9mcm9tX3NlZWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB0cnkgeworICAgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgd2FpdEZvclNlZWRlcihzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYW5ub3VuY2VhYmxlVG9ycmVudHMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRJbmZvSGFzaCgpKTsKKworICAgICAgQ29sbGVjdGlvbjxUcmFja2VkVG9ycmVudD4gdHJhY2tlZFRvcnJlbnRzID0gdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRyYWNrZWRUb3JyZW50cy5zaXplKCkpOworCisgICAgICBUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA9IHRyYWNrZWRUb3JyZW50cy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgIE1hcDxQZWVyVUlELCBUcmFja2VkUGVlcj4gcGVlcnMgPSB0cmFja2VkVG9ycmVudC5nZXRQZWVycygpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBlZXJzLnNpemUoKSk7CisgICAgICBhc3NlcnRUcnVlKHBlZXJzLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpLmlzQ29tcGxldGVkKCkpOyAvLyBzZWVkCisgICAgICBhc3NlcnRFcXVhbHMoMSwgdHJhY2tlZFRvcnJlbnQuc2VlZGVycygpKTsKKyAgICAgIGFzc2VydEVxdWFscygwLCB0cmFja2VkVG9ycmVudC5sZWVjaGVycygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc2VlZGVyLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0cmFja2VyX2FjY2VwdHNfdG9ycmVudF9mcm9tX2xlZWNoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIEZpbGUgZG93bmxvYWREaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgbmV3IFdhaXRGb3IoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgZm9yIChUcmFja2VkVG9ycmVudCB0dCA6IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkpIHsKKyAgICAgICAgICAgIGlmICh0dC5nZXRQZWVycygpLnNpemUoKSA9PSAxKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIENvbGxlY3Rpb248VHJhY2tlZFRvcnJlbnQ+IHRyYWNrZWRUb3JyZW50cyA9IHRoaXMudHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB0cmFja2VkVG9ycmVudHMuc2l6ZSgpKTsKKworICAgICAgVHJhY2tlZFRvcnJlbnQgdHJhY2tlZFRvcnJlbnQgPSB0cmFja2VkVG9ycmVudHMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICBNYXA8UGVlclVJRCwgVHJhY2tlZFBlZXI+IHBlZXJzID0gdHJhY2tlZFRvcnJlbnQuZ2V0UGVlcnMoKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCBwZWVycy5zaXplKCkpOworICAgICAgYXNzZXJ0RmFsc2UocGVlcnMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuaXNDb21wbGV0ZWQoKSk7IC8vIGxlZWNoCisgICAgICBhc3NlcnRFcXVhbHMoMCwgdHJhY2tlZFRvcnJlbnQuc2VlZGVycygpKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCB0cmFja2VkVG9ycmVudC5sZWVjaGVycygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbGVlY2guc3RvcCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRyYWNrZXJfcmVtb3Zlc19wZWVyX2FmdGVyX3BlZXJfc2h1dGRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworCisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgYzEgPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIGMxLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBjMS5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjMiA9IGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCk7CisgICAgYzIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGMyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHBhcmVudEZpbGVzLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSA9PSAxOworICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0dCA9IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gdHQuZ2V0UGVlcnMoKS5zaXplKCkgPT0gMjsKKyAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYzFBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBjMS5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldEJpbmRQb3J0KCkpOworICAgIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGMyQWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgYzIuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXRCaW5kUG9ydCgpKTsKKyAgICBhc3NlcnRUcnVlKHR0LmdldFBlZXJzKCkuY29udGFpbnNLZXkobmV3IFBlZXJVSUQoYzFBZGRyZXNzLCB0dC5nZXRIZXhJbmZvSGFzaCgpKSkpOworICAgIGFzc2VydFRydWUodHQuZ2V0UGVlcnMoKS5jb250YWluc0tleShuZXcgUGVlclVJRChjMkFkZHJlc3MsIHR0LmdldEhleEluZm9IYXNoKCkpKSk7CisKKyAgICBjMi5zdG9wKCk7CisgICAgbmV3IFdhaXRGb3IoMzAgKiAxMDAwKSB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gdHQuZ2V0UGVlcnMoKS5zaXplKCkgPT0gMTsKKyAgICAgIH0KKyAgICB9OworICAgIGFzc2VydFRydWUodHQuZ2V0UGVlcnMoKS5jb250YWluc0tleShuZXcgUGVlclVJRChjMUFkZHJlc3MsIHR0LmdldEhleEluZm9IYXNoKCkpKSk7CisgICAgYXNzZXJ0RmFsc2UodHQuZ2V0UGVlcnMoKS5jb250YWluc0tleShuZXcgUGVlclVJRChjMkFkZHJlc3MsIHR0LmdldEhleEluZm9IYXNoKCkpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0cmFja2VyX3JlbW92ZXNfcGVlcl9hZnRlcl90aW1lb3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgdHJhY2tlci5zdG9wKCk7CisgICAgdHJhY2tlci5zdGFydCh0cnVlKTsKKyAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHRvcnJlbnQgPSBjb21wbGV0ZVRvcnJlbnQoImZpbGUxLmphci50b3JyZW50Iik7CisgICAgdHJhY2tlci5zZXRQZWVyQ29sbGVjdG9yRXhwaXJlVGltZW91dCg1KTsKKworICAgIGludCBwZWVyUG9ydCA9IDY4ODU7CisgICAgU3RyaW5nIHBlZXJIb3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICBmaW5hbCBTdHJpbmcgYW5ub3VuY2VVcmxDMSA9ICJodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2U/aW5mb19oYXNoPSVCOS04JTA0bHYlRDc5SCVFMUxCJURGJTk5JTJDJUFGJTI1SCU5RCUwOCZwZWVyX2lkPS1UTzAwNDItOTdlYzMwOGM5NjM3JiIgKworICAgICAgICAgICAgInBvcnQ9IiArIHBlZXJQb3J0ICsgIiZ1cGxvYWRlZD0wJmRvd25sb2FkZWQ9MCZsZWZ0PTAmY29tcGFjdD0xJm5vX3BlZXJfaWQ9MCZpcD0iICsgcGVlckhvc3Q7CisKKyAgICB0cnkgeworICAgICAgZmluYWwgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IFVSTChhbm5vdW5jZVVybEMxKS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoIiIsIGUpOworICAgIH0KKworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGMyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBjMi5zZXRBbm5vdW5jZUludGVydmFsKDEyMCk7CisgICAgYzIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisgICAgYzIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcGFyZW50RmlsZXMuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdHQgPSB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdHQuZ2V0UGVlcnMoKS5zaXplKCkgPT0gMjsKKyAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYzFBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKHBlZXJIb3N0LCBwZWVyUG9ydCk7CisgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYzJBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBjMi5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldEJpbmRQb3J0KCkpOworICAgIGFzc2VydFRydWUodHQuZ2V0UGVlcnMoKS5jb250YWluc0tleShuZXcgUGVlclVJRChjMUFkZHJlc3MsIHR0LmdldEhleEluZm9IYXNoKCkpKSk7CisgICAgYXNzZXJ0VHJ1ZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMyQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKworICAgIG5ldyBXYWl0Rm9yKDMwICogMTAwMCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaW5hbCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgVVJMKGFubm91bmNlVXJsQzEpLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHQuZ2V0UGVlcnMoKS5zaXplKCkgPT0gMTsKKyAgICAgIH0KKyAgICB9OworICAgIGFzc2VydEVxdWFscyh0dC5nZXRQZWVycygpLnNpemUoKSwgMSk7CisgICAgYXNzZXJ0VHJ1ZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMxQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKyAgICBhc3NlcnRGYWxzZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMyQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKyAgfQorCisgIC8vICBAVGVzdChpbnZvY2F0aW9uQ291bnQgPSA1MCkKKyAgcHVibGljIHZvaWQgdHJhY2tlcl9hY2NlcHRzX3RvcnJlbnRfZnJvbV9zZWVkZXJfcGx1c19sZWVjaCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHRoaXMudHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKS5zaXplKCkpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCk7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgdHJ5IHsKKyAgICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBsZWVjaC5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsICJmaWxlMS5qYXIiKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc2VlZGVyLnN0b3AoKTsKKyAgICAgIGxlZWNoLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFRyYWNrZWRUb3JyZW50IGxvYWRUb3JyZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEgPSBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlRnJvbUZpbGUobmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgbmFtZSkpOworICAgIHJldHVybiBuZXcgVHJhY2tlZFRvcnJlbnQodG9ycmVudE1ldGFkYXRhLmdldEluZm9IYXNoKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN0YXJ0VHJhY2tlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHBvcnQgPSA2OTY5OworICAgIHRoaXMudHJhY2tlciA9IG5ldyBUcmFja2VyKHBvcnQsICJodHRwOi8vIiArIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKyBwb3J0ICsgIiIgKyBBTk5PVU5DRV9VUkwpOworICAgIHRyYWNrZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICB0cmFja2VyLnNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KDEwKTsKKyAgICB0aGlzLnRyYWNrZXIuc3RhcnQodHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3RvcFRyYWNrZXIoKSB7CisgICAgdGhpcy50cmFja2VyLnN0b3AoKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgOiBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QpIHsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0b3AoKTsKKyAgICB9CisgICAgc3RvcFRyYWNrZXIoKTsKKyAgICB0ZW1wRmlsZXMuY2xlYW51cCgpOworICB9CisKKyAgcHJpdmF0ZSBDb21tdW5pY2F0aW9uTWFuYWdlciBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpIHsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA9IGNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeS5nZXRDbGllbnQoIiIpOworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoY29tbXVuaWNhdGlvbk1hbmFnZXIpOworICAgIHJldHVybiBjb21tdW5pY2F0aW9uTWFuYWdlcjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3YWl0Rm9yRmlsZUluRGlyKGZpbmFsIEZpbGUgZG93bmxvYWREaXIsIGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgeworICAgIG5ldyBXYWl0Rm9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkb3dubG9hZERpciwgZmlsZU5hbWUpLmlzRmlsZSgpOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGRvd25sb2FkRGlyLCBmaWxlTmFtZSkuaXNGaWxlKCkpOworICB9CisKKyAgcHJpdmF0ZSBTaGFyZWRUb3JyZW50IGNvbXBsZXRlVG9ycmVudChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgbmFtZSk7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEgPSBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlRnJvbUZpbGUodG9ycmVudEZpbGUpOworICAgIHJldHVybiBTaGFyZWRUb3JyZW50LmZyb21GaWxlKHRvcnJlbnRGaWxlLAorICAgICAgICAgICAgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZSh0b3JyZW50TWV0YWRhdGEsIEZpbGVDb2xsZWN0aW9uU3RvcmFnZS5jcmVhdGUodG9ycmVudE1ldGFkYXRhLCBwYXJlbnRGaWxlcykpLAorICAgICAgICAgICAgbmV3IFRvcnJlbnRTdGF0aXN0aWMoKSk7CisgIH0KKworICBwcml2YXRlIFNoYXJlZFRvcnJlbnQgaW5jb21wbGV0ZVRvcnJlbnQoU3RyaW5nIG5hbWUsIEZpbGUgZGVzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgbmFtZSk7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZSh0b3JyZW50RmlsZSk7CisgICAgcmV0dXJuIFNoYXJlZFRvcnJlbnQuZnJvbUZpbGUodG9ycmVudEZpbGUsCisgICAgICAgICAgICAgIEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN0b3JhZ2UodG9ycmVudE1ldGFkYXRhLCBGaWxlQ29sbGVjdGlvblN0b3JhZ2UuY3JlYXRlKHRvcnJlbnRNZXRhZGF0YSwgZGVzdERpcikpLAorICAgICAgICAgICAgICBuZXcgVG9ycmVudFN0YXRpc3RpYygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3YWl0Rm9yU2VlZGVyKGZpbmFsIGJ5dGVbXSB0b3JyZW50SGFzaCkgeworICAgIG5ldyBXYWl0Rm9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIGZvciAoVHJhY2tlZFRvcnJlbnQgdHQgOiB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpKSB7CisgICAgICAgICAgaWYgKHR0LnNlZWRlcnMoKSA9PSAxICYmIHR0LmdldEhleEluZm9IYXNoKCkuZXF1YWxzKFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyh0b3JyZW50SGFzaCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEZpbGVzRXF1YWwoRmlsZSBmMSwgRmlsZSBmMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoZjEubGVuZ3RoKCksIGYyLmxlbmd0aCgpLCAiRmlsZXMgc2l6ZXMgZGlmZmVyIik7CisgICAgQ2hlY2tzdW0gYzEgPSBGaWxlVXRpbHMuY2hlY2tzdW0oZjEsIG5ldyBDUkMzMigpKTsKKyAgICBDaGVja3N1bSBjMiA9IEZpbGVVdGlscy5jaGVja3N1bShmMiwgbmV3IENSQzMyKCkpOworICAgIGFzc2VydEVxdWFscyhjMS5nZXRWYWx1ZSgpLCBjMi5nZXRWYWx1ZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVXRpbHMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhN2VjYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclV0aWxzLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgVHJhY2tlclV0aWxzIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JFU09VUkNFUyA9ICJzcmMvdGVzdC9yZXNvdXJjZXMiOworCisgIHB1YmxpYyBzdGF0aWMgVHJhY2tlZFRvcnJlbnQgbG9hZFRvcnJlbnQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZShuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCBuYW1lKSk7CisgICAgcmV0dXJuIG5ldyBUcmFja2VkVG9ycmVudCh0b3JyZW50TWV0YWRhdGEuZ2V0SW5mb0hhc2goKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9maWxlMS5qYXIgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUxLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQyNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9maWxlMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9maWxlMi5qYXIgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQ4ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9maWxlMi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvQWNjdVJldkNvbW1vbi5qYXIgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9BY2N1UmV2Q29tbW9uLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzVkYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvQWNjdVJldkNvbW1vbi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9jb21tb25zLWlvLWNpbzIuNV8zLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk2ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGluayBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL2NvbW1vbnMtaW8tY2lvMi41XzMuamFyLmxpbmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmOTJmZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL2NvbW1vbnMtaW8tY2lvMi41XzMuamFyLmxpbmsKQEAgLTAsMCArMSwyIEBACitFOlxEZXZEYXRhXFRlYW1jaXR5QnVpbGRzXDguMVxUZWFtQ2l0eS0yOTExN1xEYXRhXHN5c3RlbVxhcnRpZmFjdHNcQ29tbW9uc0lvXG9uZVw3XGNvbW1vbnMtaW8tY2lvMi41XzMuamFyCitFOlxEZXZEYXRhXFRlYW1jaXR5QnVpbGRzXDguMVxUZWFtQ2l0eS0yOTExN1xEYXRhXHN5c3RlbVxhcnRpZmFjdHNcQ29tbW9uc0lvXG9uZVw3XC50ZWFtY2l0eVx0b3JyZW50c1xjb21tb25zLWlvLWNpbzIuNV8zLmphci50b3JyZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvaW5EaXIvYXBwbGljYXRpb24ud2FkbCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL2luRGlyL2FwcGxpY2F0aW9uLndhZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2NTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL2luRGlyL2FwcGxpY2F0aW9uLndhZGwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PG5zMjphcHBsaWNhdGlvbiB4bWxuczpuczI9Imh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIj48bnMyOmRvYyB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIiBqZXJzZXk6Z2VuZXJhdGVkQnk9IkplcnNleTogMS4xNiAxMS8yOC8yMDEyIDAyOjA5IFBNIi8+PG5zMjpkb2MgdGl0bGU9IlRlYW1DaXR5IFJFU1QgQVBJIiB4bWw6bGFuZz0iZW4iPgorICAgIFNlZSBhbHNvIGh0dHA6Ly9jb25mbHVlbmNlLmpldGJyYWlucy5uZXQvZGlzcGxheS9UVy9SRVNUK0FQSStQbHVnaW4KKyAgPC9uczI6ZG9jPjxuczI6Z3JhbW1hcnM+PG5zMjppbmNsdWRlIGhyZWY9ImFwcGxpY2F0aW9uLndhZGwveHNkMS54c2QiPjxuczI6ZG9jIHRpdGxlPSJHZW5lcmF0ZWQiIHhtbDpsYW5nPSJlbiIvPjwvbnMyOmluY2x1ZGU+PG5zMjppbmNsdWRlIGhyZWY9ImFwcGxpY2F0aW9uLndhZGwveHNkMC54c2QiPjxuczI6ZG9jIHRpdGxlPSJHZW5lcmF0ZWQiIHhtbDpsYW5nPSJlbiIvPjwvbnMyOmluY2x1ZGU+PC9uczI6Z3JhbW1hcnM+PG5zMjpyZXNvdXJjZXMgYmFzZT0iaHR0cDovL2J1aWxkc2VydmVyLmxhYnMuaW50ZWxsaWoubmV0LyI+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvcHJvamVjdHMiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVByb2plY3RzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3RzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNyZWF0ZVByb2plY3QiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld1Byb2plY3REZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld1Byb2plY3REZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY3JlYXRlRW1wdHlQcm9qZWN0IiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vdGVtcGxhdGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImNyZWF0ZUJ1aWxkVHlwZVRlbXBsYXRlIiBuYW1lPSJQT1NUIj48bnMyOmRvYz5DcmVhdGVzIGEgbmV3IGJ1aWxkIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGUgYnkgY29weWluZyBleGlzdGluZyBvbmUuPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld0J1aWxkVHlwZURlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3QnVpbGRUeXBlRGVzY3JpcHRpb24iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVRlbXBsYXRlc0luUHJvamVjdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY3JlYXRlRW1wdHlCdWlsZFR5cGVUZW1wbGF0ZSIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9wYXJhbWV0ZXJzL3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJwdXRQYXJhbWV0ZXIiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVBhcmFtZXRlciIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVQYXJhbWV0ZXIiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVQcm9qZWN0IiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L3BhcmVudFByb2plY3QiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0UGFyZW50UHJvamVjdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdC1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0LXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXRQYXJlbnRQcm9qZWN0IiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdC1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdC1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L2J1aWxkVHlwZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iY3JlYXRlQnVpbGRUeXBlIiBuYW1lPSJQT1NUIj48bnMyOmRvYz5DcmVhdGVzIGEgbmV3IGJ1aWxkIGNvbmZpZ3VyYXRpb24gYnkgY29weWluZyBleGlzdGluZyBvbmUuPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld0J1aWxkVHlwZURlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3QnVpbGRUeXBlRGVzY3JpcHRpb24iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJjcmVhdGVFbXB0eUJ1aWxkVHlwZSIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlc0luUHJvamVjdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L2J1aWxkVHlwZXMve2J0TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXRQcm9qZWN0RmlsZWQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVByb2plY3RGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vdGVtcGxhdGVzL3tidExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVUZW1wbGF0ZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vcGFyYW1ldGVycyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVBhcmFtZXRlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNoYW5nZUFsbFBhcmFtZXRlcnMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUFsbFBhcmFtZXRlcnMiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vYnVpbGRUeXBlcy97YnRMb2NhdG9yfS9idWlsZHMve2J1aWxkTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRGaWVsZFdpdGhQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9idWlsZFR5cGVzL3tidExvY2F0b3J9L2J1aWxkcy97YnVpbGRMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFdpdGhQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9uZXdQcm9qZWN0RGVzY3JpcHRpb24iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RXhhbXBsZU5ld1Byb2plY3REZXNjcmlwdGlvbiIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5LgorIFVzZSB0aGlzIHRvIGdldCBhbiBleGFtcGxlIG9mIHRoZSBiZWFuIHRvIGJlIHBvc3RlZCB0byB0aGUgL3Byb2plY3RzIHJlcXVlc3QgdG8gY3JlYXRlIGEgbmV3IHByb2plY3Q8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld1Byb2plY3REZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld1Byb2plY3REZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vYnVpbGRUeXBlcy97YnRMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlRmllbGRXaXRoUHJvamVjdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vYnVpbGRUeXBlcy97YnRMb2NhdG9yfS9idWlsZHMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5TZXJ2ZXMgYnVpbGRzIG1hdGNoaW5nIHN1cHBsaWVkIGNvbmRpdGlvbi48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGF0dXMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRyaWdnZXJlZEJ5VXNlciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZVBlcnNvbmFsIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZUNhbmNlbGVkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ib25seVBpbm5lZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRhZyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYWdlbnROYW1lIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZUJ1aWxkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZURhdGUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0YXJ0IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmxvbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY291bnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6aW50Ii8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvdmNzLXJvb3QtaW5zdGFuY2VzIj48bnMyOm1ldGhvZCBpZD0ic2VydmVJbnN0YW5jZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290SW5zdGFuY2VMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlSW5zdGFuY2UiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2UiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdEluc3RhbmNlTG9jYXRvcn0vcHJvcGVydGllcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlUm9vdEluc3RhbmNlUHJvcGVydGllcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdEluc3RhbmNlTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290SW5zdGFuY2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUluc3RhbmNlRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2V0SW5zdGFuY2VGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvdXNlcnMiPjxuczI6bWV0aG9kIGlkPSJjcmVhdGVVc2VyIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlVXNlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InVzZXJzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlcnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9L3JvbGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImFkZFJvbGUiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlUm9sZXMiIG5hbWU9IlBVVCI+PG5zMjpkb2M+UmVwbGFjZXMgdXNlcidzIHJvbGVzIHdpdGggdGhlIHN1Ym1pdHRlZCBvbmVzPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ibGlzdFJvbGVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3VzZXJMb2NhdG9yfS9yb2xlcy97cm9sZUlkfS97c2NvcGV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InNjb3BlIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJyb2xlSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImFkZFJvbGVTaW1wbGUiIG5hbWU9IlBVVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVJvbGUiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJsaXN0Um9sZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkUm9sZVNpbXBsZVBvc3QiIG5hbWU9IlBPU1QiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlVXNlciIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InVzZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0idXBkYXRlVXNlciIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InVzZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNldFVzZXJGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlVXNlckZpZWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3VzZXJMb2NhdG9yfS9wcm9wZXJ0aWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlVXNlclByb3BlcnRpZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3VzZXJMb2NhdG9yfS9wcm9wZXJ0aWVzL3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InVzZXJMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVVzZXJQcm9wZXJ0aWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InB1dFVzZXJQcm9wZXJ0eSIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlbW92ZVVzZXJQcm9wZXJ0eSIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvY2hhbmdlcyI+PG5zMjptZXRob2QgaWQ9InNlcnZlQ2hhbmdlcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5MaXN0cyBjaGFuZ2VzIGJ5IHRoZSBzcGVjaWZpZWQgbG9jYXRvcjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3QiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIj48bnMyOmRvYz5DaGFuZ2UgbG9jYXRvcjwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRUeXBlIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyI+PG5zMjpkb2M+RGVwcmVjYXRlZCwgdXNlICZxdW90O2xvY2F0b3ImcXVvdDsgcGFyYW1ldGVyIGluc3RlYWQ8L25zMjpkb2M+PC9uczI6cGFyYW0+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyI+PG5zMjpkb2M+RGVwcmVjYXRlZCwgdXNlICZxdW90O2xvY2F0b3ImcXVvdDsgcGFyYW1ldGVyIGluc3RlYWQ8L25zMjpkb2M+PC9uczI6cGFyYW0+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3QiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIj48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZDwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2luY2VDaGFuZ2UiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIj48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZC4gTm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgbG9jYXRvciBkaW1lbnNpb24gaXMgJnF1b3Q7dmNzUm9vdEluc3RhbmNlJnF1b3Q7PC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGFydCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpsb25nIj48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZDwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY291bnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6aW50Ij48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZDwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibG9jYXRvciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciPjxuczI6ZG9jPkRlcHJlY2F0ZWQsIHVzZSAmcXVvdDtsb2NhdG9yJnF1b3Q7IHBhcmFtZXRlciBpbnN0ZWFkPC9uczI6ZG9jPjwvbnMyOnBhcmFtPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0vcGFyZW50LWNoYW5nZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRQYXJlbnRDaGFuZ2VzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iY2hhbmdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfS9wYXJlbnQtcmV2aXNpb25zIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlUGFyZW50UmV2aXNpb25zIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkhPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJpdGVtcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Iml0ZW1zIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L3Zjcy1yb290Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlVkNTUm9vdCIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5ITwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2UtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2UtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L2F0dHJpYnV0ZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VBdHRyaWJ1dGVzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkhPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfS9kdXBsaWNhdGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlRHVwbGljYXRlcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5ITwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iY2hhbmdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0vaXNzdWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlSXNzdWUiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHN1cHBvcnQgb25seSE8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3VlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3VlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfS9idWlsZFR5cGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0UmVsYXRlZEJ1aWxkVHlwZXMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHN1cHBvcnQgb25seSE8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L2ZpcnN0QnVpbGRzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0Q2hhbmdlRmlyc3RCdWlsZHMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHN1cHBvcnQgb25seSE8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImNoYW5nZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQ2hhbmdlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2UiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2UiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC9zZXJ2ZXIiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVNlcnZlckluZm8iIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNlcnZlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNlcnZlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL2JhY2t1cCI+PG5zMjptZXRob2QgaWQ9InN0YXJ0QmFja3VwIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpbGVOYW1lIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhZGRUaW1lc3RhbXAiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpbmNsdWRlQ29uZmlncyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVEYXRhYmFzZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVCdWlsZExvZ3MiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpbmNsdWRlUGVyc29uYWxDaGFuZ2VzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldEJhY2t1cFN0YXR1cyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3BsdWdpbnMiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVBsdWdpbnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InBsdWdpbnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwbHVnaW5zIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVNlcnZlclZlcnNpb24iIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC9idWlsZFR5cGVzIj48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVzWE1MIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmZWF0dXJlSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEZlYXR1cmUiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmZWF0dXJlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUZlYXR1cmUiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2FydGlmYWN0LWRlcGVuZGVuY2llcy97YXJ0aWZhY3REZXBMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYXJ0aWZhY3REZXBMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBcnRpZmFjdERlcCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQXJ0aWZhY3REZXAiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2FnZW50LXJlcXVpcmVtZW50cy97YWdlbnRSZXF1aXJlbWVudExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhZ2VudFJlcXVpcmVtZW50TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0QWdlbnRSZXF1aXJlbWVudCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVBZ2VudFJlcXVpcmVtZW50IiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zdGVwcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iYWRkU3RlcCIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VTdGVwcyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldFN0ZXBzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vZmVhdHVyZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEZlYXR1cmVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmZWF0dXJlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZEZlYXR1cmUiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmUiIG1lZGlhVHlwZT0iKi8qIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icmVwbGFjZUZlYXR1cmVzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9pbnZlc3RpZ2F0aW9ucyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0SW52ZXN0aWdhdGlvbnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImludmVzdGlnYXRpb25zIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaW52ZXN0aWdhdGlvbnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS92Y3Mtcm9vdC1lbnRyaWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRWY3NSb290RW50cmllcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cmllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icmVwbGFjZVZjc1Jvb3RFbnRyaWVzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cmllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRWY3NSb290RW50cnkiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJ5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJ5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS92Y3Mtcm9vdC1lbnRyaWVzL3tpZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRWY3NSb290RW50cnkiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJ5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlVmNzUm9vdEVudHJ5IiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zbmFwc2hvdC1kZXBlbmRlbmNpZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VTbmFwc2hvdERlcHMiIG5hbWU9IlBVVCI+PG5zMjpkb2M+UmVwbGFjZXMgc25hcHNob3QgZGVwZW5kZW5jeSB3aXRoIHRob3NlIHNlbnQgaW4gcmVxdWVzdC48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkU25hcHNob3REZXAiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkNyZWF0ZXMgbmV3IHNuYXBzaG90IGRlcGVuZGVuY3kuICdpZCcgYXR0cmlidXRlIGlzIGlnbm9yZWQgaW4gdGhlIHN1Ym1pdHRlZCBkZXNjcmlwdG9yLgorIFJlcG9ydHMgZXJyb3IgaWYgbmV3IGRlcGVuZGVuY3kgY2Fubm90IGJlIGNyZWF0ZWQgKGUuZy4gYW5vdGhlciBkZXBlbmRlbmN5IG9uIHRoZSBzcGVjaWZpZWQgYnVpbGQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGV4aXN0cykuPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJnZXRTbmFwc2hvdERlcHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3NuYXBzaG90LWRlcGVuZGVuY2llcy97c25hcHNob3REZXBMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic25hcHNob3REZXBMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJkZWxldGVTbmFwc2hvdERlcCIgbmFtZT0iREVMRVRFIi8+PG5zMjptZXRob2QgaWQ9ImdldFNuYXBzaG90RGVwIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3RyaWdnZXJzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlVHJpZ2dlcnMiIG5hbWU9IlBVVCI+PG5zMjpkb2M+UmVwbGFjZXMgdHJpZ2dlciB3aXRoIHRob3NlIHNlbnQgaW50aGUgcmVxdWVzdC48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlcnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlcnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRUcmlnZ2VyIiBuYW1lPSJQT1NUIj48bnMyOmRvYz5DcmVhdGVzIG5ldyB0cmlnZ2VyLiAnaWQnIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGluIHRoZSBzdWJtaXR0ZWQgZGVzY3JpcHRvci4KKyBSZXBvcnRzIGVycm9yIGlmIG5ldyB0cmlnZ2VyIGNhbm5vdCBiZSBjcmVhdGVkIChlLmcuIG9ubHkgc2luZ2xlIHRyaWdnZXIgb2YgdGhlIHR5cGUgaXMgYWxsb3dlZCBmb3IgYSBidWlsZCBjb25maWd1cmF0aW9uKS48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldFRyaWdnZXJzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXJzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vdHJpZ2dlcnMve3RyaWdnZXJMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idHJpZ2dlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVRyaWdnZXIiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJnZXRUcmlnZ2VyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3RyaWdnZXJzL3t0cmlnZ2VyTG9jYXRvcn0ve2ZpZWxkTmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRyaWdnZXJMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZE5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFRyaWdnZXJTZXR0aW5nIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNoYW5nZVRyaWdnZXJTZXR0aW5nIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9hZ2VudC1yZXF1aXJlbWVudHMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VBZ2VudFJlcXVpcmVtZW50cyIgbmFtZT0iUFVUIj48bnMyOmRvYz5SZXBsYWNlcyBhZ2VudCByZXF1aXJlbWVudHMgd2l0aCB0aG9zZSBzZW50IGluIHRoZSByZXF1ZXN0LjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRBZ2VudFJlcXVpcmVtZW50IiBuYW1lPSJQT1NUIj48bnMyOmRvYz5DcmVhdGVzIG5ldyBhZ2VudCByZXF1aXJlbWVudC4gJ2lkJyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpbiB0aGUgc3VibWl0dGVkIGRlc2NyaXB0b3IuCisgUmVwb3J0cyBlcnJvciBpZiBuZXcgcmVxdWlyZW1lbnQgY2Fubm90IGJlIGNyZWF0ZWQgKGUuZy4gYW5vdGhlciByZXF1aXJlbWVudCBpcyBwcmVzZW50IGZvciB0aGUgcGFyYW1ldGVyKS48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJnZXRBZ2VudFJlcXVpcmVtZW50cyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vdmNzLXJvb3QtaW5zdGFuY2VzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDdXJyZW50VmNzSW5zdGFuY2VzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9idWlsZHMve2J1aWxkTG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFdpdGhQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYnVpbGRzL3tidWlsZExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2JyYW5jaGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJyYW5jaGVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJicmFuY2hlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJyYW5jaGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vdmNzLWxhYmVsaW5nIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRWQ1NMYWJlbGluZ09wdGlvbnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1sYWJlbGluZyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1sYWJlbGluZyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXRWQ1NMYWJlbGluZ09wdGlvbnMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLWxhYmVsaW5nIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLWxhYmVsaW5nIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3MtbGFiZWxpbmciIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3MtbGFiZWxpbmciIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9uZXdCdWlsZFR5cGVEZXNjcmlwdGlvbiI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RXhhbXBsZU5ld1Byb2plY3REZXNjcmlwdGlvbiIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5LgorIFVzZSB0aGlzIHRvIGdldCBhbiBleGFtcGxlIG9mIHRoZSBiZWFuIHRvIGJlIHBvc3RlZCB0byB0aGUgL2J1aWxkVHlwZXMgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgYnVpbGQgdHlwZTwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3QnVpbGRUeXBlRGVzY3JpcHRpb24iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJuZXdCdWlsZFR5cGVEZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2J1aWxkcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZHMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+U2VydmVzIGJ1aWxkcyBtYXRjaGluZyBzdXBwbGllZCBjb25kaXRpb24uPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic3RhdHVzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ0cmlnZ2VyZWRCeVVzZXIiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVQZXJzb25hbCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVDYW5jZWxlZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im9ubHlQaW5uZWQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ0YWciIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFnZW50TmFtZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2luY2VCdWlsZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2luY2VEYXRlIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGFydCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpsb25nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImNvdW50IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmludCIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3N0ZXBzL3tzdGVwSWR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGVwSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVN0ZXAiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJnZXRTdGVwIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZVhNTCIgbmFtZT0iR0VUIj48bnMyOmRvYz5TZXJ2ZXMgYnVpbGQgY29uZmlndXJhdGlvbiBvciB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhdG9yLjwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUJ1aWxkVHlwZSIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2V0QnVpbGRUeXBlRmllbGQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2J1aWxkVGFncyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVCdWlsZHNUYWdzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3BhcmFtZXRlcnMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlUGFyYW1ldGVycyIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY2hhbmdlQnVpbGRUeXBlUGFyYW1ldGVycyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQWxsQnVpbGRUeXBlUGFyYW1ldGVycyIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vcGFyYW1ldGVycy97bmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlUGFyYW1ldGVyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InB1dEJ1aWxkVHlwZVBhcmFtZXRlciIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUJ1aWxkVHlwZVBhcmFtZXRlciIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vc2V0dGluZ3Mve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZVNldHRpbmdzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InB1dEJ1aWxkVHlwZVNldHRpbmciIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vc2V0dGluZ3MiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlU2V0dGluZ3MiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VCdWlsZFR5cGVTZXR0aW5ncyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS90ZW1wbGF0ZSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVUZW1wbGF0ZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlLXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZS1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZ2V0VGVtcGxhdGVBc3NvY2lhdGlvbiIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlLXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVUZW1wbGF0ZUFzc29jaWF0aW9uIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zdGVwcy97c3RlcElkfS9wYXJhbWV0ZXJzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGVwSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFN0ZXBQYXJhbWV0ZXJzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlU3RlcFBhcmFtZXRlcnMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vc3RlcHMve3N0ZXBJZH0vcGFyYW1ldGVycy97cGFyYW1ldGVyTmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0ZXBJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icGFyYW1ldGVyTmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0U3RlcFBhcmFtZXRlciIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRTdGVwUGFyYW1ldGVyIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zdGVwcy97c3RlcElkfS97ZmllbGROYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGROYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGVwSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFN0ZXBTZXR0aW5nIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNoYW5nZVN0ZXBTZXR0aW5nIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9mZWF0dXJlcy97ZmVhdHVyZUlkfS9wYXJhbWV0ZXJzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmZWF0dXJlSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEZlYXR1cmVQYXJhbWV0ZXJzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlRmVhdHVyZVBhcmFtZXRlcnMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vZmVhdHVyZXMve2ZlYXR1cmVJZH0vcGFyYW1ldGVycy97cGFyYW1ldGVyTmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZlYXR1cmVJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icGFyYW1ldGVyTmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RmVhdHVyZVBhcmFtZXRlciIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRGZWF0dXJlUGFyYW1ldGVyIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9L3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmVhdHVyZUlkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRGZWF0dXJlU2V0dGluZyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJjaGFuZ2VGZWF0dXJlU2V0dGluZyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYXJ0aWZhY3QtZGVwZW5kZW5jaWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBcnRpZmFjdERlcHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlQXJ0aWZhY3REZXBzIiBuYW1lPSJQVVQiPjxuczI6ZG9jPlJlcGxhY2VzIHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhvc2Ugc2VudCBpbiB0aGUgcmVxdWVzdC48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkQXJ0aWZhY3REZXAiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iKi8qIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC91c2VyR3JvdXBzIj48bnMyOm1ldGhvZCBpZD0iYWRkR3JvdXAiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imdyb3VwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imdyb3VwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2VydmVHcm91cHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imdyb3VwcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imdyb3VwcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tncm91cExvY2F0b3J9L3JvbGVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZ3JvdXBMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJhZGRSb2xlIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ibGlzdFJvbGVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZFJvbGVQdXQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tncm91cExvY2F0b3J9L3JvbGVzL3tyb2xlSWR9L3tzY29wZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJncm91cExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InNjb3BlIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJyb2xlSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImFkZFJvbGVTaW1wbGUiIG5hbWU9IlBPU1QiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVSb2xlIiBuYW1lPSJERUxFVEUiLz48bnMyOm1ldGhvZCBpZD0ibGlzdFJvbGUiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2dyb3VwTG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJncm91cExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUdyb3VwIiBuYW1lPSJERUxFVEUiLz48bnMyOm1ldGhvZCBpZD0ic2VydmVHcm91cCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJncm91cCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L2RlYnVnIj48bnMyOmRvYz5Qcm92aWRlcyBzb21lIGRlYnVnIGFiaWxpdGllcyBmb3IgdGhlIHNlcnZlci4gRXhwZXJpbWVudGFsIG9ubHkuIFNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiBvciBiZXR0ZXIgbm90IHVzZWQgaWYgbm90IGFkdmlzZWQgYnkgSmV0QnJhaW5zCisgVGhlc2Ugc2hvdWxkIG5ldmVyIGJlIHVzZWQgZm9yIG5vbi1kZWJ1ZyBwdXJwb3NlcyBhbmQgdGhlIEFQSSBoZXJlIGNhbiBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFRlYW1DaXR5IHdpdGhvdXQgYW55IG5vdGljZS48L25zMjpkb2M+PG5zMjpyZXNvdXJjZSBwYXRoPSIvZGF0YWJhc2UvcXVlcnkve3F1ZXJ5fSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InF1ZXJ5IiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJleGVjdXRlREJRdWVyeSIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkRGVsaW1pdGVyIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iLCAiLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY291bnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSIxMDAwIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Ii8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3Zjc0NoZWNraW5nRm9yQ2hhbmdlc1F1ZXVlIj48bnMyOm1ldGhvZCBpZD0ic2NoZWR1bGVDaGVja2luZ0ZvckNoYW5nZXMiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCB1c2Ugb25seSE8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2RhdGFiYXNlL3RhYmxlcyI+PG5zMjptZXRob2QgaWQ9Imxpc3REQlRhYmxlcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Ii8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L2J1aWxkcyI+PG5zMjptZXRob2QgaWQ9InNlcnZlQWxsQnVpbGRzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPlNlcnZlcyBidWlsZHMgbWF0Y2hpbmcgc3VwcGxpZWQgY29uZGl0aW9uLjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkVHlwZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic3RhdHVzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ0cmlnZ2VyZWRCeVVzZXIiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVQZXJzb25hbCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVDYW5jZWxlZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im9ubHlQaW5uZWQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ0YWciIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFnZW50TmFtZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2luY2VCdWlsZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2luY2VEYXRlIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGFydCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpsb25nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImNvdW50IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmludCIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3Jlc3VsdGluZy1wcm9wZXJ0aWVzL3twcm9wZXJ0eU5hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvcGVydHlOYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFBhcmFtZXRlciIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L2FydGlmYWN0cyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0QXJ0aWZhY3RzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPk1vcmUgdXNlci1mcmllbmRseSBVUkwgZm9yICZxdW90Oy97YnVpbGRMb2NhdG9yfS9hcnRpZmFjdHMvY2hpbGRyZW4mcXVvdDsgb25lLjwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmlsZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmaWxlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L2FydGlmYWN0cy9tZXRhZGF0YXtwYXRoOigvLiopP30iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwYXRoIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0TWV0YWRhdGEiIG5hbWU9IkdFVCI+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJyZXNvbHZlUGFyYW1ldGVycyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmlsZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZpbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQnVpbGQiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vcGluLyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0icGluQnVpbGQiIG5hbWU9IlBVVCI+PG5zMjpkb2M+UGlucyBhIGJ1aWxkPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJnZXRQaW5uZWQiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RmV0Y2hlcyBjdXJyZW50IGJ1aWxkIHBpbm5lZCBzdGF0dXMuPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InVucGluQnVpbGQiIG5hbWU9IkRFTEVURSI+PG5zMjpkb2M+VW5waW5zIGEgYnVpbGQ8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vdGFncy8iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlVGFncyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkVGFncyIgbmFtZT0iUE9TVCI+PG5zMjpkb2M+QWRkcyBhIHNldCBvZiB0YWdzIHRvIGEgYnVpbGQ8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRUYWciIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkFkZHMgYSBzaW5nbGUgdGFnIHRvIGEgYnVpbGQ8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlVGFncyIgbmFtZT0iUFVUIj48bnMyOmRvYz5SZXBsYWNlcyBidWlsZCdzIHRhZ3MuPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3Jlc3VsdGluZy1wcm9wZXJ0aWVzLyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZEFjdHVhbFBhcmFtZXRlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vYXJ0aWZhY3RzL2NoaWxkcmVue3BhdGg6KC8uKik/fSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InBhdGgiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBcnRpZmFjdENoaWxkcmVuIiBuYW1lPSJHRVQiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icmVzb2x2ZVBhcmFtZXRlcnMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZpbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmlsZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9hcnRpZmFjdHMvY29udGVudHtwYXRoOigvLiopP30iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwYXRoIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0Q29udGVudCIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InJlc29sdmVQYXJhbWV0ZXJzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9hcnRpZmFjdHMvZmlsZXN7cGF0aDooLy4qKT99Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icGF0aCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBcnRpZmFjdEZpbGVzQ29udGVudCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vc291cmNlcy9maWxlcy97ZmlsZU5hbWU6Lit9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmlsZU5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVTb3VyY2VGaWxlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9yZWxhdGVkLWlzc3VlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFJlbGF0ZWRJc3N1ZXNPbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3Vlc1VzYWdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3Vlc1VzYWdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3JlbGF0ZWRJc3N1ZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRSZWxhdGVkSXNzdWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJpc3N1ZXNVc2FnZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJpc3N1ZXNVc2FnZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZEZpZWxkQnlCdWlsZE9ubHkiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9zdGF0aXN0aWNzLyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFN0YXRpc3RpY1ZhbHVlcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9zdGF0aXN0aWNzL3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFN0YXRpc3RpY1ZhbHVlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vY29tbWVudCI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0icmVwbGFjZUNvbW1lbnQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUNvbW1lbnQiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3N0YXR1c0ljb24iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRTdGF0dXNJY29uIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC9jY3RyYXkiPjxuczI6cmVzb3VyY2UgcGF0aD0iL3Byb2plY3RzLnhtbCI+PG5zMjptZXRob2QgaWQ9InNlcnZlUHJvamVjdHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9IlByb2plY3RzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iUHJvamVjdHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC92Y3Mtcm9vdHMiPjxuczI6bWV0aG9kIGlkPSJhZGRSb290IiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlUm9vdHMiIG5hbWU9IkdFVCI+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290TG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2V0RmllbGQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUZpZWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS9wcm9wZXJ0aWVzL3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJwdXRQYXJhbWV0ZXIiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVByb3BlcnR5IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVBhcmFtZXRlciIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVJvb3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlUm9vdCIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS9pbnN0YW5jZXMve3Zjc1Jvb3RJbnN0YW5jZUxvY2F0b3J9L3Byb3BlcnRpZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290SW5zdGFuY2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVSb290SW5zdGFuY2VQcm9wZXJ0aWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290TG9jYXRvcn0vaW5zdGFuY2VzL3t2Y3NSb290SW5zdGFuY2VMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUluc3RhbmNlRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2V0SW5zdGFuY2VGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS9pbnN0YW5jZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVSb290SW5zdGFuY2VzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdExvY2F0b3J9L2luc3RhbmNlcy97dmNzUm9vdEluc3RhbmNlTG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290SW5zdGFuY2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ2Y3NSb290TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciPjxuczI6ZG9jPnRoaXMgaXMgZWZmZWN0aXZlbHkgaWdub3JlZCBhcyB2Y3NSb290SW5zdGFuY2VMb2NhdG9yIHNob3VsZCBzcGVjaWZ5IGluc3RhbmNlIGZ1bGx5PC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVJvb3RJbnN0YW5jZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2UiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290TG9jYXRvcn0vcHJvcGVydGllcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVByb3BlcnRpZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNoYW5nUHJvcGVydGllcyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQWxsUHJvcGVydGllcyIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVJvb3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOnJlc291cmNlIHBhdGg9Ii92ZXJzaW9uIj48bnMyOm1ldGhvZCBpZD0ic2VydmVBcGlWZXJzaW9uIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvaW5mbyI+PG5zMjptZXRob2QgaWQ9InNlcnZlUGx1Z2luSW5mbyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icGx1Z2luIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L3tidExvY2F0b3J9L3tidWlsZExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkRmllbGRTaG9ydCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L2FnZW50cyI+PG5zMjptZXRob2QgaWQ9InNlcnZlQWdlbnRzIiBuYW1lPSJHRVQiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZURpc2Nvbm5lY3RlZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVVbmF1dGhvcml6ZWQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50cy1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudHMtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2FnZW50TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhZ2VudExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQWdlbnQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YWdlbnRMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFnZW50TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVBZ2VudEZpZWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNldEFnZW50RmllbGQiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlcz48L25zMjphcHBsaWNhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9zdG9yYWdlLnZlcnNpb24gYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9zdG9yYWdlLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyNjNlZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL3N0b3JhZ2UudmVyc2lvbgpAQCAtMCwwICsxIEBACisyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMS5qYXIudG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTEuamFyLnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2OTc0NAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTEuamFyLnRvcnJlbnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMi5qYXIudG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTIuamFyLnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkM2EzYQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTIuamFyLnRvcnJlbnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIubGludXgudG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvcGFyZW50RGlyLmxpbnV4LnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0Y2U1NgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvcGFyZW50RGlyLmxpbnV4LnRvcnJlbnQKQEAgLTAsMCArMSBAQAorZDg6YW5ub3VuY2UzMDpodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UxMDpjcmVhdGVkIGJ5NTpUZXN0MjEzOmNyZWF0aW9uIGRhdGVpMTM3NjA1MTAwMGU0OmluZm9kNTpmaWxlc2xkNjpsZW5ndGhpMjUyNzg4ZTQ6cGF0aGwxNzpBY2N1UmV2Q29tbW9uLmphcmVlZDY6bGVuZ3RoaTE4ODkxMGU0OnBhdGhsMjM6Y29tbW9ucy1pby1jaW8yLjVfMy5qYXJlZWQ2Omxlbmd0aGkyNDBlNDpwYXRobDI4OmNvbW1vbnMtaW8tY2lvMi41XzMuamFyLmxpbmtlZWQ2Omxlbmd0aGk4MjI5N2U0OnBhdGhsNTppbkRpcjE2OmFwcGxpY2F0aW9uLndhZGxlZWQ2Omxlbmd0aGkxZTQ6cGF0aGwxNTpzdG9yYWdlLnZlcnNpb25lZWU0Om5hbWU5OnBhcmVudERpcjEyOnBpZWNlIGxlbmd0aGk1MjQyODhlNjpwaWVjZXMyMDqeBk7cSr5N2D37odFdf4t2YqajNmVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIud2luLnRvcnJlbnQgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL3BhcmVudERpci53aW4udG9ycmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAyOTJkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIud2luLnRvcnJlbnQKQEAgLTAsMCArMSBAQAorZDg6YW5ub3VuY2UzMDpodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UxMDpjcmVhdGVkIGJ5NTpUZXN0MjEzOmNyZWF0aW9uIGRhdGVpMTM3NjA1MTAwMGU0OmluZm9kNTpmaWxlc2xkNjpsZW5ndGhpMjUyNzg4ZTQ6cGF0aGwxNzpBY2N1UmV2Q29tbW9uLmphcmVlZDY6bGVuZ3RoaTE4ODkxMGU0OnBhdGhsMjM6Y29tbW9ucy1pby1jaW8yLjVfMy5qYXJlZWQ2Omxlbmd0aGkyNDFlNDpwYXRobDI4OmNvbW1vbnMtaW8tY2lvMi41XzMuamFyLmxpbmtlZWQ2Omxlbmd0aGk4MjMwNWU0OnBhdGhsNTppbkRpcjE2OmFwcGxpY2F0aW9uLndhZGxlZWQ2Omxlbmd0aGkxZTQ6cGF0aGwxNTpzdG9yYWdlLnZlcnNpb25lZWU0Om5hbWU5OnBhcmVudERpcjEyOnBpZWNlIGxlbmd0aGk1MjQyODhlNjpwaWVjZXMyMDpUdmhk6V75zXaXnKR979pLEhdGsWVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTU1MTUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSw0NiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPG5hbWU+dHRvcnJlbnQvY2xpZW50PC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1iZW5jb2Rpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1uZXR3b3JrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRlc3QtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQW5ub3VuY2VhYmxlSW5mb3JtYXRpb25JbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0Fubm91bmNlYWJsZUluZm9ybWF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjBmNjAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0Fubm91bmNlYWJsZUluZm9ybWF0aW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbkltcGwgaW1wbGVtZW50cyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHVwbG9hZGVkOworICBwcml2YXRlIGZpbmFsIGxvbmcgZG93bmxvYWRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGxlZnQ7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudEhhc2ggdG9ycmVudEhhc2g7CisgIHByaXZhdGUgZmluYWwgTGlzdDxMaXN0PFN0cmluZz4+IGFubm91bmNlVXJsczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3VuY2U7CisKKyAgcHVibGljIEFubm91bmNlYWJsZUluZm9ybWF0aW9uSW1wbChsb25nIHVwbG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG93bmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudEhhc2ggdG9ycmVudEhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGFubm91bmNlVXJscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3VuY2UpIHsKKyAgICB0aGlzLnVwbG9hZGVkID0gdXBsb2FkZWQ7CisgICAgdGhpcy5kb3dubG9hZGVkID0gZG93bmxvYWRlZDsKKyAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgIHRoaXMudG9ycmVudEhhc2ggPSB0b3JyZW50SGFzaDsKKyAgICB0aGlzLmFubm91bmNlVXJscyA9IGFubm91bmNlVXJsczsKKyAgICB0aGlzLmFubm91bmNlID0gYW5ub3VuY2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWQoKSB7CisgICAgcmV0dXJuIHVwbG9hZGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldERvd25sb2FkZWQoKSB7CisgICAgcmV0dXJuIGRvd25sb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0TGVmdCgpIHsKKyAgICByZXR1cm4gbGVmdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFubm91bmNlTGlzdCgpIHsKKyAgICByZXR1cm4gYW5ub3VuY2VVcmxzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3VuY2UoKSB7CisgICAgcmV0dXJuIGFubm91bmNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIHRvcnJlbnRIYXNoLmdldEluZm9IYXNoKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gdG9ycmVudEhhc2guZ2V0SGV4SW5mb0hhc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiYW5ub3VuY2VhYmxlIHRvcnJlbnQgIiArIHRvcnJlbnRIYXNoLmdldEhleEluZm9IYXNoKCkgKyAiIGZvciB0cmFja2VycyAiICsgYW5ub3VuY2VVcmxzOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NsaWVudFN0YXRlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NsaWVudFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ2xpZW50U3RhdGUuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworcHVibGljIGVudW0gQ2xpZW50U3RhdGUgeworICBXQUlUSU5HLAorICBWQUxJREFUSU5HLAorICBTSEFSSU5HLAorICBTRUVESU5HLAorICBFUlJPUiwKKyAgRE9ORQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db21tdW5pY2F0aW9uTWFuYWdlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db21tdW5pY2F0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTdlZDMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw4NjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZS4qOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrLkNvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yay5PdXRnb2luZ0Nvbm5lY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yay5TdGF0ZUNoYW5uZWxMaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5QZWVyQWN0aXZpdHlMaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5GYWlyUGllY2VTdG9yYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5GaWxlQ29sbGVjdGlvblN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLlBpZWNlU3RvcmFnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlBlZXJNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuKjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzLkRFRkFVTFRfU09DS0VUX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC4qOworCisvKioKKyAqIEEgcHVyZS1qYXZhIEJpdFRvcnJlbnQgY2xpZW50LgorICogPHAvPgorICogPHA+CisgKiBBIEJpdFRvcnJlbnQgY2xpZW50IGluIGl0cyBiYXJlIGVzc2VuY2Ugc2hhcmVzIGEgZ2l2ZW4gdG9ycmVudC4gSWYgdGhlCisgKiB0b3JyZW50IGlzIG5vdCBjb21wbGV0ZSBsb2NhbGx5LCBpdCB3aWxsIGNvbnRpbnVlIHRvIGRvd25sb2FkIGl0LiBJZiBvcgorICogYWZ0ZXIgdGhlIHRvcnJlbnQgaXMgY29tcGxldGUsIHRoZSBjbGllbnQgbWF5IGV2ZW50dWFsbHkgY29udGludWUgdG8gc2VlZCBpdAorICogZm9yIG90aGVyIGNsaWVudHMuCisgKiA8L3A+CisgKiA8cC8+CisgKiA8cD4KKyAqIFRoaXMgQml0VG9ycmVudCBjbGllbnQgaW1wbGVtZW50YXRpb24gaXMgbWFkZSB0byBiZSBzaW1wbGUgdG8gZW1iZWQgYW5kCisgKiBzaW1wbGUgdG8gdXNlLiBGaXJzdCwgaW5pdGlhbGl6ZSBhIFNoYXJlVG9ycmVudCBvYmplY3QgZnJvbSBhIHRvcnJlbnQKKyAqIG1ldGEtaW5mbyBzb3VyY2UgKGVpdGhlciBhIGZpbGUgb3IgYSBieXRlIGFycmF5LCBzZWUKKyAqIGNvbS50dXJuLnR0b3JyZW50LlNoYXJlZFRvcnJlbnQgZm9yIGhvdyB0byBjcmVhdGUgYSBTaGFyZWRUb3JyZW50IG9iamVjdCkuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKgorICog5a6e546w5LuOdG9ycmVudOWFg+S/oeaBr+a6kO+8iOaWh+S7tuaIluWtl+iKguaVsOe7hOWdh+WPr++8ieWIneWni+WMluS4gOS4qiBTaGFyZVRvcnJlbnQg5a+56LGh44CCCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tdW5pY2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciwgUGVlckFjdGl2aXR5TGlzdGVuZXIsIENvbnRleHQsIENvbm5lY3Rpb25NYW5hZ2VyQ29udGV4dCB7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbW11bmljYXRpb25NYW5hZ2VyLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSVRUT1JSRU5UX0lEX1BSRUZJWCA9ICItVE8wMDQyLSI7CisKKyAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIHN0b3AgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgcHJpdmF0ZSBBbm5vdW5jZSBhbm5vdW5jZTsKKworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbXlTdGFydGVkID0gZmFsc2U7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudExvYWRlciBteVRvcnJlbnRMb2FkZXI7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudHNTdG9yYWdlIHRvcnJlbnRzU3RvcmFnZTsKKyAgcHJpdmF0ZSBmaW5hbCBDb3VudExpbWl0Q29ubmVjdGlvbkFsbG93ZXIgbXlJbkNvbm5lY3Rpb25BbGxvd2VyOworICBwcml2YXRlIGZpbmFsIENvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlciBteU91dENvbm5lY3Rpb25BbGxvd2VyOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlTZW5kQnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15UmVjZWl2ZUJ1ZmZlclNpemU7CisgIHByaXZhdGUgZmluYWwgUGVlcnNTdG9yYWdlIHBlZXJzU3RvcmFnZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBDb25uZWN0aW9uTWFuYWdlciBteUNvbm5lY3Rpb25NYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBteUV4ZWN1dG9yU2VydmljZTsKKyAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgbXlQaWVjZVZhbGlkYXRvckV4ZWN1dG9yOworCisgIC8qKgorICAgKiBAcGFyYW0gd29ya2luZ0V4ZWN1dG9yICAgICAgICBleGVjdXRvciBzZXJ2aWNlIGZvciBydW4gY29ubmVjdGlvbiB3b3JrZXIgYW5kIHByb2Nlc3MgaW5jb21pbmcgZGF0YS4gTXVzdCBoYXZlIGEgcG9vbCBzaXplIGF0IGxlYXN0IDIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5aSE55CG6L+e5o6l55u45YWzIOW7uueri+adpeWHnee7k++8jOaOpeaUtuWkhOeQhuaVsOaNrgorICAgKiBAcGFyYW0gcGllY2VWYWxpZGF0b3JFeGVjdXRvciBleGVjdXRvciBzZXJ2aWNlIGZvciBjYWxjdWxhdGlvbiBzaGExIGhhc2hlcyBvZiBkb3dubG9hZGVkIHBpZWNlcworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDorqHnrpfkuIvovb3niYfmrrXnmoTlk4jluIzlgLwKKyAgICovCisgIHB1YmxpYyBDb21tdW5pY2F0aW9uTWFuYWdlcihFeGVjdXRvclNlcnZpY2Ugd29ya2luZ0V4ZWN1dG9yLCBFeGVjdXRvclNlcnZpY2UgcGllY2VWYWxpZGF0b3JFeGVjdXRvcikgeworICAgIHRoaXMod29ya2luZ0V4ZWN1dG9yLCBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yLCBuZXcgVHJhY2tlckNsaWVudEZhY3RvcnlJbXBsKCkpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB3b3JraW5nRXhlY3V0b3IgICAgICAgIGV4ZWN1dG9yIHNlcnZpY2UgZm9yIHJ1biBjb25uZWN0aW9uIHdvcmtlciBhbmQgcHJvY2VzcyBpbmNvbWluZyBkYXRhLiBNdXN0IGhhdmUgYSBwb29sIHNpemUgYXQgbGVhc3QgMgorICAgKiBAcGFyYW0gcGllY2VWYWxpZGF0b3JFeGVjdXRvciBleGVjdXRvciBzZXJ2aWNlIGZvciBjYWxjdWxhdGlvbiBzaGExIGhhc2hlcyBvZiBkb3dubG9hZGVkIHBpZWNlcworICAgKiBAcGFyYW0gdHJhY2tlckNsaWVudEZhY3RvcnkgICBmYWN0b3J5IHdoaWNoIGNyZWF0ZXMgaW5zdGFuY2VzIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdHJhY2tlcgorICAgKi8KKyAgcHVibGljIENvbW11bmljYXRpb25NYW5hZ2VyKEV4ZWN1dG9yU2VydmljZSB3b3JraW5nRXhlY3V0b3IsIEV4ZWN1dG9yU2VydmljZSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yLCBUcmFja2VyQ2xpZW50RmFjdG9yeSB0cmFja2VyQ2xpZW50RmFjdG9yeSkgeworICAgIHRoaXMuYW5ub3VuY2UgPSBuZXcgQW5ub3VuY2UodGhpcywgdHJhY2tlckNsaWVudEZhY3RvcnkpOy8vIOi0n+i0o+S6jnRyYWNrZXLov5vooYzpgJrkv6HnmoQKKyAgICB0aGlzLnRvcnJlbnRzU3RvcmFnZSA9IG5ldyBUb3JyZW50c1N0b3JhZ2UoKTsvLyB0b3JyZW505paH5Lu25a2Y5YKoCisgICAgdGhpcy5wZWVyc1N0b3JhZ2UgPSBuZXcgUGVlcnNTdG9yYWdlKCk7Ly8g57uT54K55a2Y5YKoCisgICAgdGhpcy5teVNlbmRCdWZmZXJTaXplID0gbmV3IEF0b21pY0ludGVnZXIoKTsvLyDmlbTmlbAg5Y+R6YCB5a2X6IqC5aSn5bCPCisgICAgdGhpcy5teVRvcnJlbnRMb2FkZXIgPSBuZXcgVG9ycmVudExvYWRlckltcGwodGhpcy50b3JyZW50c1N0b3JhZ2UpOy8v5bCG5Yqg6L2955qE56eN5a2Q6L2s5YyW5Li65YiG5Lqr55qE56eN5a2QCisgICAgdGhpcy5teVJlY2VpdmVCdWZmZXJTaXplID0gbmV3IEF0b21pY0ludGVnZXIoKTsvLyDmlbTmlbAg5o6l5pS25a2X6IqC5aSn5bCPCisgICAgdGhpcy5teUluQ29ubmVjdGlvbkFsbG93ZXIgPSBuZXcgQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyKHBlZXJzU3RvcmFnZSk7CisgICAgdGhpcy5teU91dENvbm5lY3Rpb25BbGxvd2VyID0gbmV3IENvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlcihwZWVyc1N0b3JhZ2UpOworICAgIHRoaXMubXlFeGVjdXRvclNlcnZpY2UgPSB3b3JraW5nRXhlY3V0b3I7CisgICAgbXlQaWVjZVZhbGlkYXRvckV4ZWN1dG9yID0gcGllY2VWYWxpZGF0b3JFeGVjdXRvcjsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRvcnJlbnQgdG8gc3RvcmFnZSwgdmFsaWRhdGUgZG93bmxvYWRlZCBmaWxlcyBhbmQgc3RhcnQgc2VlZGluZyBhbmQgbGVlY2hpbmcgdGhlIHRvcnJlbnQKKyAgICoKKyAgICogQHBhcmFtIGRvdFRvcnJlbnRGaWxlUGF0aCBwYXRoIHRvIHRvcnJlbnQgbWV0YWRhdGEgZmlsZQorICAgKiBAcGFyYW0gZG93bmxvYWREaXJQYXRoICAgIHBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIGRvd25sb2FkZWQgZmlsZXMgYXJlIHBsYWNlZAorICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50TWFuYWdlcn0gaW5zdGFuY2UgZm9yIG1vbml0b3JpbmcgdG9ycmVudCBzdGF0ZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIGVycm9yIG9jY3VycyBpbiByZWFkaW5nIG1ldGFkYXRhIGZpbGUKKyAgICovCisgIC8v6YCa6L+H55So5oi35o+Q5L6b55qE56eN5a2Q5paH5Lu26Lev5b6E77yIZG90VG9ycmVudEZpbGVQYXRo77yJ5p2l5re75Yqg56eN5a2Q5Yiw5a2Y5YKo5LitCisgIC8v5bm25bCG5LiL6L2955qE5paH5Lu25L+d5a2Y5Yiw5oyH5a6a55qE5pys5Zyw55uu5b2V77yIZG93bmxvYWREaXJQYXRo77yJ44CCCisgIHB1YmxpYyBUb3JyZW50TWFuYWdlciBhZGRUb3JyZW50KFN0cmluZyBkb3RUb3JyZW50RmlsZVBhdGgsIFN0cmluZyBkb3dubG9hZERpclBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFkZFRvcnJlbnQoZG90VG9ycmVudEZpbGVQYXRoLCBkb3dubG9hZERpclBhdGgsIEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRvcnJlbnQgdG8gc3RvcmFnZSB3aXRoIHNwZWNpZmllZCBsaXN0ZW5lcnMsIHZhbGlkYXRlIGRvd25sb2FkZWQgZmlsZXMgYW5kIHN0YXJ0IHNlZWRpbmcgYW5kIGxlZWNoaW5nIHRoZSB0b3JyZW50CisgICAqCisgICAqIEBwYXJhbSBkb3RUb3JyZW50RmlsZVBhdGggcGF0aCB0byB0b3JyZW50IG1ldGFkYXRhIGZpbGUKKyAgICogQHBhcmFtIGRvd25sb2FkRGlyUGF0aCAgICBwYXRoIHRvIGRpcmVjdG9yeSB3aGVyZSBkb3dubG9hZGVkIGZpbGVzIGFyZSBwbGFjZWQKKyAgICogQHBhcmFtIGxpc3RlbmVycyAgICAgICAgICBzcGVjaWZpZWQgbGlzdGVuZXJzCisgICAqIEByZXR1cm4ge0BsaW5rIFRvcnJlbnRNYW5hZ2VyfSBpbnN0YW5jZSBmb3IgbW9uaXRvcmluZyB0b3JyZW50IHN0YXRlCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSU8gZXJyb3Igb2NjdXJzIGluIHJlYWRpbmcgbWV0YWRhdGEgZmlsZQorICAgKi8KKyAgcHVibGljIFRvcnJlbnRNYW5hZ2VyIGFkZFRvcnJlbnQoU3RyaW5nIGRvdFRvcnJlbnRGaWxlUGF0aCwgU3RyaW5nIGRvd25sb2FkRGlyUGF0aCwgTGlzdDxUb3JyZW50TGlzdGVuZXI+IGxpc3RlbmVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYWRkVG9ycmVudChkb3RUb3JyZW50RmlsZVBhdGgsIGRvd25sb2FkRGlyUGF0aCwgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UsIGxpc3RlbmVycyk7CisgIH0KKworICAvKioKKyAgICogQWRkcyB0b3JyZW50IHRvIHN0b3JhZ2Ugd2l0aCBzcGVjaWZpZWQge0BsaW5rIFBpZWNlU3RvcmFnZUZhY3Rvcnl9LgorICAgKiBJdCBjYW4gYmUgdXNlZCBmb3Igc2tpcHBpbmcgaW5pdGlhbCB2YWxpZGF0aW9uIG9mIGRhdGEKKyAgICoKKyAgICogQHBhcmFtIGRvdFRvcnJlbnRGaWxlUGF0aCBwYXRoIHRvIHRvcnJlbnQgbWV0YWRhdGEgZmlsZQorICAgKiBAcGFyYW0gZG93bmxvYWREaXJQYXRoICAgIHBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIGRvd25sb2FkZWQgZmlsZXMgYXJlIHBsYWNlZAorICAgKiBAcGFyYW0gcGllY2VTdG9yYWdlRmFjdG9yeSBmYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgUGllY2VTdG9yYWdlfS4KKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1hbmFnZXJ9IGluc3RhbmNlIGZvciBtb25pdG9yaW5nIHRvcnJlbnQgc3RhdGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBJTyBlcnJvciBvY2N1cnMgaW4gcmVhZGluZyBtZXRhZGF0YSBmaWxlCisgICAqLworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgYWRkVG9ycmVudChTdHJpbmcgZG90VG9ycmVudEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG93bmxvYWREaXJQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZVN0b3JhZ2VGYWN0b3J5IHBpZWNlU3RvcmFnZUZhY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFkZFRvcnJlbnQoZG90VG9ycmVudEZpbGVQYXRoLCBkb3dubG9hZERpclBhdGgsIHBpZWNlU3RvcmFnZUZhY3RvcnksIENvbGxlY3Rpb25zLjxUb3JyZW50TGlzdGVuZXI+ZW1wdHlMaXN0KCkpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgdG9ycmVudCB0byBzdG9yYWdlIHdpdGggc3BlY2lmaWVkIHtAbGluayBQaWVjZVN0b3JhZ2VGYWN0b3J5fS4KKyAgICogSXQgY2FuIGJlIHVzZWQgZm9yIHNraXBwaW5nIGluaXRpYWwgdmFsaWRhdGlvbiBvZiBkYXRhCisgICAqCisgICAqIEBwYXJhbSBkb3RUb3JyZW50RmlsZVBhdGggcGF0aCB0byB0b3JyZW50IG1ldGFkYXRhIGZpbGUKKyAgICogQHBhcmFtIGRvd25sb2FkRGlyUGF0aCAgICBwYXRoIHRvIGRpcmVjdG9yeSB3aGVyZSBkb3dubG9hZGVkIGZpbGVzIGFyZSBwbGFjZWQKKyAgICogQHBhcmFtIHBpZWNlU3RvcmFnZUZhY3RvcnkgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFBpZWNlU3RvcmFnZX0uCisgICAqIEByZXR1cm4ge0BsaW5rIFRvcnJlbnRNYW5hZ2VyfSBpbnN0YW5jZSBmb3IgbW9uaXRvcmluZyB0b3JyZW50IHN0YXRlCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSU8gZXJyb3Igb2NjdXJzIGluIHJlYWRpbmcgbWV0YWRhdGEgZmlsZQorICAgKi8KKyAgcHVibGljIFRvcnJlbnRNYW5hZ2VyIGFkZFRvcnJlbnQoU3RyaW5nIGRvdFRvcnJlbnRGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkRGlyUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGllY2VTdG9yYWdlRmFjdG9yeSBwaWVjZVN0b3JhZ2VGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFRvcnJlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGVNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgRmlsZU1ldGFkYXRhUHJvdmlkZXIoZG90VG9ycmVudEZpbGVQYXRoKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEgPSBtZXRhZGF0YVByb3ZpZGVyLmdldFRvcnJlbnRNZXRhZGF0YSgpOworICAgIEZpbGVDb2xsZWN0aW9uU3RvcmFnZSBmaWxlQ29sbGVjdGlvblN0b3JhZ2UgPSBGaWxlQ29sbGVjdGlvblN0b3JhZ2UuY3JlYXRlKG1ldGFkYXRhLCBuZXcgRmlsZShkb3dubG9hZERpclBhdGgpKTsKKyAgICBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlID0gcGllY2VTdG9yYWdlRmFjdG9yeS5jcmVhdGVTdG9yYWdlKG1ldGFkYXRhLCBmaWxlQ29sbGVjdGlvblN0b3JhZ2UpOworICAgIHJldHVybiBhZGRUb3JyZW50KG1ldGFkYXRhUHJvdmlkZXIsIHBpZWNlU3RvcmFnZSwgbGlzdGVuZXJzKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRvcnJlbnQgdG8gc3RvcmFnZSB3aXRoIGFueSBzdG9yYWdlIGFuZCBtZXRhZGF0YSBzb3VyY2UKKyAgICoKKyAgICogQHBhcmFtIG1ldGFkYXRhUHJvdmlkZXIgc3BlY2lmaWVkIG1ldGFkYXRhIHNvdXJjZQorICAgKiBAcGFyYW0gcGllY2VTdG9yYWdlICAgICBzcGVjaWZpZWQgc3RvcmFnZSBvZiBwaWVjZXMKKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1hbmFnZXJ9IGluc3RhbmNlIGZvciBtb25pdG9yaW5nIHRvcnJlbnQgc3RhdGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBJTyBlcnJvciBvY2N1cnMgaW4gcmVhZGluZyBtZXRhZGF0YSBmaWxlCisgICAqLworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgYWRkVG9ycmVudChUb3JyZW50TWV0YWRhdGFQcm92aWRlciBtZXRhZGF0YVByb3ZpZGVyLCBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBhZGRUb3JyZW50KG1ldGFkYXRhUHJvdmlkZXIsIHBpZWNlU3RvcmFnZSwgQ29sbGVjdGlvbnMuPFRvcnJlbnRMaXN0ZW5lcj5lbXB0eUxpc3QoKSk7CisgIH0KKworICAvKioKKyAgICogQWRkcyB0b3JyZW50IHRvIHN0b3JhZ2Ugd2l0aCBhbnkgc3RvcmFnZSwgbWV0YWRhdGEgc291cmNlIGFuZCBzcGVjaWZpZWQgbGlzdGVuZXJzCisgICAqCisgICAqIEBwYXJhbSBtZXRhZGF0YVByb3ZpZGVyIHNwZWNpZmllZCBtZXRhZGF0YSBzb3VyY2UKKyAgICogQHBhcmFtIHBpZWNlU3RvcmFnZSAgICAgc3BlY2lmaWVkIHN0b3JhZ2Ugb2YgcGllY2VzCisgICAqIEBwYXJhbSBsaXN0ZW5lcnMgICAgICAgIHNwZWNpZmllZCBsaXN0ZW5lcnMKKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1hbmFnZXJ9IGluc3RhbmNlIGZvciBtb25pdG9yaW5nIHRvcnJlbnQgc3RhdGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBJTyBlcnJvciBvY2N1cnMgaW4gcmVhZGluZyBtZXRhZGF0YSBmaWxlCisgICAqLworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgYWRkVG9ycmVudChUb3JyZW50TWV0YWRhdGFQcm92aWRlciBtZXRhZGF0YVByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFRvcnJlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEgPSBtZXRhZGF0YVByb3ZpZGVyLmdldFRvcnJlbnRNZXRhZGF0YSgpOworICAgIEV2ZW50RGlzcGF0Y2hlciBldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7CisgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgIGV2ZW50RGlzcGF0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorICAgIGZpbmFsIExvYWRlZFRvcnJlbnRJbXBsIGxvYWRlZFRvcnJlbnQgPSBuZXcgTG9hZGVkVG9ycmVudEltcGwoCisgICAgICAgICAgICBuZXcgVG9ycmVudFN0YXRpc3RpYygpLAorICAgICAgICAgICAgbWV0YWRhdGFQcm92aWRlciwKKyAgICAgICAgICAgIHRvcnJlbnRNZXRhZGF0YSwKKyAgICAgICAgICAgIHBpZWNlU3RvcmFnZSwKKyAgICAgICAgICAgIGV2ZW50RGlzcGF0Y2hlcik7CisKKyAgICBpZiAocGllY2VTdG9yYWdlLmlzRmluaXNoZWQoKSkgeworICAgICAgbG9hZGVkVG9ycmVudC5nZXRUb3JyZW50U3RhdGlzdGljKCkuc2V0TGVmdCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9uZyBsZWZ0ID0gY2FsY3VsYXRlTGVmdChwaWVjZVN0b3JhZ2UsIHRvcnJlbnRNZXRhZGF0YSk7CisgICAgICBsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRTdGF0aXN0aWMoKS5zZXRMZWZ0KGxlZnQpOworICAgIH0KKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS52YWxpZGF0aW9uQ29tcGxldGUocGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksIHRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpKTsKKworICAgIHRoaXMudG9ycmVudHNTdG9yYWdlLmFkZFRvcnJlbnQobG9hZGVkVG9ycmVudC5nZXRUb3JyZW50SGFzaCgpLmdldEhleEluZm9IYXNoKCksIGxvYWRlZFRvcnJlbnQpOworICAgIGZvcmNlQW5ub3VuY2VBbmRMb2dFcnJvcihsb2FkZWRUb3JyZW50LCBwaWVjZVN0b3JhZ2UuaXNGaW5pc2hlZCgpID8gQ09NUExFVEVEIDogU1RBUlRFRCk7CisgICAgbG9nZ2VyLmRlYnVnKFN0cmluZy5mb3JtYXQoIkFkZGVkIHRvcnJlbnQgJXMgKCVzKSIsIGxvYWRlZFRvcnJlbnQsIGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudEhhc2goKS5nZXRIZXhJbmZvSGFzaCgpKSk7CisgICAgcmV0dXJuIG5ldyBUb3JyZW50TWFuYWdlckltcGwoZXZlbnREaXNwYXRjaGVyLCBsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRIYXNoKCkpOworICAgIC8vYWRkdG9ycmVudOacgOe7iOi/lOWbnueahOaVsOaNrgorICB9CisKKyAgLy8g6K6h566X5Ymp5L2Z5aSn5bCP77yM5LiN55So566hCisgIHByaXZhdGUgbG9uZyBjYWxjdWxhdGVMZWZ0KFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEpIHsKKworICAgIGxvbmcgc2l6ZSA9IDA7CisgICAgZm9yIChUb3JyZW50RmlsZSB0b3JyZW50RmlsZSA6IHRvcnJlbnRNZXRhZGF0YS5nZXRGaWxlcygpKSB7CisgICAgICBzaXplICs9IHRvcnJlbnRGaWxlLnNpemU7CisgICAgfQorCisgICAgaW50IHBpZWNlTGVuZ3RoID0gdG9ycmVudE1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCk7CisgICAgbG9uZyByZXN1bHQgPSAwOworICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoYXZhaWxhYmxlUGllY2VzLmdldChpKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSBNYXRoLm1pbihwaWVjZUxlbmd0aCwgc2l6ZSAtIGkgKiBwaWVjZUxlbmd0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgZm9yY2VBbm5vdW5jZUFuZExvZ0Vycm9yKExvYWRlZFRvcnJlbnQgdG9ycmVudCwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQpIHsKKyAgICB0cnkgeworICAgICAgdGhpcy5hbm5vdW5jZS5mb3JjZUFubm91bmNlKHRvcnJlbnQuY3JlYXRlQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24oKSwgdGhpcywgZXZlbnQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJ1bmFibGUgdG8gZm9yY2UgYW5ub3VuY2UgdG9ycmVudCB7fSIsIHRvcnJlbnQpOworICAgICAgbG9nZ2VyLmRlYnVnKCIiLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyBzcGVjaWZpZWQgdG9ycmVudCBmcm9tIHN0b3JhZ2UuCisgICAqCisgICAqIEBwYXJhbSB0b3JyZW50SGFzaCBzcGVjaWZpZWQgdG9ycmVudCBoYXNoCisgICAqLworCisgIC8v56e76Zmk5Lu75YqhCisgIHB1YmxpYyB2b2lkIHJlbW92ZVRvcnJlbnQoU3RyaW5nIHRvcnJlbnRIYXNoKSB7CisgICAgbG9nZ2VyLmRlYnVnKCJTdG9wcGluZyBzZWVkaW5nICIgKyB0b3JyZW50SGFzaCk7CisgICAgZmluYWwgUGFpcjxTaGFyZWRUb3JyZW50LCBMb2FkZWRUb3JyZW50PiB0b3JyZW50cyA9IHRvcnJlbnRzU3RvcmFnZS5yZW1vdmUodG9ycmVudEhhc2gpOworCisgICAgU2hhcmVkVG9ycmVudCB0b3JyZW50ID0gdG9ycmVudHMuZmlyc3QoKTsKKyAgICBpZiAodG9ycmVudCAhPSBudWxsKSB7CisgICAgICB0b3JyZW50LnNldENsaWVudFN0YXRlKENsaWVudFN0YXRlLkRPTkUpOworICAgICAgdG9ycmVudC5jbG9zZUZ1bGx5KCk7CisgICAgfQorICAgIExpc3Q8U2hhcmluZ1BlZXI+IHBlZXJzID0gZ2V0UGVlcnNGb3JUb3JyZW50KHRvcnJlbnRIYXNoKTsKKyAgICBmb3IgKFNoYXJpbmdQZWVyIHBlZXIgOiBwZWVycykgeworICAgICAgcGVlci51bmJpbmQodHJ1ZSk7CisgICAgfQorICAgIHNlbmRTdG9wRXZlbnQodG9ycmVudHMuc2Vjb25kKCksIHRvcnJlbnRIYXNoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kU3RvcEV2ZW50KExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCwgU3RyaW5nIHRvcnJlbnRIYXNoKSB7CisgICAgaWYgKGxvYWRlZFRvcnJlbnQgPT0gbnVsbCkgeworICAgICAgbG9nZ2VyLmluZm8oIkFubm91bmNlYWJsZSB0b3JyZW50IHt9IG5vdCBmb3VuZCBpbiBzdG9yYWdlIGFmdGVyIHVuc3VjY2Vzc2Z1bCBkb3dubG9hZCBhdHRlbXB0IiwgdG9ycmVudEhhc2gpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JjZUFubm91bmNlQW5kTG9nRXJyb3IobG9hZGVkVG9ycmVudCwgU1RPUFBFRCk7CisgIH0KKworICAvKioKKyAgICogc2V0IHNwZWNpZmllZCBhbm5vdW5jZSBpbnRlcnZhbCBiZXR3ZWVuIHJlcXVlc3RzIHRvIHRoZSB0cmFja2VyCisgICAqCisgICAqIEBwYXJhbSBhbm5vdW5jZUludGVydmFsIGFubm91bmNlIGludGVydmFsIGluIHNlY29uZHMKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEFubm91bmNlSW50ZXJ2YWwoZmluYWwgaW50IGFubm91bmNlSW50ZXJ2YWwpIHsKKyAgICBhbm5vdW5jZS5zZXRBbm5vdW5jZUludGVydmFsKGFubm91bmNlSW50ZXJ2YWwpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgdG9ycmVudCB0aGlzIGNsaWVudCBpcyBleGNoYW5naW5nIG9uLgorICAgKi8KKyAgcHVibGljIENvbGxlY3Rpb248U2hhcmVkVG9ycmVudD4gZ2V0VG9ycmVudHMoKSB7CisgICAgcmV0dXJuIHRoaXMudG9ycmVudHNTdG9yYWdlLmFjdGl2ZVRvcnJlbnRzKCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHVibGljIFVSSSBnZXREZWZhdWx0VHJhY2tlclVSSSgpIHsKKyAgICByZXR1cm4gYW5ub3VuY2UuZ2V0RGVmYXVsdFRyYWNrZXJVUkkoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Yga25vd24gcGVlcnMuCisgICAqLworICBwdWJsaWMgU2V0PFNoYXJpbmdQZWVyPiBnZXRQZWVycygpIHsKKyAgICByZXR1cm4gbmV3IEhhc2hTZXQ8U2hhcmluZ1BlZXI+KHRoaXMucGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1heEluQ29ubmVjdGlvbnNDb3VudChpbnQgbWF4Q29ubmVjdGlvbnNDb3VudCkgeworICAgIHRoaXMubXlJbkNvbm5lY3Rpb25BbGxvd2VyLnNldE15TWF4Q29ubmVjdGlvbkNvdW50KG1heENvbm5lY3Rpb25zQ291bnQpOworICB9CisKKyAgLyoqCisgICAqIHNldCB1cHMgbmV3IHJlY2VpdmUgYnVmZmVyIHNpemUsIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBuZXcgY29ubmVjdGlvbnMuCisgICAqIElmIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MsIHRoYW4gemVybywgdGhlbiBtZXRob2QgZG9lc24ndCBoYXZlIGVmZmVjdAorICAgKgorICAgKiBAcGFyYW0gbmV3U2l6ZSBuZXcgc2l6ZQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50IG5ld1NpemUpIHsKKyAgICBteVJlY2VpdmVCdWZmZXJTaXplLnNldChuZXdTaXplKTsKKyAgfQorCisgIC8qKgorICAgKiBzZXQgdXBzIG5ldyBzZW5kIGJ1ZmZlciBzaXplLCB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgbmV3IGNvbm5lY3Rpb25zLgorICAgKiBJZiB2YWx1ZSBpcyBlcXVhbCBvciBsZXNzLCB0aGFuIHplcm8sIHRoZW4gbWV0aG9kIGRvZXNuJ3QgaGF2ZSBlZmZlY3QKKyAgICoKKyAgICogQHBhcmFtIG5ld1NpemUgbmV3IHNpemUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFNlbmRCdWZmZXJTaXplKGludCBuZXdTaXplKSB7CisgICAgbXlTZW5kQnVmZmVyU2l6ZS5zZXQobmV3U2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRNYXhPdXRDb25uZWN0aW9uc0NvdW50KGludCBtYXhDb25uZWN0aW9uc0NvdW50KSB7CisgICAgdGhpcy5teU91dENvbm5lY3Rpb25BbGxvd2VyLnNldE15TWF4Q29ubmVjdGlvbkNvdW50KG1heENvbm5lY3Rpb25zQ291bnQpOworICB9CisKKyAgLyoqCisgICAqIFJ1bnMgY2xpZW50IGluc3RhbmNlIGFuZCBzdGFydHMgYW5ub3VuY2luZywgc2VlZGluZyBhbmQgZG93bmxvYWRpbmcgb2YgYWxsIHRvcnJlbnRzIGZyb20gc3RvcmFnZQorICAgKgorICAgKiBAcGFyYW0gYmluZEFkZHJlc3NlcyBsaXN0IG9mIGFkZHJlc3NlcyB3aGljaCBhcmUgdXNlZCBmb3Igc2VuZGluZyB0byB0aGUgdHJhY2tlci4gQ3VycmVudCBjbGllbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhdmFpbGFibGUgZm9yIG90aGVyIHBlZXJzIG9uIHRoZSBhZGRyZXNzZXMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnkgaW8gZXJyb3Igb2NjdXJzCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBJbmV0QWRkcmVzcy4uLiBiaW5kQWRkcmVzc2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXJ0KGJpbmRBZGRyZXNzZXMsIENvbnN0YW50cy5ERUZBVUxUX0FOTk9VTkNFX0lOVEVSVkFMX1NFQywgbnVsbCwgbmV3IFNlbGVjdG9yRmFjdG9yeUltcGwoKSk7CisgIH0KKworICAvKioKKyAgICogUnVucyBjbGllbnQgaW5zdGFuY2UgYW5kIHN0YXJ0cyBhbm5vdW5jaW5nLCBzZWVkaW5nIGFuZCBkb3dubG9hZGluZyBvZiBhbGwgdG9ycmVudHMgZnJvbSBzdG9yYWdlCisgICAqCisgICAqIEBwYXJhbSBiaW5kQWRkcmVzc2VzICAgICBsaXN0IG9mIGFkZHJlc3NlcyB3aGljaCBhcmUgdXNlZCBmb3Igc2VuZGluZyB0byB0aGUgdHJhY2tlci4gQ3VycmVudCBjbGllbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYXZhaWxhYmxlIGZvciBvdGhlciBwZWVycyBvbiB0aGUgYWRkcmVzc2VzCisgICAqIEBwYXJhbSBkZWZhdWx0VHJhY2tlclVSSSBkZWZhdWx0IHRyYWNrZXIgYWRkcmVzcy4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCB0b3JyZW50cyB3aWxsIGJlIGFubm91bmNlZCBub3Qgb25seSBvbiB0aGUgdHJhY2tlcnMgZnJvbSBtZXRhZGF0YSBmaWxlIGJ1dCBhbHNvIHRvIHRoaXMgdHJhY2tlcgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBpbyBlcnJvciBvY2N1cnMKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEluZXRBZGRyZXNzW10gYmluZEFkZHJlc3NlcywgZmluYWwgVVJJIGRlZmF1bHRUcmFja2VyVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXJ0KGJpbmRBZGRyZXNzZXMsIENvbnN0YW50cy5ERUZBVUxUX0FOTk9VTkNFX0lOVEVSVkFMX1NFQywgZGVmYXVsdFRyYWNrZXJVUkksIG5ldyBTZWxlY3RvckZhY3RvcnlJbXBsKCkpOworICB9CisKKyAgcHVibGljIFBlZXJbXSBnZXRTZWxmUGVlcnMoZmluYWwgSW5ldEFkZHJlc3NbXSBiaW5kQWRkcmVzc2VzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgUGVlciBzZWxmID0gcGVlcnNTdG9yYWdlLmdldFNlbGYoKTsKKworICAgIGlmIChzZWxmID09IG51bGwpIHsKKyAgICAgIHJldHVybiBuZXcgUGVlclswXTsKKyAgICB9CisKKyAgICBQZWVyW10gcmVzdWx0ID0gbmV3IFBlZXJbYmluZEFkZHJlc3Nlcy5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZEFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgeworICAgICAgZmluYWwgSW5ldEFkZHJlc3MgYmluZEFkZHJlc3MgPSBiaW5kQWRkcmVzc2VzW2ldOworICAgICAgZmluYWwgUGVlciBwZWVyID0gbmV3IFBlZXIobmV3IEluZXRTb2NrZXRBZGRyZXNzKGJpbmRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCksIHNlbGYuZ2V0UG9ydCgpKSk7CisgICAgICBwZWVyLnNldFRvcnJlbnRIYXNoKHNlbGYuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICAvL2lmIHdlIGhhdmUgbW9yZSwgdGhhdCBvbmUgYmluZCBhZGRyZXNzLCB0aGVuIG9ubHkgZm9yIGZpcnN0IHNldCBzZWxmIHBlZXIgaWQuIEZvciBvdGhlciBnZW5lcmF0ZSBpdAorICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICBwZWVyLnNldFBlZXJJZChzZWxmLmdldFBlZXJJZCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IENvbW11bmljYXRpb25NYW5hZ2VyLkJJVFRPUlJFTlRfSURfUFJFRklYICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKS5zcGxpdCgiLSIpWzRdOworICAgICAgICBieXRlW10gaWRCeXRlcyA9IGlkLmdldEJ5dGVzKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKTsKKyAgICAgICAgcGVlci5zZXRQZWVySWQoQnl0ZUJ1ZmZlci53cmFwKGlkQnl0ZXMpKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdFtpXSA9IHBlZXI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogUnVucyBjbGllbnQgaW5zdGFuY2UgYW5kIHN0YXJ0cyBhbm5vdW5jaW5nLCBzZWVkaW5nIGFuZCBkb3dubG9hZGluZyBvZiBhbGwgdG9ycmVudHMgZnJvbSBzdG9yYWdlCisgICAqCisgICAqIEBwYXJhbSBiaW5kQWRkcmVzc2VzICAgICAgIGxpc3Qgb2YgYWRkcmVzc2VzIHdoaWNoIGFyZSB1c2VkIGZvciBzZW5kaW5nIHRvIHRoZSB0cmFja2VyLiBDdXJyZW50IGNsaWVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGF2YWlsYWJsZSBmb3Igb3RoZXIgcGVlcnMgb24gdGhlIGFkZHJlc3NlcworICAgKiBAcGFyYW0gYW5ub3VuY2VJbnRlcnZhbFNlYyBkZWZhdWx0IGFubm91bmNlIGludGVydmFsLiBUaGlzIGludGVydmFsIGNhbiBiZSBvdmVycmlkZSBieSB0cmFja2VyCisgICAqIEBwYXJhbSBkZWZhdWx0VHJhY2tlclVSSSAgIGRlZmF1bHQgdHJhY2tlciBhZGRyZXNzLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgdG9ycmVudHMgd2lsbCBiZSBhbm5vdW5jZWQgbm90IG9ubHkgb24gdGhlIHRyYWNrZXJzIGZyb20gbWV0YWRhdGEgZmlsZSBidXQgYWxzbyB0byB0aGlzIHRyYWNrZXIKKyAgICogQHBhcmFtIHNlbGVjdG9yRmFjdG9yeSAgICAgZmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yfSBpbnN0YW5jZS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnkgaW8gZXJyb3Igb2NjdXJzCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBJbmV0QWRkcmVzc1tdIGJpbmRBZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhbm5vdW5jZUludGVydmFsU2VjLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgZGVmYXVsdFRyYWNrZXJVUkksCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdG9yRmFjdG9yeSBzZWxlY3RvckZhY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnQoYmluZEFkZHJlc3NlcywgYW5ub3VuY2VJbnRlcnZhbFNlYywgZGVmYXVsdFRyYWNrZXJVUkksIHNlbGVjdG9yRmFjdG9yeSwKKyAgICAgICAgICAgIG5ldyBGaXJzdEF2YWlsYWJsZUNoYW5uZWwoNjg4MSwgNjg4OSkpOworICB9CisKKyAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgSW5ldEFkZHJlc3NbXSBiaW5kQWRkcmVzc2VzLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYW5ub3VuY2VJbnRlcnZhbFNlYywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJJIGRlZmF1bHRUcmFja2VyVVJJLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWxlY3RvckZhY3Rvcnkgc2VsZWN0b3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2ZXJDaGFubmVsUmVnaXN0ZXIgc2VydmVyQ2hhbm5lbFJlZ2lzdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubXlDb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBuZXcgU3lzdGVtVGltZVNlcnZpY2UoKSwKKyAgICAgICAgICAgIG15SW5Db25uZWN0aW9uQWxsb3dlciwKKyAgICAgICAgICAgIG15T3V0Q29ubmVjdGlvbkFsbG93ZXIsCisgICAgICAgICAgICBzZWxlY3RvckZhY3RvcnksCisgICAgICAgICAgICBteVNlbmRCdWZmZXJTaXplLAorICAgICAgICAgICAgbXlSZWNlaXZlQnVmZmVyU2l6ZSk7CisgICAgdGhpcy5zZXRTb2NrZXRDb25uZWN0aW9uVGltZW91dChERUZBVUxUX1NPQ0tFVF9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIHRyeSB7CisgICAgICB0aGlzLm15Q29ubmVjdGlvbk1hbmFnZXIuaW5pdEFuZFJ1bldvcmtlcihzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLmVycm9yQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgImVycm9yIGluIGluaXRpYWxpemF0aW9uIHNlcnZlciBjaGFubmVsIiwgZSk7CisgICAgICB0aGlzLnN0b3AoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmluYWwgU3RyaW5nIGlkID0gQ29tbXVuaWNhdGlvbk1hbmFnZXIuQklUVE9SUkVOVF9JRF9QUkVGSVggKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLnNwbGl0KCItIilbNF07CisgICAgYnl0ZVtdIGlkQnl0ZXMgPSBpZC5nZXRCeXRlcyhDb25zdGFudHMuQllURV9FTkNPRElORyk7CisgICAgUGVlciBzZWxmID0gbmV3IFBlZXIobmV3IEluZXRTb2NrZXRBZGRyZXNzKG15Q29ubmVjdGlvbk1hbmFnZXIuZ2V0QmluZFBvcnQoKSksIEJ5dGVCdWZmZXIud3JhcChpZEJ5dGVzKSk7CisgICAgcGVlcnNTdG9yYWdlLnNldFNlbGYoc2VsZik7CisgICAgbG9nZ2VyLmluZm8oIkJpdFRvcnJlbnQgY2xpZW50IFt7fV0gc3RhcnRlZCBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICJsaXN0ZW5pbmcgYXQge306e30uLi4iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFNob3J0SGV4UGVlcklkKCksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0SXAoKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRQb3J0KCkKKyAgICAgICAgICAgIH0pOworCisgICAgYW5ub3VuY2Uuc3RhcnQoZGVmYXVsdFRyYWNrZXJVUkksIHRoaXMsIGdldFNlbGZQZWVycyhiaW5kQWRkcmVzc2VzKSwgYW5ub3VuY2VJbnRlcnZhbFNlYyk7CisgICAgdGhpcy5zdG9wLnNldChmYWxzZSk7CisKKyAgICBteVN0YXJ0ZWQgPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIEltbWVkaWF0ZWx5IGJ1dCBncmFjZWZ1bGx5IHN0b3AgdGhpcyBjbGllbnQuCisgICAqLworICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgIHRoaXMuc3RvcCg2MCwgVGltZVVuaXQuU0VDT05EUyk7CisgIH0KKworICB2b2lkIHN0b3AoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgYm9vbGVhbiB3YXNTdG9wcGVkID0gdGhpcy5zdG9wLmdldEFuZFNldCh0cnVlKTsKKyAgICBpZiAod2FzU3RvcHBlZCkgcmV0dXJuOworCisgICAgaWYgKCFteVN0YXJ0ZWQpCisgICAgICByZXR1cm47CisKKyAgICB0aGlzLm15Q29ubmVjdGlvbk1hbmFnZXIuY2xvc2UoKTsKKworICAgIGxvZ2dlci50cmFjZSgidHJ5IHN0b3AgYW5ub3VuY2UgdGhyZWFkLi4uIik7CisKKyAgICB0aGlzLmFubm91bmNlLnN0b3AoKTsKKworICAgIGxvZ2dlci50cmFjZSgiYW5ub3VuY2UgdGhyZWFkIGlzIHN0b3BwZWQiKTsKKworICAgIGZvciAoU2hhcmVkVG9ycmVudCB0b3JyZW50IDogdGhpcy50b3JyZW50c1N0b3JhZ2UuYWN0aXZlVG9ycmVudHMoKSkgeworICAgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgY2xvc2UgdG9ycmVudCB7fSIsIHRvcnJlbnQpOworICAgICAgdG9ycmVudC5jbG9zZUZ1bGx5KCk7CisgICAgICBpZiAodG9ycmVudC5pc0ZpbmlzaGVkKCkpIHsKKyAgICAgICAgdG9ycmVudC5zZXRDbGllbnRTdGF0ZShDbGllbnRTdGF0ZS5ET05FKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRvcnJlbnQuc2V0Q2xpZW50U3RhdGUoQ2xpZW50U3RhdGUuRVJST1IpOworICAgICAgfQorICAgIH0KKworICAgIGxvZ2dlci5kZWJ1ZygiQ2xvc2luZyBhbGwgcmVtYWluaW5nIHBlZXIgY29ubmVjdGlvbnMuLi4iKTsKKyAgICBmb3IgKFNoYXJpbmdQZWVyIHBlZXIgOiB0aGlzLnBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKSkgeworICAgICAgcGVlci51bmJpbmQodHJ1ZSk7CisgICAgfQorCisgICAgdG9ycmVudHNTdG9yYWdlLmNsZWFyKCk7CisgICAgbG9nZ2VyLmluZm8oIkJpdFRvcnJlbnQgY2xpZW50IHNpZ25pbmcgb2ZmLiIpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2xlYW51cFRpbWVvdXQoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IHRoaXMubXlDb25uZWN0aW9uTWFuYWdlcjsKKyAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBtYW5hZ2VyIGlzIG51bGwiKTsKKyAgICB9CisgICAgY29ubmVjdGlvbk1hbmFnZXIuc2V0Q2xlYW51cFRpbWVvdXQodGltZVVuaXQudG9NaWxsaXModGltZW91dCkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U29ja2V0Q29ubmVjdGlvblRpbWVvdXQoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IHRoaXMubXlDb25uZWN0aW9uTWFuYWdlcjsKKyAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBtYW5hZ2VyIGlzIG51bGwiKTsKKyAgICB9CisgICAgY29ubmVjdGlvbk1hbmFnZXIuc2V0U29ja2V0Q29ubmVjdGlvblRpbWVvdXQodGltZVVuaXQudG9NaWxsaXModGltZW91dCkpOworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgd2UgYXJlIGEgc2VlZCBmb3IgdGhlIHRvcnJlbnQgd2UncmUgc2hhcmluZy4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzU2VlZChTdHJpbmcgaGV4SW5mb0hhc2gpIHsKKyAgICBTaGFyZWRUb3JyZW50IHQgPSB0aGlzLnRvcnJlbnRzU3RvcmFnZS5nZXRUb3JyZW50KGhleEluZm9IYXNoKTsKKyAgICByZXR1cm4gdCAhPSBudWxsICYmIHQuaXNDb21wbGV0ZSgpOworICB9CisKKyAgcHVibGljIExpc3Q8U2hhcmluZ1BlZXI+IGdldFBlZXJzRm9yVG9ycmVudChTdHJpbmcgdG9ycmVudEhhc2gpIHsKKyAgICBpZiAodG9ycmVudEhhc2ggPT0gbnVsbCkgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KCk7CisKKyAgICBMaXN0PFNoYXJpbmdQZWVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFNoYXJpbmdQZWVyPigpOworICAgIGZvciAoU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgOiBwZWVyc1N0b3JhZ2UuZ2V0U2hhcmluZ1BlZXJzKCkpIHsKKyAgICAgIGlmICh0b3JyZW50SGFzaC5lcXVhbHMoc2hhcmluZ1BlZXIuZ2V0SGV4SW5mb0hhc2goKSkpIHsKKyAgICAgICAgcmVzdWx0LmFkZChzaGFyaW5nUGVlcik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgcmV0dXJuIG15U3RhcnRlZDsKKyAgfQorCisgIHByaXZhdGUgQ29sbGVjdGlvbjxTaGFyaW5nUGVlcj4gZ2V0Q29ubmVjdGVkUGVlcnMoKSB7CisgICAgU2V0PFNoYXJpbmdQZWVyPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTaGFyaW5nUGVlcj4oKTsKKyAgICBmb3IgKFNoYXJpbmdQZWVyIHBlZXIgOiB0aGlzLnBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKSkgeworICAgICAgaWYgKHBlZXIuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICByZXN1bHQuYWRkKHBlZXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBoYXNoIHNwZWNpZmllZCB0b3JyZW50IGhhc2gKKyAgICogQHJldHVybiB0cnVlIGlmIHN0b3JhZ2UgY29udGFpbnMgc3BlY2lmaWVkIHRvcnJlbnQuIEZhbHNlIG90aGVyd2lzZQorICAgKiBAc2VlIFRvcnJlbnRzU3RvcmFnZSNoYXNUb3JyZW50CisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnNUb3JyZW50V2l0aEhhc2goU3RyaW5nIGhhc2gpIHsKKyAgICByZXR1cm4gdG9ycmVudHNTdG9yYWdlLmhhc1RvcnJlbnQoaGFzaCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBlZXJzU3RvcmFnZSBnZXRQZWVyc1N0b3JhZ2UoKSB7CisgICAgcmV0dXJuIHBlZXJzU3RvcmFnZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVG9ycmVudHNTdG9yYWdlIGdldFRvcnJlbnRzU3RvcmFnZSgpIHsKKyAgICByZXR1cm4gdG9ycmVudHNTdG9yYWdlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3IoKSB7CisgICAgcmV0dXJuIG15RXhlY3V0b3JTZXJ2aWNlOworICB9CisKKyAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRQaWVjZVZhbGlkYXRvckV4ZWN1dG9yKCkgeworICAgIHJldHVybiBteVBpZWNlVmFsaWRhdG9yRXhlY3V0b3I7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvbm5lY3Rpb25MaXN0ZW5lciBuZXdDaGFubmVsTGlzdGVuZXIoKSB7CisgICAgcmV0dXJuIG5ldyBTdGF0ZUNoYW5uZWxMaXN0ZW5lcih0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2hhcmluZ1BlZXIgY3JlYXRlU2hhcmluZ1BlZXIoU3RyaW5nIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgcGVlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkVG9ycmVudCB0b3JyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNoYW5uZWwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKKyAgICByZXR1cm4gbmV3IFNoYXJpbmdQZWVyKGhvc3QsIHBvcnQsIHBlZXJJZCwgdG9ycmVudCwgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSwgdGhpcywgY2hhbm5lbCwgY2xpZW50SWRlbnRpZmllciwgY2xpZW50VmVyc2lvbik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRvcnJlbnRMb2FkZXIgZ2V0VG9ycmVudExvYWRlcigpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TG9hZGVyOworICB9CisKKworICAvKiogQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGhhbmRsZXIocykuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqCisgICAqIEhhbmRsZSBhbiBhbm5vdW5jZSByZXNwb25zZSBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIGludGVydmFsICAgVGhlIGFubm91bmNlIGludGVydmFsIHJlcXVlc3RlZCBieSB0aGUgdHJhY2tlci4KKyAgICogQHBhcmFtIGNvbXBsZXRlICAgVGhlIG51bWJlciBvZiBzZWVkZXJzIG9uIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGluY29tcGxldGUgVGhlIG51bWJlciBvZiBsZWVjaGVycyBvbiB0aGlzIHRvcnJlbnQuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlQW5ub3VuY2VSZXNwb25zZShpbnQgaW50ZXJ2YWwsIGludCBjb21wbGV0ZSwgaW50IGluY29tcGxldGUsIFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgc2hhcmVkVG9ycmVudCA9IHRoaXMudG9ycmVudHNTdG9yYWdlLmdldFRvcnJlbnQoaGV4SW5mb0hhc2gpOworICAgIGlmIChzaGFyZWRUb3JyZW50ICE9IG51bGwpIHsKKyAgICAgIHNoYXJlZFRvcnJlbnQuc2V0U2VlZGVyc0NvdW50KGNvbXBsZXRlKTsKKyAgICAgIHNoYXJlZFRvcnJlbnQuc2V0TGFzdEFubm91bmNlVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgfQorICAgIHNldEFubm91bmNlSW50ZXJ2YWwoaW50ZXJ2YWwpOworICB9CisKKyAgLyoqCisgICAqIEhhbmRsZSB0aGUgZGlzY292ZXJ5IG9mIG5ldyBwZWVycy4KKyAgICoKKyAgICogQHBhcmFtIHBlZXJzIFRoZSBsaXN0IG9mIHBlZXJzIGRpc2NvdmVyZWQgKGZyb20gdGhlIGFubm91bmNlIHJlc3BvbnNlIG9yCisgICAqICAgICAgICAgICAgICBhbnkgb3RoZXIgbWVhbnMgbGlrZSBESFQvUEVYLCBldGMuKS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVEaXNjb3ZlcmVkUGVlcnMoTGlzdDxQZWVyPiBwZWVycywgU3RyaW5nIGhleEluZm9IYXNoKSB7CisKKyAgICBpZiAocGVlcnMuc2l6ZSgpID09IDApIHJldHVybjsKKworICAgIFNoYXJlZFRvcnJlbnQgdG9ycmVudCA9IHRvcnJlbnRzU3RvcmFnZS5nZXRUb3JyZW50KGhleEluZm9IYXNoKTsKKworICAgIGlmICh0b3JyZW50ICE9IG51bGwgJiYgdG9ycmVudC5pc0ZpbmlzaGVkKCkpIHJldHVybjsKKworICAgIGZpbmFsIExvYWRlZFRvcnJlbnQgYW5ub3VuY2VhYmxlVG9ycmVudCA9IHRvcnJlbnRzU3RvcmFnZS5nZXRMb2FkZWRUb3JyZW50KGhleEluZm9IYXNoKTsKKyAgICBpZiAoYW5ub3VuY2VhYmxlVG9ycmVudCA9PSBudWxsKSB7CisgICAgICBsb2dnZXIuaW5mbygiYW5ub3VuY2VhYmxlIHRvcnJlbnQge30gaXMgbm90IGZvdW5kIGluIHN0b3JhZ2UuIE1heWJlIGl0IHdhcyByZW1vdmVkIiwgaGV4SW5mb0hhc2gpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhbm5vdW5jZWFibGVUb3JyZW50LmdldFBpZWNlU3RvcmFnZSgpLmlzRmluaXNoZWQoKSkgcmV0dXJuOworCisgICAgbG9nZ2VyLmRlYnVnKCJHb3Qge30gcGVlcihzKSAoe30pIGZvciB7fSBpbiB0cmFja2VyIHJlc3BvbnNlIiwgbmV3IE9iamVjdFtde3BlZXJzLnNpemUoKSwKKyAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhwZWVycy50b0FycmF5KCkpLCBoZXhJbmZvSGFzaH0pOworCisgICAgTWFwPFBlZXJVSUQsIFBlZXI+IHVuaXF1ZVBlZXJzID0gbmV3IEhhc2hNYXA8UGVlclVJRCwgUGVlcj4oKTsKKyAgICBmb3IgKFBlZXIgcGVlciA6IHBlZXJzKSB7CisgICAgICBmaW5hbCBQZWVyVUlEIHBlZXJVSUQgPSBuZXcgUGVlclVJRChwZWVyLmdldEFkZHJlc3MoKSwgaGV4SW5mb0hhc2gpOworICAgICAgaWYgKHVuaXF1ZVBlZXJzLmNvbnRhaW5zS2V5KHBlZXJVSUQpKSBjb250aW51ZTsKKyAgICAgIHVuaXF1ZVBlZXJzLnB1dChwZWVyVUlELCBwZWVyKTsKKyAgICB9CisKKyAgICBmb3IgKE1hcC5FbnRyeTxQZWVyVUlELCBQZWVyPiBlIDogdW5pcXVlUGVlcnMuZW50cnlTZXQoKSkgeworCisgICAgICBQZWVyVUlEIHBlZXJVSUQgPSBlLmdldEtleSgpOworICAgICAgUGVlciBwZWVyID0gZS5nZXRWYWx1ZSgpOworICAgICAgYm9vbGVhbiBhbHJlYWR5Q29ubmVjdGVkVG9UaGlzUGVlciA9IHBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcihwZWVyVUlEKSAhPSBudWxsOworCisgICAgICBpZiAoYWxyZWFkeUNvbm5lY3RlZFRvVGhpc1BlZXIpIHsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJza2lwcGluZyBwZWVyIHt9LCBiZWNhdXNlIHdlIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoaXMgcGVlciIsIHBlZXIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lciA9IG5ldyBPdXRnb2luZ0Nvbm5lY3Rpb25MaXN0ZW5lcigKKyAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgYW5ub3VuY2VhYmxlVG9ycmVudC5nZXRUb3JyZW50SGFzaCgpLAorICAgICAgICAgICAgICBwZWVyLmdldElwKCksCisgICAgICAgICAgICAgIHBlZXIuZ2V0UG9ydCgpKTsKKworICAgICAgbG9nZ2VyLmRlYnVnKCJ0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgcGVlciB7fSIsIHBlZXIpOworCisgICAgICBib29sZWFuIGNvbm5lY3RUYXNrQWRkZWQgPSB0aGlzLm15Q29ubmVjdGlvbk1hbmFnZXIub2ZmZXJDb25uZWN0KAorICAgICAgICAgICAgICBuZXcgQ29ubmVjdFRhc2socGVlci5nZXRJcCgpLAorICAgICAgICAgICAgICAgICAgICAgIHBlZXIuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgU3lzdGVtVGltZVNlcnZpY2UoKS5ub3coKSwKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKSwgMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICBpZiAoIWNvbm5lY3RUYXNrQWRkZWQpIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oImNhbiBub3QgY29ubmVjdCB0byBwZWVyIHt9LiBVbmFibGUgdG8gYWRkIGNvbm5lY3QgdGFzayB0byBjb25uZWN0aW9uIG1hbmFnZXIiLCBwZWVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGVlckFjdGl2aXR5TGlzdGVuZXIgaGFuZGxlcihzKS4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKi8KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGVlckNob2tlZChTaGFyaW5nUGVlciBwZWVyKSB7IC8qIERvIG5vdGhpbmcgKi8gfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQZWVyUmVhZHkoU2hhcmluZ1BlZXIgcGVlcikgeyAvKiBEbyBub3RoaW5nICovIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VBdmFpbGFiaWxpdHkoU2hhcmluZ1BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGllY2UgcGllY2UpIHsgLyogRG8gbm90aGluZyAqLyB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZUJpdGZpZWxkQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMpIHsgLyogRG8gbm90aGluZyAqLyB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlU2VudChTaGFyaW5nUGVlciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGllY2UgcGllY2UpIHsgLyogRG8gbm90aGluZyAqLyB9CisKKyAgLyoqCisgICAqIFBpZWNlIGRvd25sb2FkIGNvbXBsZXRpb24gaGFuZGxlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2hlbiBhIHBpZWNlIGlzIGNvbXBsZXRlZCwgYW5kIHZhbGlkLCB3ZSBhbm5vdW5jZSB0byBhbGwgY29ubmVjdGVkIHBlZXJzCisgICAqIHRoYXQgd2Ugbm93IGhhdmUgdGhpcyBwaWVjZS4KKyAgICogPC9wPgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBXZSB1c2UgdGhpcyBoYW5kbGVyIHRvIGlkZW50aWZ5IHdoZW4gYWxsIG9mIHRoZSBwaWVjZXMgaGF2ZSBiZWVuCisgICAqIGRvd25sb2FkZWQuIFdoZW4gdGhhdCdzIHRoZSBjYXNlLCB3ZSBjYW4gc3RhcnQgdGhlIHNlZWRpbmcgcGVyaW9kLCBpZgorICAgKiBhbnkuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgIFRoZSBwZWVyIHdlIGdvdCB0aGUgcGllY2UgZnJvbS4KKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSBpbiBxdWVzdGlvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZUNvbXBsZXRlZChmaW5hbCBTaGFyaW5nUGVlciBwZWVyLCBmaW5hbCBQaWVjZSBwaWVjZSkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCA9IHBlZXIuZ2V0VG9ycmVudCgpOworICAgIGZpbmFsIFN0cmluZyB0b3JyZW50SGFzaCA9IHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgRnV0dXJlPD8+IHZhbGlkYXRpb25GdXR1cmUgPSBteVBpZWNlVmFsaWRhdG9yRXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICB2YWxpZGF0ZVBpZWNlQXN5bmModG9ycmVudCwgcGllY2UsIHRvcnJlbnRIYXNoLCBwZWVyKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICB0b3JyZW50Lm1hcmtDb21wbGV0ZWRBbmRBZGRWYWxpZGF0aW9uRnV0dXJlKHBpZWNlLCB2YWxpZGF0aW9uRnV0dXJlKTsKKyAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICB0b3JyZW50Lm1hcmtVbmNvbXBsZXRlZChwaWVjZSk7CisgICAgICBMb2dnZXJVdGlscy53YXJuV2l0aE1lc3NhZ2VBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiVW5hYmxlIHRvIHN1Ym1pdCB2YWxpZGF0aW9uIHRhc2sgZm9yIHRvcnJlbnQge30iLCB0b3JyZW50SGFzaCwgZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGllY2VBc3luYyhmaW5hbCBTaGFyZWRUb3JyZW50IHRvcnJlbnQsIGZpbmFsIFBpZWNlIHBpZWNlLCBTdHJpbmcgdG9ycmVudEhhc2gsIFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICB0cnkgeworICAgICAgc3luY2hyb25pemVkIChwaWVjZSkgeworCisgICAgICAgIGlmIChwaWVjZS5pc1ZhbGlkKCkpIHJldHVybjsKKworICAgICAgICBwaWVjZS52YWxpZGF0ZSh0b3JyZW50LCBwaWVjZSk7CisgICAgICAgIGlmIChwaWVjZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICB0b3JyZW50Lm5vdGlmeVBpZWNlRG93bmxvYWRlZChwaWVjZSwgcGVlcik7CisgICAgICAgICAgcGllY2UuZmluaXNoKCk7CisgICAgICAgICAgLy8gU2VuZCBhIEhBVkUgbWVzc2FnZSB0byBhbGwgY29ubmVjdGVkIHBlZXJzLCB3aGljaCBkb24ndCBoYXZlIHRoZSBwaWVjZQorICAgICAgICAgIFBlZXJNZXNzYWdlIGhhdmUgPSBQZWVyTWVzc2FnZS5IYXZlTWVzc2FnZS5jcmFmdChwaWVjZS5nZXRJbmRleCgpKTsKKyAgICAgICAgICBmb3IgKFNoYXJpbmdQZWVyIHJlbW90ZSA6IGdldENvbm5lY3RlZFBlZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdGUuZ2V0VG9ycmVudCgpLmdldEhleEluZm9IYXNoKCkuZXF1YWxzKHRvcnJlbnRIYXNoKSAmJgorICAgICAgICAgICAgICAgICAgICAhcmVtb3RlLmdldEF2YWlsYWJsZVBpZWNlcygpLmdldChwaWVjZS5nZXRJbmRleCgpKSkKKyAgICAgICAgICAgICAgcmVtb3RlLnNlbmQoaGF2ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHBlZXIucGllY2VEb3dubG9hZGVkKCk7CisKKyAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVG9ycmVudENvbXBsZXRlOworICAgICAgICAgIHN5bmNocm9uaXplZCAodG9ycmVudCkgeworICAgICAgICAgICAgdG9ycmVudC5yZW1vdmVWYWxpZGF0aW9uRnV0dXJlKHBpZWNlKTsKKworICAgICAgICAgICAgYm9vbGVhbiBpc0N1cnJlbnRQZWVyU2VlZGVyID0gcGVlci5nZXRBdmFpbGFibGVQaWVjZXMoKS5jYXJkaW5hbGl0eSgpID09IHRvcnJlbnQuZ2V0UGllY2VDb3VudCgpOworICAgICAgICAgICAgLy9pZiBpdCdzIHNlZWRlciB3ZSB3aWxsIHNlbmQgbm90IGludGVyZXN0ZWQgbWVzc2FnZSB3aGVuIHdlIGRvd25sb2FkIGZ1bGwgZmlsZQorICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRQZWVyU2VlZGVyKSB7CisgICAgICAgICAgICAgIGlmICh0b3JyZW50LmlzQWxsUGllY2VzT2ZQZWVyQ29tcGxldGVkQW5kVmFsaWRhdGVkKHBlZXIpKSB7CisgICAgICAgICAgICAgICAgcGVlci5ub3RJbnRlcmVzdGluZygpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlzVG9ycmVudENvbXBsZXRlID0gdG9ycmVudC5pc0NvbXBsZXRlKCk7CisKKyAgICAgICAgICAgIGlmIChpc1RvcnJlbnRDb21wbGV0ZSkgeworICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWQgb2Yge30gY29tcGxldGUuIiwgdG9ycmVudC5nZXREaXJlY3RvcnlOYW1lKCkpOworCisgICAgICAgICAgICAgIHRvcnJlbnQuZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGlzVG9ycmVudENvbXBsZXRlKSB7CisKKyAgICAgICAgICAgIExvYWRlZFRvcnJlbnQgYW5ub3VuY2VhYmxlVG9ycmVudCA9IHRvcnJlbnRzU3RvcmFnZS5nZXRMb2FkZWRUb3JyZW50KHRvcnJlbnRIYXNoKTsKKworICAgICAgICAgICAgaWYgKGFubm91bmNlYWJsZVRvcnJlbnQgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbiA9IGFubm91bmNlYWJsZVRvcnJlbnQuY3JlYXRlQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24oKTsKKworICAgICAgICAgICAgaWYgKCFUb3JyZW50VXRpbHMuaXNUcmFja2VyTGVzc0luZm8oYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYW5ub3VuY2UuZ2V0Q3VycmVudFRyYWNrZXJDbGllbnQoYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAuYW5ub3VuY2VBbGxJbnRlcmZhY2VzKENPTVBMRVRFRCwgdHJ1ZSwgYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24pOworICAgICAgICAgICAgICB9IGNhdGNoIChBbm5vdW5jZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ1bmFibGUgdG8gYW5ub3VuY2UgdG9ycmVudCB7fSBvbiB0cmFja2VyIHt9IiwgdG9ycmVudCwgdG9ycmVudC5nZXRBbm5vdW5jZSgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFNoYXJpbmdQZWVyIHJlbW90ZSA6IGdldFBlZXJzRm9yVG9ycmVudCh0b3JyZW50SGFzaCkpIHsKKyAgICAgICAgICAgICAgcmVtb3RlLm5vdEludGVyZXN0aW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG9ycmVudC5tYXJrVW5jb21wbGV0ZWQocGllY2UpOworICAgICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGVkIHBpZWNlICN7fSBmcm9tIHt9IHdhcyBub3QgdmFsaWQgOy0oLiBUcnlpbmcgYW5vdGhlciBwZWVyIiwgcGllY2UuZ2V0SW5kZXgoKSwgcGVlcik7CisgICAgICAgICAgcGVlci5nZXRQb29ybHlBdmFpbGFibGVQaWVjZXMoKS5zZXQocGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgdG9ycmVudC5tYXJrVW5jb21wbGV0ZWQocGllY2UpOworICAgICAgbG9nZ2VyLndhcm4oInVuaGFuZGxlZCBleGNlcHRpb24gaW4gcGllY2Uge30gdmFsaWRhdGlvbiB0YXNrIiwgZSk7CisgICAgfQorICAgIHRvcnJlbnQuaGFuZGxlUGVlclJlYWR5KHBlZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBlZXJEaXNjb25uZWN0ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIFBlZXIgcCA9IG5ldyBQZWVyKHBlZXIuZ2V0SXAoKSwgcGVlci5nZXRQb3J0KCkpOworICAgIHAuc2V0UGVlcklkKHBlZXIuZ2V0UGVlcklkKCkpOworICAgIHAuc2V0VG9ycmVudEhhc2gocGVlci5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICBsb2dnZXIudHJhY2UoIlBlZXIge30gZGlzY29ubmVjdGVkLCBbe30ve31dLiIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIHBlZXIsCisgICAgICAgICAgICAgICAgICAgIGdldENvbm5lY3RlZFBlZXJzKCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKS5zaXplKCkKKyAgICAgICAgICAgIH0pOworICAgIFBlZXJVSUQgcGVlclVJRCA9IG5ldyBQZWVyVUlEKHBlZXIuZ2V0QWRkcmVzcygpLCBwZWVyLmdldEhleEluZm9IYXNoKCkpOworICAgIHBlZXJzU3RvcmFnZS5yZW1vdmVTaGFyaW5nUGVlcihwZWVyVUlEKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZnRlclBlZXJSZW1vdmVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBsb2dnZXIudHJhY2UoImRpc2Nvbm5lY3RlZCBwZWVyICIgKyBwZWVyKTsKKyAgICB0b3JyZW50c1N0b3JhZ2UucGVlckRpc2Nvbm5lY3RlZChwZWVyLmdldEhleEluZm9IYXNoKCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZUlPRXhjZXB0aW9uKFNoYXJpbmdQZWVyIHBlZXIsIElPRXhjZXB0aW9uIGlvZSkgeworICAgIGxvZ2dlci5kZWJ1ZygiSS9PIHByb2JsZW0gb2NjdXJlZCB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBwaWVjZSBkYXRhIGZvciBwZWVyIHt9OiB7fS4iLCBwZWVyLCBpb2UuZ2V0TWVzc2FnZSgpKTsKKworICAgIHBlZXIudW5iaW5kKHRydWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZU5ld1BlZXJDb25uZWN0ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIC8vZG8gbm90aGluZworICB9CisKKyAgcHVibGljIENvbm5lY3Rpb25NYW5hZ2VyIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSB0aGlzLm15Q29ubmVjdGlvbk1hbmFnZXI7CisgICAgaWYgKGNvbm5lY3Rpb25NYW5hZ2VyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbm5lY3Rpb24gbWFuYWdlciBpcyBudWxsIik7CisgICAgfQorICAgIHJldHVybiBjb25uZWN0aW9uTWFuYWdlcjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc1N0b3AoKXsKKyAgICByZXR1cm4gc3RvcC5nZXQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db250ZXh0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE3MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Db250ZXh0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNoYW5uZWxMaXN0ZW5lckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGV4dCBleHRlbmRzIFNoYXJpbmdQZWVyRmFjdG9yeSwgQ2hhbm5lbExpc3RlbmVyRmFjdG9yeSB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gc2luZ2xlIGluc3RhbmNlIG9mIHBlZXJzIHN0b3JhZ2UKKyAgICovCisgIFBlZXJzU3RvcmFnZSBnZXRQZWVyc1N0b3JhZ2UoKTsKKworICAvKioKKyAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgdG9ycmVudHMgc3RvcmFnZQorICAgKi8KKyAgVG9ycmVudHNTdG9yYWdlIGdldFRvcnJlbnRzU3RvcmFnZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGV4ZWN1dG9yIGZvciBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcworICAgKi8KKyAgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gc2luZ2xlIGluc3RhbmNlIGZvciBsb2FkIHRvcnJlbnRzCisgICAqLworICBUb3JyZW50TG9hZGVyIGdldFRvcnJlbnRMb2FkZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9FdmVudERpc3BhdGNoZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRXZlbnREaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzMTIxOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRXZlbnREaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIEV2ZW50RGlzcGF0Y2hlciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRvcnJlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzOworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRMaXN0ZW5lciBub3RpZnllcjsKKworICBwdWJsaWMgRXZlbnREaXNwYXRjaGVyKCkgeworICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFRvcnJlbnRMaXN0ZW5lcj4oKTsKKyAgICB0aGlzLm5vdGlmeWVyID0gY3JlYXRlTm90aWZ5ZXIoKTsKKyAgfQorCisgIHByaXZhdGUgVG9ycmVudExpc3RlbmVyIGNyZWF0ZU5vdGlmeWVyKCkgeworICAgIHJldHVybiBuZXcgVG9ycmVudExpc3RlbmVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwZWVyQ29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5wZWVyQ29ubmVjdGVkKHBlZXJJbmZvcm1hdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwZWVyRGlzY29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5wZWVyRGlzY29ubmVjdGVkKHBlZXJJbmZvcm1hdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwaWVjZURvd25sb2FkZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIGZvciAoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIucGllY2VEb3dubG9hZGVkKHBpZWNlSW5mb3JtYXRpb24sIHBlZXJJbmZvcm1hdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb3dubG9hZENvbXBsZXRlKCkgeworICAgICAgICBmb3IgKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgIGxpc3RlbmVyLmRvd25sb2FkQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBpZWNlUmVjZWl2ZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIGZvciAoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIucGllY2VSZWNlaXZlZChwaWVjZUluZm9ybWF0aW9uLCBwZWVySW5mb3JtYXRpb24pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZG93bmxvYWRGYWlsZWQoVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGZvciAoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIuZG93bmxvYWRGYWlsZWQoY2F1c2UpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGlvbkNvbXBsZXRlKGludCB2YWxpZHBpZWNlcywgaW50IHRvdGFscGllY2VzKSB7CisgICAgICAgIGZvciAoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIudmFsaWRhdGlvbkNvbXBsZXRlKHZhbGlkcGllY2VzLCB0b3RhbHBpZWNlcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgVG9ycmVudExpc3RlbmVyIG11bHRpY2FzdGVyKCkgeworICAgIHJldHVybiBub3RpZnllcjsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHJldHVybiBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0ZpbGVNZXRhZGF0YVByb3ZpZGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0ZpbGVNZXRhZGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiMjRkZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRmlsZU1ldGFkYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRQYXJzZXI7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBGaWxlTWV0YWRhdGFQcm92aWRlciBpbXBsZW1lbnRzIFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlUGF0aDsKKworICBwdWJsaWMgRmlsZU1ldGFkYXRhUHJvdmlkZXIoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoOworICB9CisKKyAgQE5vdE51bGwKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUb3JyZW50TWV0YWRhdGEgZ2V0VG9ycmVudE1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisgICAgcmV0dXJuIG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZShmaWxlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9IYW5kc2hha2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvSGFuZHNoYWtlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5NjgxYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvSGFuZHNoYWtlLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCisKKy8qKgorICogUGVlciBoYW5kc2hha2UgaGFuZGxlci4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBjb21tZW50cyBycGlseXVzaGluCisgKgorICovCisKKy8qKgorICogUmVwcmVzZW50cyBhIEJpdFRvcnJlbnQgaGFuZHNoYWtlIG1lc3NhZ2UuCisgKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgc3RydWN0dXJlIGFuZCBwYXJzaW5nIGxvZ2ljIGZvciB0aGUgaGFuZHNoYWtlCisgKiB0aGF0IGlzIGV4Y2hhbmdlZCBiZXR3ZWVuIHBlZXJzIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiB0aGUKKyAqIEJpdFRvcnJlbnQgcHJvdG9jb2wuCisgKi8KKworcHVibGljIGNsYXNzIEhhbmRzaGFrZSBpbXBsZW1lbnRzIFRvcnJlbnRIYXNoIHsKKworICAvLyBCaXRUb3JyZW50IHByb3RvY29sIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBCaXRUb3JyZW50IHNwZWNpZmljYXRpb24uCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJVFRPUlJFTlRfUFJPVE9DT0xfSURFTlRJRklFUiA9ICJCaXRUb3JyZW50IHByb3RvY29sIjsKKyAgLy8gQmFzZSBsZW5ndGggZm9yIGEgaGFuZHNoYWtlIG1lc3NhZ2Ugd2l0aG91dCB0aGUgcHJvdG9jb2wgaWRlbnRpZmllci4KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9IQU5EU0hBS0VfTEVOR1RIID0gNDk7CisKKyAgLy8gQnl0ZUJ1ZmZlciB0byBzdG9yZSB0aGUgZnVsbCBoYW5kc2hha2UgZGF0YS4KKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIGRhdGE7CisgIC8vIEJ5dGVCdWZmZXIgdG8gc3RvcmUgdGhlIHRvcnJlbnQgaW5mbyBoYXNoLgorICBwcml2YXRlIEJ5dGVCdWZmZXIgaW5mb0hhc2g7CisgIC8vIEJ5dGVCdWZmZXIgdG8gc3RvcmUgdGhlIHBlZXIgSUQuCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciBwZWVySWQ7CisKKyAgLy8gU3RyaW5nIHRvIHN0b3JlIGFuIGlkZW50aWZpZXIgZm9yIHRoZSB0b3JyZW50LCBub3QgdXNlZCBpbiB0aGUgYWN0dWFsIGhhbmRzaGFrZSBtZXNzYWdlLgorICBwcml2YXRlIFN0cmluZyB0b3JyZW50SWRlbnRpZmllcjsKKworICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyIHN0cmluZyBpbiB0aGlzIGhhbmRzaGFrZS4KKyAgcHJpdmF0ZSBpbnQgbXlQc3RybGVuOworCisgIC8vIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIGludGVybmFsIHVzZSB0byBzZXQgdXAgdGhlIGhhbmRzaGFrZSBvYmplY3QuCisgIHByaXZhdGUgSGFuZHNoYWtlKEJ5dGVCdWZmZXIgZGF0YSwgQnl0ZUJ1ZmZlciBpbmZvSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQpIHsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuZGF0YS5yZXdpbmQoKTsgLy8gUmV3aW5kIHRoZSBidWZmZXIgdG8gdGhlIHN0YXJ0IGZvciByZWFkaW5nLgorCisgICAgdGhpcy5pbmZvSGFzaCA9IGluZm9IYXNoOworICAgIHRoaXMucGVlcklkID0gcGVlcklkOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgcmF3IGhhbmRzaGFrZSBkYXRhIGFzIGEgQnl0ZUJ1ZmZlci4KKyAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0RGF0YSgpIHsKKyAgICByZXR1cm4gdGhpcy5kYXRhOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgaW5mbyBoYXNoIGFzIGEgYnl0ZSBhcnJheS4KKyAgcHVibGljIGJ5dGVbXSBnZXRJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gdGhpcy5pbmZvSGFzaC5hcnJheSgpOworICB9CisKKyAgLy8gUmV0dXJucyBhIGhleGFkZWNpbWFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mbyBoYXNoLgorICBwdWJsaWMgU3RyaW5nIGdldEhleEluZm9IYXNoKCkgeworICAgIHJldHVybiBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcoZ2V0SW5mb0hhc2goKSk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBwZWVyIElEIGFzIGEgYnl0ZSBhcnJheS4KKyAgcHVibGljIGJ5dGVbXSBnZXRQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcklkLmFycmF5KCk7CisgIH0KKworICAvLyBQYXJzZXMgYSBCeXRlQnVmZmVyIGludG8gYSBIYW5kc2hha2Ugb2JqZWN0LCB2YWxpZGF0aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGhhbmRzaGFrZS4KKyAgcHVibGljIHN0YXRpYyBIYW5kc2hha2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIpCisgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgcHJvdG9jb2wgaWRlbnRpZmllciBmcm9tIHRoZSBmaXJzdCBieXRlLgorICAgIGludCBwc3RybGVuID0gQnl0ZS52YWx1ZU9mKGJ1ZmZlci5nZXQoKSkuaW50VmFsdWUoKTsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBsZW5ndGggaXMgY29ycmVjdCBnaXZlbiB0aGUgcmVtYWluaW5nIGRhdGEuCisgICAgaWYgKHBzdHJsZW4gPCAwIHx8CisgICAgICAgICAgICBidWZmZXIucmVtYWluaW5nKCkgIT0gQkFTRV9IQU5EU0hBS0VfTEVOR1RIICsgcHN0cmxlbiAtIDEpIHsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW5jb3JyZWN0IGhhbmRzaGFrZSBtZXNzYWdlIGxlbmd0aCAiICsKKyAgICAgICAgICAgICAgIihwc3RybGVuPSIgKyBwc3RybGVuICsgIikgISIsIDApOworICAgIH0KKworICAgIC8vIFBhcnNlIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyIGFuZCB2YWxpZGF0ZSBpdC4KKyAgICBieXRlW10gcHN0ciA9IG5ldyBieXRlW3BzdHJsZW5dOworICAgIGJ1ZmZlci5nZXQocHN0cik7CisKKyAgICBpZiAoIUhhbmRzaGFrZS5CSVRUT1JSRU5UX1BST1RPQ09MX0lERU5USUZJRVIuZXF1YWxzKAorICAgICAgICAgICAgbmV3IFN0cmluZyhwc3RyLCBDb25zdGFudHMuQllURV9FTkNPRElORykpKSB7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkludmFsaWQgcHJvdG9jb2wgaWRlbnRpZmllciEiLCAxKTsKKyAgICB9CisKKyAgICAvLyBTa2lwIG92ZXIgdGhlIHJlc2VydmVkIGJ5dGVzLCB3aGljaCBhcmUgbm90IGN1cnJlbnRseSB1c2VkLgorICAgIGJ5dGVbXSByZXNlcnZlZCA9IG5ldyBieXRlWzhdOworICAgIGJ1ZmZlci5nZXQocmVzZXJ2ZWQpOworCisgICAgLy8gUGFyc2UgdGhlIGluZm8gaGFzaCBhbmQgcGVlciBJRCBmcm9tIHRoZSBidWZmZXIuCisgICAgYnl0ZVtdIGluZm9IYXNoID0gbmV3IGJ5dGVbMjBdOworICAgIGJ1ZmZlci5nZXQoaW5mb0hhc2gpOworICAgIGJ5dGVbXSBwZWVySWQgPSBuZXcgYnl0ZVsyMF07CisgICAgYnVmZmVyLmdldChwZWVySWQpOworICAgIC8vIFJldHVybiBhIG5ldyBoYW5kc2hha2Ugb2JqZWN0IHdpdGggdGhlIHBhcnNlZCBkYXRhLgorICAgIHJldHVybiBuZXcgSGFuZHNoYWtlKGJ1ZmZlciwgQnl0ZUJ1ZmZlci53cmFwKGluZm9IYXNoKSwKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIud3JhcChwZWVySWQpKTsKKyAgfQorCisgIC8vIEFkZGl0aW9uYWwgb3ZlcmxvYWRlZCBwYXJzZSBtZXRob2Qgd2hpY2ggYWxzbyBzZXRzIHRoZSB0b3JyZW50IGlkZW50aWZpZXIuCisgIHB1YmxpYyBzdGF0aWMgSGFuZHNoYWtlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdG9ycmVudElkZW50aWZpZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgSGFuZHNoYWtlIGhzID0gSGFuZHNoYWtlLnBhcnNlKGJ1ZmZlcik7CisgICAgaHMuc2V0VG9ycmVudElkZW50aWZpZXIodG9ycmVudElkZW50aWZpZXIpOworICAgIHJldHVybiBoczsKKyAgfQorCisgIC8vIEFkZGl0aW9uYWwgb3ZlcmxvYWRlZCBwYXJzZSBtZXRob2Qgd2hpY2ggYWxzbyBzZXRzIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyIGxlbmd0aC4KKyAgcHVibGljIHN0YXRpYyBIYW5kc2hha2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBwc3RybGVuKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgIEhhbmRzaGFrZSBocyA9IEhhbmRzaGFrZS5wYXJzZShidWZmZXIpOworICAgIGhzLm15UHN0cmxlbiA9IHBzdHJsZW47CisgICAgcmV0dXJuIGhzOworICB9CisKKyAgLy8gTWV0aG9kIHRvIGNyYWZ0IGEgbmV3IGhhbmRzaGFrZSBtZXNzYWdlIGdpdmVuIGEgdG9ycmVudCBpbmZvIGhhc2ggYW5kIHBlZXIgSUQuCisgIHB1YmxpYyBzdGF0aWMgSGFuZHNoYWtlIGNyYWZ0KGJ5dGVbXSB0b3JyZW50SW5mb0hhc2gsIGJ5dGVbXSBjbGllbnRQZWVySWQpIHsKKyAgICB0cnkgeworICAgICAgLy8gQWxsb2NhdGUgYSBCeXRlQnVmZmVyIHdpdGggdGhlIHNpemUgb2YgdGhlIGhhbmRzaGFrZSBtZXNzYWdlLgorICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBIYW5kc2hha2UuQkFTRV9IQU5EU0hBS0VfTEVOR1RIICsKKyAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hha2UuQklUVE9SUkVOVF9QUk9UT0NPTF9JREVOVElGSUVSLmxlbmd0aCgpKTsKKworICAgICAgYnl0ZVtdIHJlc2VydmVkID0gbmV3IGJ5dGVbOF07IC8vIFJlc2VydmVkIGJ5dGVzLCBub3QgdXNlZC4KKyAgICAgIEJ5dGVCdWZmZXIgaW5mb0hhc2ggPSBCeXRlQnVmZmVyLndyYXAodG9ycmVudEluZm9IYXNoKTsKKyAgICAgIEJ5dGVCdWZmZXIgcGVlcklkID0gQnl0ZUJ1ZmZlci53cmFwKGNsaWVudFBlZXJJZCk7CisKKyAgICAgIC8vIENvbnN0cnVjdCB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UgaW4gdGhlIGJ1ZmZlci4KKyAgICAgIGJ1ZmZlci5wdXQoKGJ5dGUpIEhhbmRzaGFrZQorICAgICAgICAgICAgICAuQklUVE9SUkVOVF9QUk9UT0NPTF9JREVOVElGSUVSLmxlbmd0aCgpKTsKKyAgICAgIGJ1ZmZlci5wdXQoSGFuZHNoYWtlCisgICAgICAgICAgICAgIC5CSVRUT1JSRU5UX1BST1RPQ09MX0lERU5USUZJRVIuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICAgIGJ1ZmZlci5wdXQocmVzZXJ2ZWQpOworICAgICAgYnVmZmVyLnB1dChpbmZvSGFzaCk7CisgICAgICBidWZmZXIucHV0KHBlZXJJZCk7CisKKyAgICAgIC8vIFJldHVybiBhIG5ldyBoYW5kc2hha2Ugb2JqZWN0IHdpdGggdGhlIGNvbnN0cnVjdGVkIG1lc3NhZ2UuCisgICAgICByZXR1cm4gbmV3IEhhbmRzaGFrZShidWZmZXIsIGluZm9IYXNoLCBwZWVySWQpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CisgICAgICByZXR1cm4gbnVsbDsgLy8gSW4gY2FzZSB0aGUgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJuIG51bGwuCisgICAgfQorICB9CisKKyAgLy8gQWRkaXRpb25hbCBtZXRob2QgdG8gY3JhZnQgYSBoYW5kc2hha2UgbWVzc2FnZSB3aXRoIHRoZSB0b3JyZW50IGlkZW50aWZpZXIgc2V0LgorICBwdWJsaWMgc3RhdGljIEhhbmRzaGFrZSBwYXJzZShieXRlW10gdG9ycmVudEluZm9IYXNoLCBieXRlW10gY2xpZW50UGVlcklkLCBTdHJpbmcgdG9ycmVudElkZW50aWZpZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgSGFuZHNoYWtlIGhzID0gSGFuZHNoYWtlLmNyYWZ0KHRvcnJlbnRJbmZvSGFzaCwgY2xpZW50UGVlcklkKTsKKyAgICBocy5zZXRUb3JyZW50SWRlbnRpZmllcih0b3JyZW50SWRlbnRpZmllcik7CisgICAgcmV0dXJuIGhzOworICB9CisKKyAgLy8gU2V0cyB0aGUgdG9ycmVudCBpZGVudGlmaWVyIGZvciB0aGlzIGhhbmRzaGFrZS4KKyAgcHVibGljIHZvaWQgc2V0VG9ycmVudElkZW50aWZpZXIoU3RyaW5nIHRvcnJlbnRJZGVudGlmaWVyKSB7CisgICAgdGhpcy50b3JyZW50SWRlbnRpZmllciA9IHRvcnJlbnRJZGVudGlmaWVyOworICB9CisKKyAgLy8gR2V0cyB0aGUgcHJvdG9jb2wgaWRlbnRpZmllciBsZW5ndGggZm9yIHRoaXMgaGFuZHNoYWtlLgorICBwdWJsaWMgaW50IGdldFBzdHJsZW4oKSB7CisgICAgcmV0dXJuIG15UHN0cmxlbjsKKyAgfQorCisgIC8vIEdldHMgdGhlIHRvcnJlbnQgaWRlbnRpZmllci4KKyAgcHVibGljIFN0cmluZyBnZXRUb3JyZW50SWRlbnRpZmllcigpIHsKKyAgICByZXR1cm4gdG9ycmVudElkZW50aWZpZXI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvTG9hZGVkVG9ycmVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1YTU2YwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvTG9hZGVkVG9ycmVudC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEhhc2g7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFN0YXRpc3RpYzsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CisKK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGVkVG9ycmVudCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4ge0BsaW5rIFBpZWNlU3RvcmFnZX0gd2hlcmUgc3RvcmVkIGF2YWlsYWJsZSBwaWVjZXMKKyAgICovCisgIFBpZWNlU3RvcmFnZSBnZXRQaWVjZVN0b3JhZ2UoKTsKKworICAvKioKKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBpbnN0YW5jZQorICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gZmV0Y2ggbWV0YWRhdGEgZnJvbSBzb3VyY2UKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gc291cmNlIGlzIC50b3JyZW50IGZpbGUgYW5kIGl0IHdhcyBkZWxldGVkIG1hbnVhbGx5KQorICAgKi8KKyAgVG9ycmVudE1ldGFkYXRhIGdldE1ldGFkYXRhKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEFubm91bmNlYWJsZUluZm9ybWF0aW9ufSBmb3IgYW5ub3VuY2UgdGhpcyB0b3JyZW50IHRvIHRoZSB0cmFja2VyCisgICAqLworICBATm90TnVsbAorICBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBjcmVhdGVBbm5vdW5jZWFibGVJbmZvcm1hdGlvbigpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50U3RhdGlzdGljfSBpbnN0YW5jZSByZWxhdGVkIHdpdGggdGhpcyB0b3JyZW50CisgICAqLworICBUb3JyZW50U3RhdGlzdGljIGdldFRvcnJlbnRTdGF0aXN0aWMoKTsKKworICAvKioKKyAgICogQHJldHVybiBoYXNoIG9mIHRoaXMgdG9ycmVudAorICAgKi8KKyAgVG9ycmVudEhhc2ggZ2V0VG9ycmVudEhhc2goKTsKKworICAvKioKKyAgICogQHJldHVybiByZWxhdGVkIHtAbGluayBFdmVudERpc3BhdGNoZXJ9CisgICAqLworICBFdmVudERpc3BhdGNoZXIgZ2V0RXZlbnREaXNwYXRjaGVyKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvTG9hZGVkVG9ycmVudEltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvTG9hZGVkVG9ycmVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E2YTdhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTG9hZGVkVG9ycmVudEltcGwgaW1wbGVtZW50cyBMb2FkZWRUb3JyZW50IHsKKworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRTdGF0aXN0aWMgdG9ycmVudFN0YXRpc3RpYzsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50SGFzaCB0b3JyZW50SGFzaDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VVcmxzOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbm5vdW5jZTsKKyAgcHJpdmF0ZSBmaW5hbCBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlOworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcjsKKworICBMb2FkZWRUb3JyZW50SW1wbChUb3JyZW50U3RhdGlzdGljIHRvcnJlbnRTdGF0aXN0aWMsCisgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgIEV2ZW50RGlzcGF0Y2hlciBldmVudERpc3BhdGNoZXIpIHsKKyAgICB0aGlzLnRvcnJlbnRTdGF0aXN0aWMgPSB0b3JyZW50U3RhdGlzdGljOworICAgIHRoaXMubWV0YWRhdGFQcm92aWRlciA9IG1ldGFkYXRhUHJvdmlkZXI7CisgICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBldmVudERpc3BhdGNoZXI7CisgICAgdG9ycmVudEhhc2ggPSBuZXcgSW1tdXRhYmxlVG9ycmVudEhhc2godG9ycmVudE1ldGFkYXRhLmdldEluZm9IYXNoKCkpOworICAgIGlmICh0b3JyZW50TWV0YWRhdGEuZ2V0QW5ub3VuY2VMaXN0KCkgIT0gbnVsbCkgeworICAgICAgdGhpcy5hbm5vdW5jZVVybHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZUxpc3QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuYW5ub3VuY2VVcmxzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZSgpKSk7CisgICAgfQorICAgIHRoaXMuYW5ub3VuY2UgPSB0b3JyZW50TWV0YWRhdGEuZ2V0QW5ub3VuY2UoKTsKKyAgICB0aGlzLnBpZWNlU3RvcmFnZSA9IHBpZWNlU3RvcmFnZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGllY2VTdG9yYWdlIGdldFBpZWNlU3RvcmFnZSgpIHsKKyAgICByZXR1cm4gcGllY2VTdG9yYWdlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUb3JyZW50TWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyLmdldFRvcnJlbnRNZXRhZGF0YSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBmZXRjaCB0b3JyZW50IG1ldGFkYXRhIGZyb20gbWV0YWRhdGEgcHJvdmlkZXI6ICIgKyBtZXRhZGF0YVByb3ZpZGVyLCBlKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRvcnJlbnRTdGF0aXN0aWMgZ2V0VG9ycmVudFN0YXRpc3RpYygpIHsKKyAgICByZXR1cm4gdG9ycmVudFN0YXRpc3RpYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBATm90TnVsbAorICBwdWJsaWMgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gY3JlYXRlQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24oKSB7CisgICAgcmV0dXJuIG5ldyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbkltcGwoCisgICAgICAgICAgICB0b3JyZW50U3RhdGlzdGljLmdldFVwbG9hZGVkQnl0ZXMoKSwKKyAgICAgICAgICAgIHRvcnJlbnRTdGF0aXN0aWMuZ2V0RG93bmxvYWRlZEJ5dGVzKCksCisgICAgICAgICAgICB0b3JyZW50U3RhdGlzdGljLmdldExlZnRCeXRlcygpLAorICAgICAgICAgICAgdG9ycmVudEhhc2gsCisgICAgICAgICAgICBhbm5vdW5jZVVybHMsCisgICAgICAgICAgICBhbm5vdW5jZQorICAgICk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRvcnJlbnRIYXNoIGdldFRvcnJlbnRIYXNoKCkgeworICAgIHJldHVybiB0b3JyZW50SGFzaDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRXZlbnREaXNwYXRjaGVyIGdldEV2ZW50RGlzcGF0Y2hlcigpIHsKKyAgICByZXR1cm4gZXZlbnREaXNwYXRjaGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJMb2FkZWRUb3JyZW50SW1wbHsiICsKKyAgICAgICAgICAgICJwaWVjZSBzdG9yYWdlPSciICsgcGllY2VTdG9yYWdlICsgJ1wnJyArCisgICAgICAgICAgICAiLCBtZXRhZGF0YSBwcm92aWRlcj0nIiArIG1ldGFkYXRhUHJvdmlkZXIgKyAnXCcnICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVySW5mb3JtYXRpb24uamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlckluZm9ybWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwMmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlckluZm9ybWF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKKworcHVibGljIGludGVyZmFjZSBQZWVySW5mb3JtYXRpb24geworCisgIC8qKgorICAgKiBAcmV0dXJuIHtAbGluayBJbmV0U29ja2V0QWRkcmVzc30gb2YgcmVtb3RlIHBlZXIKKyAgICovCisgIEluZXRTb2NrZXRBZGRyZXNzIGdldEFkZHJlc3MoKTsKKworICAvKioKKyAgICogQHJldHVybiBpZCBvZiBjdXJyZW50IHBlZXIgd2hpY2ggdGhlIHBlZXJzIHNlbnQgaW4gdGhlIGhhbmRzaGFrZQorICAgKi8KKyAgYnl0ZVtdIGdldElkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY2xpZW50IGlkZW50aWZpZXIgb2YgY3VycmVudCBwZWVyCisgICAqLworICBTdHJpbmcgZ2V0Q2xpZW50SWRlbnRpZmllcigpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGNsaWVudCB2ZXJzaW9uIG9mIGN1cnJlbnQgcGVlcgorICAgKi8KKyAgaW50IGdldENsaWVudFZlcnNpb24oKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlcnNTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2MjM5YQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlcnNTdG9yYWdlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlclVJRDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworCitwdWJsaWMgY2xhc3MgUGVlcnNTdG9yYWdlIHsKKworICBwcml2YXRlIHZvbGF0aWxlIFBlZXIgc2VsZiA9IG51bGw7CisgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8UGVlclVJRCwgU2hhcmluZ1BlZXI+IGNvbm5lY3RlZFNoYXJpbmdQZWVyczsKKworICBwdWJsaWMgUGVlcnNTdG9yYWdlKCkgeworICAgIHRoaXMuY29ubmVjdGVkU2hhcmluZ1BlZXJzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFBlZXJVSUQsIFNoYXJpbmdQZWVyPigpOworICB9CisKKyAgcHVibGljIFBlZXIgZ2V0U2VsZigpIHsKKyAgICByZXR1cm4gc2VsZjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNlbGYoUGVlciBzZWxmKSB7CisgICAgdGhpcy5zZWxmID0gc2VsZjsKKyAgfQorCisgIHB1YmxpYyBTaGFyaW5nUGVlciBwdXRJZkFic2VudChQZWVyVUlEIHBlZXJJZCwgU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIpIHsKKyAgICByZXR1cm4gY29ubmVjdGVkU2hhcmluZ1BlZXJzLnB1dElmQWJzZW50KHBlZXJJZCwgc2hhcmluZ1BlZXIpOworICB9CisKKyAgcHVibGljIFNoYXJpbmdQZWVyIHJlbW92ZVNoYXJpbmdQZWVyKFBlZXJVSUQgcGVlcklkKSB7CisgICAgcmV0dXJuIGNvbm5lY3RlZFNoYXJpbmdQZWVycy5yZW1vdmUocGVlcklkKTsKKyAgfQorCisgIHB1YmxpYyBTaGFyaW5nUGVlciBnZXRTaGFyaW5nUGVlcihQZWVyVUlEIHBlZXJJZCkgeworICAgIHJldHVybiBjb25uZWN0ZWRTaGFyaW5nUGVlcnMuZ2V0KHBlZXJJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZW1vdmVTaGFyaW5nUGVlcihTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgY29ubmVjdGVkU2hhcmluZ1BlZXJzLnZhbHVlcygpLnJlbW92ZShwZWVyKTsKKyAgfQorCisgIHB1YmxpYyBDb2xsZWN0aW9uPFNoYXJpbmdQZWVyPiBnZXRTaGFyaW5nUGVlcnMoKSB7CisgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KGNvbm5lY3RlZFNoYXJpbmdQZWVycy52YWx1ZXMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGllY2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGllY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTY2ODEzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QaWVjZS5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLlBpZWNlU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKworLyoqCisgKiBBIHRvcnJlbnQgcGllY2UuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB0b3JyZW50IHBpZWNlLiBUb3JyZW50cyBhcmUgbWFkZSBvZiBwaWVjZXMsIHdoaWNoCisgKiBhcmUgaW4gdHVybiBtYWRlIG9mIGJsb2NrcyB0aGF0IGFyZSBleGNoYW5nZWQgdXNpbmcgdGhlIHBlZXIgcHJvdG9jb2wuCisgKiBUaGUgcGllY2UgbGVuZ3RoIGlzIGRlZmluZWQgYXQgdGhlIHRvcnJlbnQgbGV2ZWwsIGJ1dCB0aGUgbGFzdCBwaWVjZSB0aGF0CisgKiBtYWtlcyB0aGUgdG9ycmVudCBtaWdodCBiZSBzbWFsbGVyLgorICogPC9wPgorICoKKyAqIDxwPgorICogSWYgdGhlIHRvcnJlbnQgaGFzIG11bHRpcGxlIGZpbGVzLCBwaWVjZXMgY2FuIHNwcmVhZCBhY3Jvc3MgZmlsZSBib3VuZGFyaWVzLgorICogVGhlIFRvcnJlbnRCeXRlU3RvcmFnZSBhYnN0cmFjdHMgdGhpcyBwcm9ibGVtIHRvIGdpdmUgUGllY2Ugb2JqZWN0cyB0aGUKKyAqIGltcHJlc3Npb24gb2YgYSBjb250aWd1b3VzLCBsaW5lYXIgYnl0ZSBzdG9yYWdlLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgUGllY2UgaW1wbGVtZW50cyBDb21wYXJhYmxlPFBpZWNlPiwgUGllY2VJbmZvcm1hdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBpZWNlLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2U7CisgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICBwcml2YXRlIGZpbmFsIGxvbmcgbGVuZ3RoOworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBoYXNoOworCisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB2YWxpZDsKKyAgcHJpdmF0ZSBpbnQgc2VlbjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIGRhdGE7CisKKyAgLyoqCisgICAqIEluaXRpYWxpemUgYSBuZXcgcGllY2UgaW4gdGhlIGJ5dGUgYnVja2V0LgorICAgKgorICAgKiBAcGFyYW0gcGllY2VTdG9yYWdlICBUaGUgdW5kZXJseWluZyBwaWVjZSBzdG9yYWdlIGJ1Y2tldC4KKyAgICogQHBhcmFtIGluZGV4ICAgVGhpcyBwaWVjZSBpbmRleCBpbiB0aGUgdG9ycmVudC4KKyAgICogQHBhcmFtIGxlbmd0aCAgVGhpcyBwaWVjZSBsZW5ndGgsIGluIGJ5dGVzLgorICAgKiBAcGFyYW0gaGFzaCAgICBUaGlzIHBpZWNlIDIwLWJ5dGUgU0hBMSBoYXNoIHN1bS4KKyAgICovCisgIHB1YmxpYyBQaWVjZShQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlLCBpbnQgaW5kZXgsIGxvbmcgbGVuZ3RoLCBieXRlW10gaGFzaCkgeworICAgIHRoaXMucGllY2VTdG9yYWdlID0gcGllY2VTdG9yYWdlOworICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB0aGlzLmhhc2ggPSBoYXNoOworCisgICAgLy8gUGllY2UgaXMgY29uc2lkZXJlZCBpbnZhbGlkIHVudGlsIGZpcnN0IGNoZWNrLgorICAgIHRoaXMudmFsaWQgPSBmYWxzZTsKKworICAgIC8vIFBpZWNlIHN0YXJ0IHVuc2VlbgorICAgIHRoaXMuc2VlbiA9IDA7CisKKyAgICB0aGlzLmRhdGEgPSBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gKGludClsZW5ndGg7CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIHBpZWNlJ3MgZGF0YSBpcyB2YWxpZCBvciBub3QuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgIHJldHVybiB0aGlzLnZhbGlkOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgcGllY2UgaW4gdGhlIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgIHJldHVybiB0aGlzLmluZGV4OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGlzIHBpZWNlLgorICAgKgorICAgKiA8cD4KKyAgICogQWxsIHBpZWNlcywgZXhjZXB0IHRoZSBsYXN0IG9uZSwgYXJlIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgc2l6ZS4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIGxvbmcgc2l6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGg7CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIHBpZWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBjb25uZWN0ZWQgcGVlciBzd2FybS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGF2YWlsYWJsZSgpIHsKKyAgICByZXR1cm4gdGhpcy5zZWVuID4gMDsKKyAgfQorCisgIC8qKgorICAgKiBNYXJrIHRoaXMgcGllY2UgYXMgYmVpbmcgc2VlbiBhdCB0aGUgZ2l2ZW4gcGVlci4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHNoYXJpbmcgcGVlciB0aGlzIHBpZWNlIGhhcyBiZWVuIHNlZW4gYXZhaWxhYmxlIGF0LgorICAgKi8KKyAgcHVibGljIHZvaWQgc2VlbkF0KFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICB0aGlzLnNlZW4rKzsKKyAgfQorCisgIC8qKgorICAgKiBNYXJrIHRoaXMgcGllY2UgYXMgbm8gbG9uZ2VyIGJlaW5nIGF2YWlsYWJsZSBhdCB0aGUgZ2l2ZW4gcGVlci4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHNoYXJpbmcgcGVlciBmcm9tIHdoaWNoIHRoZSBwaWVjZSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLgorICAgKi8KKyAgcHVibGljIHZvaWQgbm9Mb25nZXJBdChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgdGhpcy5zZWVuLS07CisgIH0KKworICB2b2lkIHNldFZhbGlkKGJvb2xlYW4gdmFsaWQpIHsKKyAgICB0aGlzLnZhbGlkID0gdmFsaWQ7CisgIH0KKworICAvKioKKyAgICogVmFsaWRhdGVzIHRoaXMgcGllY2UuCisgICAqCisgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoaXMgcGllY2UsIGFzIHN0b3JlZCBpbiB0aGUgdW5kZXJseWluZyBieXRlCisgICAqIHN0b3JhZ2UsIGlzIHZhbGlkLCBpLmUuIGl0cyBTSEExIHN1bSBtYXRjaGVzIHRoZSBvbmUgZnJvbSB0aGUgdG9ycmVudAorICAgKiBtZXRhLWluZm8uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTaGFyZWRUb3JyZW50IHRvcnJlbnQsIFBpZWNlIHBpZWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgbG9nZ2VyLnRyYWNlKCJWYWxpZGF0aW5nIHt9Li4uIiwgdGhpcyk7CisKKyAgICAvLyBUT0RPOiByZW1vdmUgY2FzdCB0byBpbnQgd2hlbiBsYXJnZSBCeXRlQnVmZmVyIHN1cHBvcnQgaXMKKyAgICAvLyBpbXBsZW1lbnRlZCBpbiBKYXZhLgorICAgIGJ5dGVbXSBwaWVjZUJ5dGVzID0gZGF0YS5hcnJheSgpOworICAgIGZpbmFsIGJ5dGVbXSBjYWxjdWxhdGVkSGFzaCA9IFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChwaWVjZUJ5dGVzKTsKKyAgICB0aGlzLnZhbGlkID0gQXJyYXlzLmVxdWFscyhjYWxjdWxhdGVkSGFzaCwgdGhpcy5oYXNoKTsKKyAgICBsb2dnZXIudHJhY2UoInZhbGlkYXRpbmcgcmVzdWx0IG9mIHBpZWNlIHt9IGlzIHt9IiwgdGhpcy5pbmRleCwgdGhpcy52YWxpZCk7CisKKyAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCk7CisgIH0KKworICAvKioKKyAgICogSW50ZXJuYWwgcGllY2UgZGF0YSByZWFkIGZ1bmN0aW9uLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIHBpZWNlIGRhdGEgd2l0aG91dCBjaGVja2luZyBpZiB0aGUgcGllY2UgaGFzCisgICAqIGJlZW4gdmFsaWRhdGVkLiBJdCBpcyBzaW1wbHkgbWVhbnQgYXQgZmFjdG9yaW5nLWluIHRoZSBjb21tb24gcmVhZCBjb2RlCisgICAqIGZyb20gdGhlIHZhbGlkYXRlIGFuZCByZWFkIGZ1bmN0aW9ucy4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBpbnNpZGUgdGhpcyBwaWVjZSB3aGVyZSB0byBzdGFydCByZWFkaW5nLgorICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHBpZWNlLgorICAgKiBAcmV0dXJuIEEgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGllY2UgZGF0YS4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgPGVtPm9mZnNldCArIGxlbmd0aDwvZW0+IGdvZXMgb3ZlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGllY2UgYm91bmRhcnkuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIElmIHRoZSByZWFkIGNhbid0IGJlIGNvbXBsZXRlZCAoSS9PIGVycm9yLCBvciBFT0YKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZCwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgcGllY2UgaXMgbm90IGNvbXBsZXRlKS4KKyAgICovCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciBfcmVhZChsb25nIG9mZnNldCwgbG9uZyBsZW5ndGgsIEJ5dGVCdWZmZXIgYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiB0aGlzLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGllY2UjIiArIHRoaXMuaW5kZXggKworICAgICAgICAgICAgICAiIG92ZXJydW4gKCIgKyBvZmZzZXQgKyAiICsgIiArIGxlbmd0aCArICIgPiAiICsKKyAgICAgICAgICAgICAgdGhpcy5sZW5ndGggKyAiKSAhIik7CisgICAgfQorCisgICAgLy8gVE9ETzogcmVtb3ZlIGNhc3QgdG8gaW50IHdoZW4gbGFyZ2UgQnl0ZUJ1ZmZlciBzdXBwb3J0IGlzCisgICAgLy8gaW1wbGVtZW50ZWQgaW4gSmF2YS4KKyAgICBpbnQgcG9zaXRpb24gPSBidWZmZXIucG9zaXRpb24oKTsKKyAgICBieXRlW10gYnl0ZXMgPSB0aGlzLnBpZWNlU3RvcmFnZS5yZWFkUGllY2VQYXJ0KHRoaXMuaW5kZXgsIChpbnQpb2Zmc2V0LCAoaW50KWxlbmd0aCk7CisgICAgYnVmZmVyLnB1dChieXRlcyk7CisgICAgYnVmZmVyLnJld2luZCgpOworICAgIGJ1ZmZlci5saW1pdChieXRlcy5sZW5ndGggKyBwb3NpdGlvbik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgcGllY2UgYmxvY2sgZnJvbSB0aGUgdW5kZXJseWluZyBieXRlIHN0b3JhZ2UuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGlzIHRoZSBwdWJsaWMgbWV0aG9kIGZvciByZWFkaW5nIHRoaXMgcGllY2UncyBkYXRhLCBhbmQgaXQgd2lsbAorICAgKiBvbmx5IHN1Y2NlZWQgaWYgdGhlIHBpZWNlIGlzIGNvbXBsZXRlIGFuZCB2YWxpZCBvbiBkaXNrLCB0aHVzIGVuc3VyaW5nCisgICAqIGFueSBkYXRhIHRoYXQgY29tZXMgb3V0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdmFsaWQgcGllY2UgZGF0YSB3ZSBjYW4gc2VuZAorICAgKiB0byBvdGhlciBwZWVycy4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBpbnNpZGUgdGhpcyBwaWVjZSB3aGVyZSB0byBzdGFydCByZWFkaW5nLgorICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHBpZWNlLgorICAgKiBAcmV0dXJuIEEgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGllY2UgZGF0YS4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgPGVtPm9mZnNldCArIGxlbmd0aDwvZW0+IGdvZXMgb3ZlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGllY2UgYm91bmRhcnkuCisgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgIElmIHRoZSBwaWVjZSBpcyBub3QgdmFsaWQgd2hlbiBhdHRlbXB0aW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlYWQgaXQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIElmIHRoZSByZWFkIGNhbid0IGJlIGNvbXBsZXRlZCAoSS9PIGVycm9yLCBvciBFT0YKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZCwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgcGllY2UgaXMgbm90IGNvbXBsZXRlKS4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWQobG9uZyBvZmZzZXQsIGludCBsZW5ndGgsIEJ5dGVCdWZmZXIgYmxvY2spCisgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCF0aGlzLnZhbGlkKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIHJlYWQgYW4gIiArCisgICAgICAgICAgICAgICJrbm93bi10by1iZSBpbnZhbGlkIHBpZWNlISIpOworICAgIH0KKworICAgIHJldHVybiB0aGlzLl9yZWFkKG9mZnNldCwgbGVuZ3RoLCBibG9jayk7CisgIH0KKworICAvKioKKyAgICogUmVjb3JkIHRoZSBnaXZlbiBibG9jayBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGluIHRoaXMgcGllY2UuCisgICAqCisgICAqIEBwYXJhbSBibG9jayAgVGhlIEJ5dGVCdWZmZXIgY29udGFpbmluZyB0aGUgYmxvY2sgZGF0YS4KKyAgICogQHBhcmFtIG9mZnNldCBUaGUgYmxvY2sgb2Zmc2V0IGluIHRoaXMgcGllY2UuCisgICAqLworICBwdWJsaWMgdm9pZCByZWNvcmQoQnl0ZUJ1ZmZlciBibG9jaywgaW50IG9mZnNldCkgeworICAgIGlmICh0aGlzLmRhdGEgPT0gbnVsbCkgeworICAgICAgLy8gVE9ETzogcmVtb3ZlIGNhc3QgdG8gaW50IHdoZW4gbGFyZ2UgQnl0ZUJ1ZmZlciBzdXBwb3J0IGlzCisgICAgICAvLyBpbXBsZW1lbnRlZCBpbiBKYXZhLgorICAgICAgdGhpcy5kYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgoaW50KSB0aGlzLmxlbmd0aCk7CisgICAgfQorCisgICAgaW50IHBvcyA9IGJsb2NrLnBvc2l0aW9uKCk7CisgICAgdGhpcy5kYXRhLnBvc2l0aW9uKG9mZnNldCk7CisgICAgdGhpcy5kYXRhLnB1dChibG9jayk7CisgICAgYmxvY2sucG9zaXRpb24ocG9zKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5kYXRhLnJld2luZCgpOworICAgIGxvZ2dlci50cmFjZSgiUmVjb3JkaW5nIHt9Li4uIiwgdGhpcyk7CisgICAgdHJ5IHsKKyAgICAgIHBpZWNlU3RvcmFnZS5zYXZlUGllY2UoaW5kZXgsIHRoaXMuZGF0YS5hcnJheSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdGhpcy5kYXRhID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwaWVjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInBpZWNlIyU0ZCVzIiwKKyAgICAgICAgICAgIHRoaXMuaW5kZXgsCisgICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSA/ICIrIiA6ICItIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgUGllY2UpIHsKKyAgICAgIHJldHVybiB0aGlzLmluZGV4ID09ICgoUGllY2UpIG9iaikuaW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGllY2UgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igb3JkZXJpbmcgcGllY2VzIGJhc2VkIG9uIHRoZWlyCisgICAqIGF2YWlsYWJpbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIG90aGVyIFRoZSBwaWVjZSB0byBjb21wYXJlIHdpdGgsIHNob3VsZCBub3QgYmUgPGVtPm51bGw8L2VtPi4KKyAgICovCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFBpZWNlIG90aGVyKSB7CisgICAgLy8gcmV0dXJuIHRydWUgZm9yIHRoZSBzYW1lIHBpZWNlcywgb3RoZXJ3aXNlIHNvcnQgYnkgdGltZSBzZWVuLCB0aGVuIGJ5IGluZGV4OworICAgIGlmICh0aGlzLmVxdWFscyhvdGhlcikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAodGhpcy5zZWVuID09IG90aGVyLnNlZW4pIHsKKyAgICAgIHJldHVybiBuZXcgSW50ZWdlcih0aGlzLmluZGV4KS5jb21wYXJlVG8ob3RoZXIuaW5kZXgpOworICAgIH0gZWxzZSBpZiAodGhpcy5zZWVuIDwgb3RoZXIuc2VlbikgeworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QaWVjZUluZm9ybWF0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BpZWNlSW5mb3JtYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2FkYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QaWVjZUluZm9ybWF0aW9uLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGllY2VJbmZvcm1hdGlvbiB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gcGllY2UgaW5kZXguIEluZGV4aW5nIHN0YXJ0cyBmcm9tIHplcm8KKyAgICovCisgIGludCBnZXRJbmRleCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHBpZWNlIHNpemUuIFRoaXMgdmFsdWUgbXVzdCBiZSBlcXVhbHMgcGllY2Ugc2l6ZSBzcGVjaWZpZWQgYnkgbWV0YWRhdGEgZXhjbHVkaW5nIGxhc3QgcGllY2UKKyAgICovCisgIGludCBnZXRTaXplKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2VsZWN0b3JGYWN0b3J5SW1wbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TZWxlY3RvckZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3MTMzZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2VsZWN0b3JGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5TZWxlY3RvckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworCitwdWJsaWMgY2xhc3MgU2VsZWN0b3JGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFNlbGVjdG9yRmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZWxlY3RvciBuZXdTZWxlY3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFNlbGVjdG9yLm9wZW4oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaGFyZWRUb3JyZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NoYXJlZFRvcnJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI2MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaGFyZWRUb3JyZW50LmphdmEKQEAgLTAsMCArMSw4NTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlBlZXJBY3Rpdml0eUxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLlBpZWNlU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5Ub3JyZW50Qnl0ZVN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5Lio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLk9wdGlvbmFsOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCisKKy8qKgorICogQSB0b3JyZW50IHNoYXJlZCBieSB0aGUgQml0VG9ycmVudCBjbGllbnQuCisgKiA8cC8+CisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgU2hhcmVkVG9ycmVudH0gY2xhc3MgZXh0ZW5kcyB0aGUgVG9ycmVudCBjbGFzcyB3aXRoIGFsbCB0aGUgZGF0YQorICogYW5kIGxvZ2ljIHJlcXVpcmVkIGJ5IHRoZSBCaXRUb3JyZW50IGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqIDwvcD4KKyAqIDxwLz4KKyAqIDxwPgorICogPGVtPk5vdGU6PC9lbT4gdGhpcyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBzaW5nbGUtZmlsZQorICogdG9ycmVudHMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KKworLy8g5Yib5bu6dG9ycmVudOWvueixoQorLy8g5o6l5Y+j57un5om/55qE5Luj56CB5LiN55So5oCO5LmI55yL77yM5Y+N5q2j5a6e546w5piv5Zyo5paH5Lu26YeM55qECitwdWJsaWMgY2xhc3MgU2hhcmVkVG9ycmVudCBpbXBsZW1lbnRzIFBlZXJBY3Rpdml0eUxpc3RlbmVyLCBUb3JyZW50TWV0YWRhdGEsIFRvcnJlbnRJbmZvIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hhcmVkVG9ycmVudC5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVxdWVzdFN0cmF0ZWd5IERFRkFVTFRfUkVRVUVTVF9TVFJBVEVHWSA9IG5ldyBSZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3RpbmcoKTsKKworICAvKioKKyAgICogRW5kLWdhbWUgdHJpZ2dlciByYXRpby4KKyAgICoKKyAgICogPHA+CisgICAqIEVuZy1nYW1lIGJlaGF2aW9yIChyZXF1ZXN0aW5nIGFscmVhZHkgcmVxdWVzdGVkIHBpZWNlcyBmcm9tIGF2YWlsYWJsZQorICAgKiBhbmQgcmVhZHkgcGVlcnMgdG8gdHJ5IHRvIHNwZWVkLXVwIHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyKSB3aWxsIG9ubHkgYmUKKyAgICogZW5hYmxlZCB3aGVuIHRoZSByYXRpbyBvZiBjb21wbGV0ZWQgcGllY2VzIG92ZXIgdG90YWwgcGllY2VzIGluIHRoZQorICAgKiB0b3JyZW50IGlzIG92ZXIgdGhpcyB2YWx1ZS4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRU5HX0dBTUVfQ09NUExFVElPTl9SQVRJTyA9IDAuOTVmOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0dBTUVfU1RBVElDX1BJRUNFU19DT1VOVCA9IDIwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVORF9HQU1FX0lOVk9DQVRJT05fUEVSSU9EX01TID0gMjAwMDsKKworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRTdGF0aXN0aWMgbXlUb3JyZW50U3RhdGlzdGljOworCisgIHByaXZhdGUgbG9uZyBteUxhc3RBbm5vdW5jZVRpbWUgPSAtMTsKKyAgcHJpdmF0ZSBpbnQgbXlTZWVkZXJzQ291bnQgPSAwOworCisgIHByaXZhdGUgZmluYWwgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZTsKKyAgcHJpdmF0ZSBib29sZWFuIGlzRmlsZUNoYW5uZWxPcGVuID0gZmFsc2U7CisgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIEZ1dHVyZTw/Pj4gbXlWYWxpZGF0aW9uRnV0dXJlczsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50TWV0YWRhdGEgbXlUb3JyZW50TWV0YWRhdGE7CisgIHByaXZhdGUgZmluYWwgbG9uZyBteVRvcnJlbnRUb3RhbFNpemU7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgcGllY2VMZW5ndGg7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBwaWVjZXNIYXNoZXM7CisKKyAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworICBwcml2YXRlIFBpZWNlW10gcGllY2VzOworICBwcml2YXRlIGZpbmFsIEJpdFNldCBjb21wbGV0ZWRQaWVjZXM7CisgIHByaXZhdGUgZmluYWwgQml0U2V0IHJlcXVlc3RlZFBpZWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U3RyYXRlZ3kgbXlSZXF1ZXN0U3RyYXRlZ3k7CisgIHByaXZhdGUgZmluYWwgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcjsKKworICBwcml2YXRlIGZpbmFsIExpc3Q8U2hhcmluZ1BlZXI+IG15RG93bmxvYWRlcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KCk7CisgIHByaXZhdGUgZmluYWwgRW5kR2FtZVN0cmF0ZWd5IGVuZEdhbWVTdHJhdGVneSA9IG5ldyBFbmRHYW1lU3RyYXRlZ3lJbXBsKDIpOworICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgZW5kR2FtZUVuYWJsZWRPbiA9IC0xOworCisgIHByaXZhdGUgdm9sYXRpbGUgQ2xpZW50U3RhdGUgY2xpZW50U3RhdGUgPSBDbGllbnRTdGF0ZS5XQUlUSU5HOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBTElEQVRJT05fVEFTS19DT1VOVCA9IDIwMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRVFVRVNURURfUElFQ0VTX1BFUl9UT1JSRU5UID0gMTAwOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgc2hhcmVkIHRvcnJlbnQgZnJvbSBtZXRhLWluZm8KKyAgICoKKyAgICogQHBhcmFtIHRvcnJlbnRNZXRhZGF0YSBUaGUgbWV0YS1pbmZvCisgICAqIEBwYXJhbSBldmVudERpc3BhdGNoZXIKKyAgICovCisgIHB1YmxpYyBTaGFyZWRUb3JyZW50KFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEsIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsIFJlcXVlc3RTdHJhdGVneSByZXF1ZXN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRTdGF0aXN0aWMgdG9ycmVudFN0YXRpc3RpYywgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcikgeworICAgIG15VG9ycmVudE1ldGFkYXRhID0gdG9ycmVudE1ldGFkYXRhOworICAgIHRoaXMucGllY2VTdG9yYWdlID0gcGllY2VTdG9yYWdlOworICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gZXZlbnREaXNwYXRjaGVyOworICAgIG15VG9ycmVudFN0YXRpc3RpYyA9IHRvcnJlbnRTdGF0aXN0aWM7CisgICAgbXlWYWxpZGF0aW9uRnV0dXJlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEZ1dHVyZTw/Pj4oKTsKKyAgICBsb25nIHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChUb3JyZW50RmlsZSB0b3JyZW50RmlsZSA6IG15VG9ycmVudE1ldGFkYXRhLmdldEZpbGVzKCkpIHsKKyAgICAgIHRvdGFsU2l6ZSArPSB0b3JyZW50RmlsZS5zaXplOworICAgIH0KKyAgICBteVRvcnJlbnRUb3RhbFNpemUgPSB0b3RhbFNpemU7CisgICAgdGhpcy5teVJlcXVlc3RTdHJhdGVneSA9IHJlcXVlc3RTdHJhdGVneTsKKworICAgIHRoaXMucGllY2VMZW5ndGggPSBteVRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpOworICAgIHRoaXMucGllY2VzSGFzaGVzID0gQnl0ZUJ1ZmZlci53cmFwKG15VG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0hhc2hlcygpKTsKKworICAgIGlmICh0aGlzLnBpZWNlc0hhc2hlcy5jYXBhY2l0eSgpIC8gQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRSAqCisgICAgICAgICAgICAobG9uZykgdGhpcy5waWVjZUxlbmd0aCA8IG15VG9ycmVudFRvdGFsU2l6ZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVG9ycmVudCBzaXplIGRvZXMgbm90ICIgKworICAgICAgICAgICAgICAibWF0Y2ggdGhlIG51bWJlciBvZiBwaWVjZXMgYW5kIHRoZSBwaWVjZSBzaXplISIpOworICAgIH0KKworICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB0aGlzLnBpZWNlcyA9IG5ldyBQaWVjZVswXTsKKyAgICB0aGlzLmNvbXBsZXRlZFBpZWNlcyA9IG5ldyBCaXRTZXQodG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkpOworICAgIHRoaXMucmVxdWVzdGVkUGllY2VzID0gbmV3IEJpdFNldCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTaGFyZWRUb3JyZW50IGZyb21GaWxlKEZpbGUgc291cmNlLCBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlLCBUb3JyZW50U3RhdGlzdGljIHRvcnJlbnRTdGF0aXN0aWMpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gZGF0YSA9IEZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5KHNvdXJjZSk7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2UoZGF0YSk7CisgICAgcmV0dXJuIG5ldyBTaGFyZWRUb3JyZW50KHRvcnJlbnRNZXRhZGF0YSwgcGllY2VTdG9yYWdlLCBERUZBVUxUX1JFUVVFU1RfU1RSQVRFR1ksIHRvcnJlbnRTdGF0aXN0aWMsIG5ldyBFdmVudERpc3BhdGNoZXIoKSk7CisgIH0KKworICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlRmlsZUNoYW5uZWxJZk5lY2Vzc2FyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGlzRmlsZUNoYW5uZWxPcGVuICYmIG15RG93bmxvYWRlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQ2xvc2luZyBmaWxlICBjaGFubmVsIGZvciB7fSBpZiBuZWNlc3NhcnkuIERvd25sb2FkZXJzOiB7fSIsIGdldEhleEluZm9IYXNoKCksIG15RG93bmxvYWRlcnMuc2l6ZSgpKTsKKyAgICAgIHRoaXMucGllY2VTdG9yYWdlLmNsb3NlKCk7CisgICAgICBpc0ZpbGVDaGFubmVsT3BlbiA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB1cGxvYWRlZCBmb3IgdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWQoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudFN0YXRpc3RpYy5nZXRVcGxvYWRlZEJ5dGVzKCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZG93bmxvYWRlZCBmb3IgdGhpcyB0b3JyZW50LgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiA8Yj5Ob3RlOjwvYj4gdGhpcyBjb3VsZCBiZSBtb3JlIHRoYW4gdGhlIHRvcnJlbnQncyBsZW5ndGgsIGFuZCBzaG91bGQKKyAgICogbm90IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGEgY29tcGxldGlvbiBwZXJjZW50YWdlLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgbG9uZyBnZXREb3dubG9hZGVkKCkgeworICAgIHJldHVybiBteVRvcnJlbnRTdGF0aXN0aWMuZ2V0RG93bmxvYWRlZEJ5dGVzKCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBkb3dubG9hZCBmb3IgdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0TGVmdCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50U3RhdGlzdGljLmdldExlZnRCeXRlcygpOworICB9CisKKyAgcHVibGljIGludCBnZXRTZWVkZXJzQ291bnQoKSB7CisgICAgcmV0dXJuIG15U2VlZGVyc0NvdW50OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2VlZGVyc0NvdW50KGludCBzZWVkZXJzQ291bnQpIHsKKyAgICBteVNlZWRlcnNDb3VudCA9IHNlZWRlcnNDb3VudDsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldExhc3RBbm5vdW5jZVRpbWUoKSB7CisgICAgcmV0dXJuIG15TGFzdEFubm91bmNlVGltZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldExhc3RBbm5vdW5jZVRpbWUobG9uZyBsYXN0QW5ub3VuY2VUaW1lKSB7CisgICAgbXlMYXN0QW5ub3VuY2VUaW1lID0gbGFzdEFubm91bmNlVGltZTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgdG9ycmVudCBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZCB5ZXQuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVkOworICB9CisKKyAgLyoqCisgICAqIFN0b3AgdGhlIHRvcnJlbnQgaW5pdGlhbGl6YXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgIH0KKworICAvKioKKyAgICogQnVpbGQgdGhpcyB0b3JyZW50J3MgcGllY2VzIGFycmF5LgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBIYXNoIGFuZCB2ZXJpZnkgYW55IHBvdGVudGlhbGx5IHByZXNlbnQgbG9jYWwgZGF0YSBhbmQgY3JlYXRlIHRoaXMKKyAgICogdG9ycmVudCdzIHBpZWNlcyBhcnJheSBmcm9tIHRoZWlyIHJlc3BlY3RpdmUgaGFzaCBwcm92aWRlZCBpbiB0aGUKKyAgICogdG9ycmVudCBtZXRhLWluZm8uCisgICAqIDwvcD4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHNvb24gYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIHRvIGluaXRpYWxpemUKKyAgICogdGhlIHBpZWNlcyBhcnJheS4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBzZXRDbGllbnRTdGF0ZShDbGllbnRTdGF0ZS5WQUxJREFUSU5HKTsKKworICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCEiKTsKKyAgICB9CisKKyAgICBoYXNoU2luZ2xlVGhyZWFkKCk7CisKKyAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0UGllY2VzKCkgeworICAgIGludCBuUGllY2VzID0gKGludCkgKE1hdGguY2VpbCgKKyAgICAgICAgICAgIChkb3VibGUpIG15VG9ycmVudFRvdGFsU2l6ZSAvIHRoaXMucGllY2VMZW5ndGgpKTsKKyAgICB0aGlzLnBpZWNlcyA9IG5ldyBQaWVjZVtuUGllY2VzXTsKKyAgICB0aGlzLnBpZWNlc0hhc2hlcy5jbGVhcigpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGhhc2hTaW5nbGVUaHJlYWQoKSB7CisgICAgaW5pdFBpZWNlcygpOworCisgICAgbG9nZ2VyLmRlYnVnKCJBbmFseXppbmcgbG9jYWwgZGF0YSBmb3Ige30gd2l0aCB7fSB0aHJlYWRzLi4uIiwKKyAgICAgICAgICAgIG15VG9ycmVudE1ldGFkYXRhLmdldERpcmVjdG9yeU5hbWUoKSwgVG9ycmVudENyZWF0b3IuSEFTSElOR19USFJFQURTX0NPVU5UKTsKKyAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCB0aGlzLnBpZWNlcy5sZW5ndGg7IGlkeCsrKSB7CisgICAgICBieXRlW10gaGFzaCA9IG5ldyBieXRlW0NvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkVdOworICAgICAgdGhpcy5waWVjZXNIYXNoZXMuZ2V0KGhhc2gpOworCisgICAgICAvLyBUaGUgbGFzdCBwaWVjZSBtYXkgYmUgc2hvcnRlciB0aGFuIHRoZSB0b3JyZW50J3MgZ2xvYmFsIHBpZWNlCisgICAgICAvLyBsZW5ndGguIExldCdzIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IHBpZWNlIGxlbmd0aCBpbiBhbnkKKyAgICAgIC8vIHNpdHVhdGlvbi4KKyAgICAgIGxvbmcgb2ZmID0gKChsb25nKSBpZHgpICogdGhpcy5waWVjZUxlbmd0aDsKKyAgICAgIGxvbmcgbGVuID0gTWF0aC5taW4oCisgICAgICAgICAgICAgIG15VG9ycmVudFRvdGFsU2l6ZSAtIG9mZiwKKyAgICAgICAgICAgICAgdGhpcy5waWVjZUxlbmd0aCk7CisKKyAgICAgIFBpZWNlIHBpZWNlID0gbmV3IFBpZWNlKHRoaXMucGllY2VTdG9yYWdlLCBpZHgsIGxlbiwgaGFzaAorICAgICAgKTsKKyAgICAgIHRoaXMucGllY2VzW2lkeF0gPSBwaWVjZTsKKyAgICAgIHBpZWNlLnNldFZhbGlkKHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKS5nZXQoaWR4KSk7CisKKyAgICAgIGlmIChwaWVjZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgdGhpcy5jb21wbGV0ZWRQaWVjZXMuc2V0KHBpZWNlLmdldEluZGV4KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICBsb2dnZXIudHJhY2UoIkNsb3NpbmcgdG9ycmVudCIsIG15VG9ycmVudE1ldGFkYXRhLmdldERpcmVjdG9yeU5hbWUoKSk7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMucGllY2VTdG9yYWdlLmNsb3NlKCk7CisgICAgICBpc0ZpbGVDaGFubmVsT3BlbiA9IGZhbHNlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJFcnJvciBjbG9zaW5nIHRvcnJlbnQgYnl0ZSBzdG9yYWdlOiB7fSIsCisgICAgICAgICAgICAgIGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZUZ1bGx5KCkgeworICAgIGxvZ2dlci50cmFjZSgiQ2xvc2luZyB0b3JyZW50IiwgbXlUb3JyZW50TWV0YWRhdGEuZ2V0RGlyZWN0b3J5TmFtZSgpKTsKKyAgICB0cnkgeworICAgICAgdGhpcy5waWVjZVN0b3JhZ2UuY2xvc2VGdWxseSgpOworICAgICAgaXNGaWxlQ2hhbm5lbE9wZW4gPSBmYWxzZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiRXJyb3IgY2xvc2luZyB0b3JyZW50IGJ5dGUgc3RvcmFnZToge30iLAorICAgICAgICAgICAgICBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0cmlldmUgYSBwaWVjZSBvYmplY3QgYnkgaW5kZXguCisgICAqCisgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHBpZWNlIGluIHRoaXMgdG9ycmVudC4KKyAgICovCisgIHB1YmxpYyBQaWVjZSBnZXRQaWVjZShpbnQgaW5kZXgpIHsKKyAgICBpZiAodGhpcy5waWVjZXMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBub3QgaW5pdGlhbGl6ZWQgeWV0LiIpOworICAgIH0KKworICAgIGlmIChpbmRleCA+PSB0aGlzLnBpZWNlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcGllY2UgaW5kZXghIik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMucGllY2VzW2luZGV4XTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBiaXQgZmllbGQgb2YgYXZhaWxhYmxlIHBpZWNlcyBmb3IgdGhpcyB0b3JyZW50LgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBBdmFpbGFibGUgcGllY2VzIGFyZSBwaWVjZXMgYXZhaWxhYmxlIGluIHRoZSBzd2FybSwgYW5kIGl0IGRvZXMgbm90CisgICAqIGluY2x1ZGUgb3VyIG93biBwaWVjZXMuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBCaXRTZXQgZ2V0QXZhaWxhYmxlUGllY2VzKCkgeworICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRvcnJlbnQgbm90IHlldCBpbml0aWFsaXplZCEiKTsKKyAgICB9CisKKyAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gbmV3IEJpdFNldCh0aGlzLnBpZWNlcy5sZW5ndGgpOworCisgICAgc3luY2hyb25pemVkICh0aGlzLnBpZWNlcykgeworICAgICAgZm9yIChQaWVjZSBwaWVjZSA6IHRoaXMucGllY2VzKSB7CisgICAgICAgIGlmIChwaWVjZS5hdmFpbGFibGUoKSkgeworICAgICAgICAgIGF2YWlsYWJsZVBpZWNlcy5zZXQocGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYXZhaWxhYmxlUGllY2VzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGNvbXBsZXRlZCBwaWVjZXMgYml0c2V0LgorICAgKi8KKyAgcHVibGljIEJpdFNldCBnZXRDb21wbGV0ZWRQaWVjZXMoKSB7CisgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBub3QgeWV0IGluaXRpYWxpemVkISIpOworICAgIH0KKworICAgIHJldHVybiBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIHRvcnJlbnQgaGFzIGJlZW4gZnVsbHkgZG93bmxvYWRlZCwgb3IgaXMgZnVsbHkKKyAgICogYXZhaWxhYmxlIGxvY2FsbHkuCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5waWVjZXMubGVuZ3RoID4gMAorICAgICAgICAgICAgJiYgcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCkgPT0gbXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKTsKKyAgfQorCisgIC8qKgorICAgKiBGaW5hbGl6ZSB0aGUgZG93bmxvYWQgb2YgdGhpcyB0b3JyZW50LgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGlzIHJlYWxpemVzIHRoZSBmaW5hbCwgcHJlLXNlZWRpbmcgcGhhc2UgYWN0aW9ucyBvbiB0aGlzIHRvcnJlbnQsCisgICAqIHdoaWNoIHVzdWFsbHkgY29uc2lzdHMgaW4gcHV0dGluZyB0aGUgdG9ycmVudCBkYXRhIGluIHRoZWlyIGZpbmFsIGZvcm0KKyAgICogYW5kIGF0IHRoZWlyIHRhcmdldCBsb2NhdGlvbi4KKyAgICogPC9wPgorICAgKgorICAgKiBAc2VlIFRvcnJlbnRCeXRlU3RvcmFnZSNmaW5pc2gKKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmaW5pc2goKSB7CisgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBub3QgeWV0IGluaXRpYWxpemVkISIpOworICAgIH0KKworICAgIGlmICghdGhpcy5pc0NvbXBsZXRlKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRvcnJlbnQgZG93bmxvYWQgaXMgbm90IGNvbXBsZXRlISIpOworICAgIH0KKworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLmRvd25sb2FkQ29tcGxldGUoKTsKKyAgICBzZXRDbGllbnRTdGF0ZShDbGllbnRTdGF0ZS5TRUVESU5HKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgcmV0dXJuIHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKS5jYXJkaW5hbGl0eSgpID09IG15VG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCk7CisgIH0KKworICBwdWJsaWMgQ2xpZW50U3RhdGUgZ2V0Q2xpZW50U3RhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMuY2xpZW50U3RhdGU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTdGF0ZShDbGllbnRTdGF0ZSBjbGllbnRTdGF0ZSkgeworICAgIHRoaXMuY2xpZW50U3RhdGUgPSBjbGllbnRTdGF0ZTsKKyAgfQorCisgIC8qKgorICAgKiBNYXJrIGEgcGllY2UgYXMgY29tcGxldGVkLCBkZWNyZW1lbnRpbmcgdGhlIHBpZWNlIHNpemUgaW4gYnl0ZXMgZnJvbSBvdXIKKyAgICogbGVmdCBieXRlcyB0byBkb3dubG9hZCBjb3VudGVyLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtDb21wbGV0ZWQoUGllY2UgcGllY2UpIHsKKyAgICBpZiAodGhpcy5jb21wbGV0ZWRQaWVjZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQSBjb21wbGV0ZWQgcGllY2UgbWVhbnMgdGhhdCdzIHRoYXQgbXVjaCBkYXRhIGxlZnQgdG8gZG93bmxvYWQgZm9yCisgICAgLy8gdGhpcyB0b3JyZW50LgorICAgIG15VG9ycmVudFN0YXRpc3RpYy5hZGRMZWZ0KC1waWVjZS5zaXplKCkpOworICAgIHRoaXMuY29tcGxldGVkUGllY2VzLnNldChwaWVjZS5nZXRJbmRleCgpKTsKKyAgICBpZiAoY29tcGxldGVkUGllY2VzLmNhcmRpbmFsaXR5KCkgPT0gZ2V0UGllY2VzQ291bnQoKSkgeworICAgICAgbG9nZ2VyLmluZm8oImFsbCBwaWVjZXMgYXJlIHJlY2VpdmVkIGZvciB0b3JyZW50IHt9LiBWYWxpZGF0aW5nLi4uIiwgdGhpcyk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtVbmNvbXBsZXRlZChQaWVjZSBwaWVjZSkgeworICAgIGlmICghdGhpcy5jb21wbGV0ZWRQaWVjZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVtb3ZlVmFsaWRhdGlvbkZ1dHVyZShwaWVjZSk7CisgICAgbXlUb3JyZW50U3RhdGlzdGljLmFkZExlZnQocGllY2Uuc2l6ZSgpKTsKKyAgICB0aGlzLmNvbXBsZXRlZFBpZWNlcy5jbGVhcihwaWVjZS5nZXRJbmRleCgpKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVWYWxpZGF0aW9uRnV0dXJlKFBpZWNlIHBpZWNlKSB7CisgICAgbXlWYWxpZGF0aW9uRnV0dXJlcy5yZW1vdmUocGllY2UuZ2V0SW5kZXgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBub3RpZnlQaWVjZURvd25sb2FkZWQoUGllY2UgcGllY2UsIFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5waWVjZURvd25sb2FkZWQocGllY2UsIHBlZXIpOworICB9CisKKyAgLyoqIFBlZXJBY3Rpdml0eUxpc3RlbmVyIGhhbmRsZXIocykuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqCisgICAqIFBlZXIgY2hva2VkIGhhbmRsZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFdoZW4gYSBwZWVyIGNob2tlcywgdGhlIHJlcXVlc3RzIG1hZGUgdG8gaXQgYXJlIGNhbmNlbGVkIGFuZCB3ZSBuZWVkIHRvCisgICAqIG1hcmsgdGhlIGV2ZW50dWFsbHkgcGllY2Ugd2UgcmVxdWVzdGVkIGZyb20gaXQgYXMgYXZhaWxhYmxlIGFnYWluIGZvcgorICAgKiBkb3dubG9hZCB0ZW50YXRpdmUgZnJvbSBhbm90aGVyIHBlZXIuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHBlZXIgdGhhdCBjaG9rZWQuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZVBlZXJDaG9rZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIFNldDxQaWVjZT4gcGllY2VzID0gcGVlci5nZXRSZXF1ZXN0ZWRQaWVjZXMoKTsKKworICAgIGlmIChwaWVjZXMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChQaWVjZSBwaWVjZSA6IHBpZWNlcykgeworICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcy5zZXQocGllY2UuZ2V0SW5kZXgoKSwgZmFsc2UpOworICAgICAgfQorICAgIH0KKworICAgIGxvZ2dlci50cmFjZSgiUGVlciB7fSBjaG9rZWQsIHdlIG5vdyBoYXZlIHt9IG91dHN0YW5kaW5nICIgKworICAgICAgICAgICAgICAgICAgICAicmVxdWVzdChzKToge30uIiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMKKyAgICAgICAgICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIFBlZXIgcmVhZHkgaGFuZGxlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2hlbiBhIHBlZXIgYmVjb21lcyByZWFkeSB0byBhY2NlcHQgcGllY2UgYmxvY2sgcmVxdWVzdHMsIHNlbGVjdCBhIHBpZWNlCisgICAqIHRvIGRvd25sb2FkIGFuZCBnbyBmb3IgaXQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHBlZXIgdGhhdCBiZWNhbWUgcmVhZHkuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGVlclJlYWR5KFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBpbml0SWZOZWNlc3NhcnkocGVlcik7CisKKyAgICBSZXF1ZXN0c0NvbGxlY3Rpb24gcmVxdWVzdHNDb2xsZWN0aW9uID0gZ2V0UmVxdWVzdHNDb2xsZWN0aW9uKHBlZXIpOworICAgIHJlcXVlc3RzQ29sbGVjdGlvbi5zZW5kQWxsUmVxdWVzdHMoKTsKKyAgfQorCisgIEBOb3ROdWxsCisgIHByaXZhdGUgc3luY2hyb25pemVkIFJlcXVlc3RzQ29sbGVjdGlvbiBnZXRSZXF1ZXN0c0NvbGxlY3Rpb24oZmluYWwgU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGlmIChteVZhbGlkYXRpb25GdXR1cmVzLnNpemUoKSA+IE1BWF9WQUxJREFUSU9OX1RBU0tfQ09VTlQpIHJldHVybiBSZXF1ZXN0c0NvbGxlY3Rpb24uRW1wdHkuSU5TVEFOQ0U7CisKKyAgICBpZiAodGhpcy5yZXF1ZXN0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSA+IE1BWF9SRVFVRVNURURfUElFQ0VTX1BFUl9UT1JSRU5UKSByZXR1cm4gUmVxdWVzdHNDb2xsZWN0aW9uLkVtcHR5LklOU1RBTkNFOworCisgICAgaW50IGNvbXBsZXRlZEFuZFZhbGlkYXRlZCA9IHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKS5jYXJkaW5hbGl0eSgpOworCisgICAgYm9vbGVhbiB0dXJuT25FbmRHYW1lID0gY29tcGxldGVkQW5kVmFsaWRhdGVkID4gZ2V0UGllY2VzQ291bnQoKSAqIEVOR19HQU1FX0NPTVBMRVRJT05fUkFUSU8gfHwKKyAgICAgICAgICAgIGNvbXBsZXRlZEFuZFZhbGlkYXRlZCA+IGdldFBpZWNlc0NvdW50KCkgLSBFTkRfR0FNRV9TVEFUSUNfUElFQ0VTX0NPVU5UOworICAgIGlmICh0dXJuT25FbmRHYW1lKSB7CisgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgaWYgKG5vdyAtIEVORF9HQU1FX0lOVk9DQVRJT05fUEVSSU9EX01TID4gZW5kR2FtZUVuYWJsZWRPbikgeworICAgICAgICBlbmRHYW1lRW5hYmxlZE9uID0gbm93OworICAgICAgICBsb2dnZXIuaW5mbygiUnVubmluZyBlbmQtZ2FtZSBtb2RlLCBjdXJyZW50bHkgYXZhaWxhYmxlIHt9L3t9IHBpZWNlcyIsCisgICAgICAgICAgICAgICAgcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgZ2V0UGllY2VDb3VudCgpKTsKKyAgICAgICAgcmV0dXJuIGVuZEdhbWVTdHJhdGVneS5jb2xsZWN0UmVxdWVzdHMocGllY2VzLCBteURvd25sb2FkZXJzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBSZXF1ZXN0c0NvbGxlY3Rpb24uRW1wdHkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgZmluYWwgQml0U2V0IGludGVyZXN0aW5nID0gcGVlci5nZXRBdmFpbGFibGVQaWVjZXMoKTsKKyAgICBpbnRlcmVzdGluZy5hbmROb3QodGhpcy5jb21wbGV0ZWRQaWVjZXMpOworICAgIGludGVyZXN0aW5nLmFuZE5vdCh0aGlzLnJlcXVlc3RlZFBpZWNlcyk7CisKKyAgICBpbnQgbWF4UmVxdWVzdGluZ1BpZWNlcyA9IE1hdGgubWluKDEwLCBpbnRlcmVzdGluZy5jYXJkaW5hbGl0eSgpKTsKKyAgICBpbnQgY3VycmVudGx5RG93bmxvYWRpbmcgPSBwZWVyLmdldERvd25sb2FkaW5nUGllY2VzQ291bnQoKTsKKyAgICBNYXA8UGllY2UsIExpc3Q8U2hhcmluZ1BlZXI+PiB0b1JlcXVlc3QgPSBuZXcgSGFzaE1hcDxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+KCk7CisgICAgd2hpbGUgKGN1cnJlbnRseURvd25sb2FkaW5nIDwgbWF4UmVxdWVzdGluZ1BpZWNlcykgeworICAgICAgaWYgKCFwZWVyLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChpbnRlcmVzdGluZy5jYXJkaW5hbGl0eSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFJlcXVlc3RzQ29sbGVjdGlvbi5FbXB0eS5JTlNUQU5DRTsKKyAgICAgIH0KKworICAgICAgUGllY2UgY2hvc2VuID0gbXlSZXF1ZXN0U3RyYXRlZ3kuY2hvb3NlUGllY2UoaW50ZXJlc3RpbmcsIHBpZWNlcyk7CisgICAgICBpZiAoY2hvc2VuID09IG51bGwpIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oImNob3NlbiBwaWVjZSBpcyBudWxsIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuc2V0KGNob3Nlbi5nZXRJbmRleCgpKTsKKyAgICAgIGN1cnJlbnRseURvd25sb2FkaW5nKys7CisgICAgICB0b1JlcXVlc3QucHV0KGNob3NlbiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwZWVyKSk7CisgICAgICBpbnRlcmVzdGluZy5jbGVhcihjaG9zZW4uZ2V0SW5kZXgoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBSZXF1ZXN0c0NvbGxlY3Rpb25JbXBsKHRvUmVxdWVzdCk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdElmTmVjZXNzYXJ5KFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW5pdCgpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dnZXIuaW5mbygiSW50ZXJydXB0ZWQgaW5pdCIsIGUpOworICAgICAgICBwZWVyLnVuYmluZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBsb2dnZXIuaW5mbygiSU9FIGR1cmluZyBpbml0IiwgZSk7CisgICAgICAgIHBlZXIudW5iaW5kKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBpZWNlIGF2YWlsYWJpbGl0eSBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBIYW5kbGUgdXBkYXRlcyBpbiBwaWVjZSBhdmFpbGFiaWxpdHkgZnJvbSBhIHBlZXIncyBIQVZFIG1lc3NhZ2UuIFdoZW4KKyAgICogdGhpcyBoYXBwZW5zLCB3ZSBuZWVkIHRvIG1hcmsgdGhhdCBwaWVjZSBhcyBhdmFpbGFibGUgZnJvbSB0aGUgcGVlci4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgVGhlIHBlZXIgd2UgZ290IHRoZSB1cGRhdGUgZnJvbS4KKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSB0aGF0IGJlY2FtZSBhdmFpbGFibGUuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VBdmFpbGFiaWxpdHkoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHsKKyAgICBib29sZWFuIGlzUGVlckludGVyZXN0aW5nID0gIXRoaXMuY29tcGxldGVkUGllY2VzLmdldChwaWVjZS5nZXRJbmRleCgpKSAmJgorICAgICAgICAgICAgIXRoaXMucmVxdWVzdGVkUGllY2VzLmdldChwaWVjZS5nZXRJbmRleCgpKTsKKyAgICBpZiAoaXNQZWVySW50ZXJlc3RpbmcpIHsKKyAgICAgIHBlZXIuaW50ZXJlc3RpbmcoKTsKKyAgICB9CisKKyAgICBwaWVjZS5zZWVuQXQocGVlcik7CisKKyAgICBsb2dnZXIudHJhY2UoIlBlZXIge30gY29udHJpYnV0ZXMge30gcGllY2UocykgW3t9L3t9L3t9XS4iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICBwZWVyLAorICAgICAgICAgICAgICAgICAgICBwZWVyLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVkUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5waWVjZXMubGVuZ3RoCisgICAgICAgICAgICB9KTsKKworICAgIGlmICghcGVlci5pc0Nob2tlZCgpICYmCisgICAgICAgICAgICBwZWVyLmlzSW50ZXJlc3RpbmcoKSAmJgorICAgICAgICAgICAgIXBlZXIuaXNEb3dubG9hZGluZygpKSB7CisgICAgICB0aGlzLmhhbmRsZVBlZXJSZWFkeShwZWVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQml0IGZpZWxkIGF2YWlsYWJpbGl0eSBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBIYW5kbGUgdXBkYXRlcyBpbiBwaWVjZSBhdmFpbGFiaWxpdHkgZnJvbSBhIHBlZXIncyBCSVRGSUVMRCBtZXNzYWdlLgorICAgKiBXaGVuIHRoaXMgaGFwcGVucywgd2UgbmVlZCB0byBtYXJrIGluIGFsbCB0aGUgcGllY2VzIHRoZSBwZWVyIGhhcyB0aGF0CisgICAqIHRoZXkgY2FuIGJlIHJlYWNoZWQgdGhyb3VnaCB0aGlzIHBlZXIsIHRodXMgYXVnbWVudGluZyB0aGUgZ2xvYmFsCisgICAqIGF2YWlsYWJpbGl0eSBvZiBwaWVjZXMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgICAgICAgICAgICBUaGUgcGVlciB3ZSBnb3QgdGhlIHVwZGF0ZSBmcm9tLgorICAgKiBAcGFyYW0gYXZhaWxhYmxlUGllY2VzIFRoZSBwaWVjZXMgYXZhaWxhYmlsaXR5IGJpdCBmaWVsZCBvZiB0aGUgcGVlci4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVCaXRmaWVsZEF2YWlsYWJpbGl0eShTaGFyaW5nUGVlciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzKSB7CisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBwZWVyIGlzIGludGVyZXN0aW5nIGZvciB1cyBvciBub3QsIGFuZCBub3RpZnkgaXQuCisgICAgQml0U2V0IGludGVyZXN0aW5nID0gKEJpdFNldCkgYXZhaWxhYmxlUGllY2VzLmNsb25lKCk7CisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICBpbnRlcmVzdGluZy5hbmROb3QodGhpcy5jb21wbGV0ZWRQaWVjZXMpOworICAgICAgaW50ZXJlc3RpbmcuYW5kTm90KHRoaXMucmVxdWVzdGVkUGllY2VzKTsKKyAgICB9CisgICAgLy8gUmVjb3JkIHRoZSBwZWVyIGhhcyBhbGwgdGhlIHBpZWNlcyBpdCB0b2xkIHVzIGl0IGhhZC4KKyAgICBmb3IgKGludCBpID0gYXZhaWxhYmxlUGllY2VzLm5leHRTZXRCaXQoMCk7IGkgPj0gMDsKKyAgICAgICAgIGkgPSBhdmFpbGFibGVQaWVjZXMubmV4dFNldEJpdChpICsgMSkpIHsKKyAgICAgIHRoaXMucGllY2VzW2ldLnNlZW5BdChwZWVyKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJlc3RpbmcuY2FyZGluYWxpdHkoKSA9PSAwKSB7CisgICAgICBwZWVyLm5vdEludGVyZXN0aW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBlZXIuaW50ZXJlc3RpbmcoKTsKKyAgICB9CisKKyAgICBsb2dnZXIuZGVidWcoIlBlZXIge30gY29udHJpYnV0ZXMge30gcGllY2UocyksIHRvdGFsIHBpZWNlcyBjb3VudDoge30uIiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIG15VG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkKKyAgICAgICAgICAgIH0pOworICB9CisKKyAgcHVibGljIGludCBnZXREb3dubG9hZGVyc0NvdW50KCkgeworICAgIHJldHVybiBteURvd25sb2FkZXJzLnNpemUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZnRlclBlZXJSZW1vdmVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKworICB9CisKKyAgLyoqCisgICAqIFBpZWNlIHVwbG9hZCBjb21wbGV0aW9uIGhhbmRsZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFdoZW4gYSBwaWVjZSBoYXMgYmVlbiBzZW50IHRvIGEgcGVlciwgd2UganVzdCByZWNvcmQgdGhhdCB3ZSBzZW50IHRoYXQKKyAgICogbWFueSBieXRlcy4gSWYgdGhlIHBpZWNlIGlzIHZhbGlkIG9uIHRoZSBwZWVyJ3Mgc2lkZSwgaXQgd2lsbCBzZW5kIHVzIGEKKyAgICogSEFWRSBtZXNzYWdlIGFuZCB3ZSdsbCByZWNvcmQgdGhhdCB0aGUgcGllY2UgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZWVyIGF0CisgICAqIHRoYXQgbW9tZW50IChzZWUgPGNvZGU+aGFuZGxlUGllY2VBdmFpbGFiaWxpdHkoKTwvY29kZT4pLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyICBUaGUgcGVlciB3ZSBnb3QgdGhpcyBwaWVjZSBmcm9tLgorICAgKiBAcGFyYW0gcGllY2UgVGhlIHBpZWNlIGluIHF1ZXN0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlU2VudChTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSkgeworICAgIGxvZ2dlci50cmFjZSgiQ29tcGxldGVkIHVwbG9hZCBvZiB7fSB0byB7fS4iLCBwaWVjZSwgcGVlcik7CisgICAgbXlUb3JyZW50U3RhdGlzdGljLmFkZFVwbG9hZGVkKHBpZWNlLnNpemUoKSk7CisgIH0KKworICAvKioKKyAgICogUGllY2UgZG93bmxvYWQgY29tcGxldGlvbiBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBJZiB0aGUgY29tcGxldGUgcGllY2UgZG93bmxvYWRlZCBpcyB2YWxpZCwgd2UgY2FuIHJlY29yZCBpbiB0aGUgdG9ycmVudAorICAgKiBjb21wbGV0ZWRQaWVjZXMgYml0IGZpZWxkIHRoYXQgd2Uga25vdyBoYXZlIHRoaXMgcGllY2UuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgIFRoZSBwZWVyIHdlIGdvdCB0aGlzIHBpZWNlIGZyb20uCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgaW4gcXVlc3Rpb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VDb21wbGV0ZWQoU2hhcmluZ1BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGllY2UgcGllY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gUmVnYXJkbGVzcyBvZiB2YWxpZGl0eSwgcmVjb3JkIHRoZSBudW1iZXIgb2YgYnl0ZXMgZG93bmxvYWRlZCBhbmQKKyAgICAvLyBtYXJrIHRoZSBwaWVjZSBhcyBub3QgcmVxdWVzdGVkIGFueW1vcmUKKyAgICBteVRvcnJlbnRTdGF0aXN0aWMuYWRkRG93bmxvYWRlZChwaWVjZS5zaXplKCkpOworICAgIHRoaXMucmVxdWVzdGVkUGllY2VzLnNldChwaWVjZS5nZXRJbmRleCgpLCBmYWxzZSk7CisKKyAgICBsb2dnZXIudHJhY2UoIldlIG5vdyBoYXZlIHt9IHBpZWNlKHMpIGFuZCB7fSBvdXRzdGFuZGluZyByZXF1ZXN0KHMpOiB7fSIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVkUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdGVkUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdGVkUGllY2VzCisgICAgICAgICAgICB9KTsKKyAgfQorCisgIC8qKgorICAgKiBQZWVyIGRpc2Nvbm5lY3Rpb24gaGFuZGxlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2hlbiBhIHBlZXIgZGlzY29ubmVjdHMsIHdlIG5lZWQgdG8gbWFyayBpbiBhbGwgb2YgdGhlIHBpZWNlcyBpdCBoYWQKKyAgICogYXZhaWxhYmxlIHRoYXQgdGhleSBjYW4ndCBiZSByZWFjaGVkIHRocm91Z2ggdGhpcyBwZWVyIGFueW1vcmUuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHBlZXIgd2UgZ290IHRoaXMgcGllY2UgZnJvbS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlUGVlckRpc2Nvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IHBlZXIuZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisKKyAgICBmb3IgKGludCBpID0gYXZhaWxhYmxlUGllY2VzLm5leHRTZXRCaXQoMCk7IGkgPj0gMDsKKyAgICAgICAgIGkgPSBhdmFpbGFibGVQaWVjZXMubmV4dFNldEJpdChpICsgMSkpIHsKKyAgICAgIHRoaXMucGllY2VzW2ldLm5vTG9uZ2VyQXQocGVlcik7CisgICAgfQorCisgICAgU2V0PFBpZWNlPiByZXF1ZXN0ZWQgPSBwZWVyLmdldFJlcXVlc3RlZFBpZWNlcygpOworICAgIGlmIChyZXF1ZXN0ZWQgIT0gbnVsbCkgeworICAgICAgZm9yIChQaWVjZSBwaWVjZSA6IHJlcXVlc3RlZCkgeworICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcy5zZXQocGllY2UuZ2V0SW5kZXgoKSwgZmFsc2UpOworICAgICAgfQorICAgIH0KKworICAgIG15RG93bmxvYWRlcnMucmVtb3ZlKHBlZXIpOworCisgICAgdHJ5IHsKKyAgICAgIGNsb3NlRmlsZUNoYW5uZWxJZk5lY2Vzc2FyeSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJJL08gZXJyb3Igb24gYXR0ZW1wdCB0byBjbG9zZSBmaWxlIHN0b3JhZ2U6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGxvZ2dlci5kZWJ1ZygiUGVlciB7fSB3ZW50IGF3YXkgd2l0aCB7fSBwaWVjZShzKSBbe30ve31dLiIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIHBlZXIsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlZFBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnBpZWNlcy5sZW5ndGgKKyAgICAgICAgICAgIH0pOworICAgIGxvZ2dlci50cmFjZSgiV2Ugbm93IGhhdmUge30gcGllY2UocykgYW5kIHt9IG91dHN0YW5kaW5nIHJlcXVlc3Qocyk6IHt9IiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMKKyAgICAgICAgICAgIH0pOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBlZXJEaXNjb25uZWN0ZWQocGVlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZUlPRXhjZXB0aW9uKFNoYXJpbmdQZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5kb3dubG9hZEZhaWxlZChpb2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVOZXdQZWVyQ29ubmVjdGVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBpbml0SWZOZWNlc3NhcnkocGVlcik7CisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkucGVlckNvbm5lY3RlZChwZWVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiU2hhcmVkVG9ycmVudHsiICsKKyAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhUb3JyZW50VXRpbHMuZ2V0VG9ycmVudEZpbGVOYW1lcyhteVRvcnJlbnRNZXRhZGF0YSkudG9BcnJheSgpKSArCisgICAgICAgICAgICAifSI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlOYW1lKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXREaXJlY3RvcnlOYW1lKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8VG9ycmVudEZpbGU+IGdldEZpbGVzKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRGaWxlcygpOworICB9CisKKyAgQE51bGxhYmxlCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFubm91bmNlTGlzdCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0QW5ub3VuY2VMaXN0KCk7CisgIH0KKworICBATnVsbGFibGUKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3VuY2UoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmdldEFubm91bmNlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wdGlvbmFsPExvbmc+IGdldENyZWF0aW9uRGF0ZSgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0Q3JlYXRpb25EYXRlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0Q29tbWVudCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0Q29tbWVudCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcHRpb25hbDxTdHJpbmc+IGdldENyZWF0ZWRCeSgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0Q3JlYXRlZEJ5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQaWVjZUxlbmd0aCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldFBpZWNlc0hhc2hlcygpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzSGFzaGVzKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5pc1ByaXZhdGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBpZWNlc0NvdW50KCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmdldEluZm9IYXNoKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0SGV4SW5mb0hhc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBpZWNlQ291bnQoKSB7CisgICAgcmV0dXJuIGdldFBpZWNlc0NvdW50KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0UGllY2VTaXplKGludCBwaWVjZUlkeCkgeworICAgIHJldHVybiBnZXRQaWVjZUxlbmd0aCgpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmVQaWVjZUFuZFZhbGlkYXRlKFBpZWNlIHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisvLyAgICBwLmZpbmlzaCgpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmtDb21wbGV0ZWRBbmRBZGRWYWxpZGF0aW9uRnV0dXJlKFBpZWNlIHBpZWNlLCBGdXR1cmU8Pz4gdmFsaWRhdGlvbkZ1dHVyZSkgeworICAgIHRoaXMubWFya0NvbXBsZXRlZChwaWVjZSk7CisgICAgbXlWYWxpZGF0aW9uRnV0dXJlcy5wdXQocGllY2UuZ2V0SW5kZXgoKSwgdmFsaWRhdGlvbkZ1dHVyZSk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBbGxQaWVjZXNPZlBlZXJDb21wbGV0ZWRBbmRWYWxpZGF0ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGZpbmFsIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSBwZWVyLmdldEF2YWlsYWJsZVBpZWNlcygpOworICAgIGZvciAoUGllY2UgcGllY2UgOiBwaWVjZXMpIHsKKyAgICAgIGZpbmFsIGJvb2xlYW4gcGVlckhhdmVDdXJyZW50UGllY2UgPSBhdmFpbGFibGVQaWVjZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpOworICAgICAgaWYgKCFwZWVySGF2ZUN1cnJlbnRQaWVjZSkgY29udGludWU7CisgICAgICBpZiAoIWNvbXBsZXRlZFBpZWNlcy5nZXQocGllY2UuZ2V0SW5kZXgoKSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChteVZhbGlkYXRpb25GdXR1cmVzLmdldChwaWVjZS5nZXRJbmRleCgpKSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGVkUGVlcihTaGFyaW5nUGVlciBzaGFyaW5nUGVlcikgeworICAgIG15RG93bmxvYWRlcnMuYWRkKHNoYXJpbmdQZWVyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaGFyaW5nUGVlckZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2hhcmluZ1BlZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyNjNlMQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2hhcmluZ1BlZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2hhcmluZ1BlZXJGYWN0b3J5IHsKKworICBTaGFyaW5nUGVlciBjcmVhdGVTaGFyaW5nUGVlcihTdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgcGVlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDaGFubmVsIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGllbnRJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbik7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2ltcGxlQ2xpZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NpbXBsZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDNjY2QKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NpbXBsZUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRTdGF0aXN0aWM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCisvLyDlrqLmiLfnq68KK3B1YmxpYyBjbGFzcyBTaW1wbGVDbGllbnQgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0VYRUNVVE9SX1NJWkUgPSAxMDsKKyAgcHJpdmF0ZSBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlcjsKKworICBwdWJsaWMgU2ltcGxlQ2xpZW50KCkgeworICAgIHRoaXMoREVGQVVMVF9FWEVDVVRPUl9TSVpFLCBERUZBVUxUX0VYRUNVVE9SX1NJWkUpOy8vIOaehOmAoOWHveaVsOmHjei9ve+8jOi9veWFpeS4i+mdoueahOS8oOWFpeS4pOS4quWHveaVsOeahOWHveaVsAorICB9CisKKyAgcHVibGljIFNpbXBsZUNsaWVudChpbnQgd29ya2luZ0V4ZWN1dG9yU2l6ZSwgaW50IHZhbGlkYXRvckV4ZWN1dG9yU2l6ZSkgeworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wod29ya2luZ0V4ZWN1dG9yU2l6ZSksIEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodmFsaWRhdG9yRXhlY3V0b3JTaXplKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgIHN0b3AoNjAsIFRpbWVVbml0LlNFQ09ORFMpOworICB9CisKKyAgcHVibGljIHZvaWQgc3RvcChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgICBFeGNlcHRpb24gaW50ZXJydXB0ZWRFeGNlcHRpb24gPSBudWxsOworICAgIGJvb2xlYW4gYW55RmFpbGVkQnlUaW1lb3V0ID0gZmFsc2U7CisgICAgZm9yIChFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlIDogQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLmdldEV4ZWN1dG9yKCksCisgICAgICAgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5nZXRQaWVjZVZhbGlkYXRvckV4ZWN1dG9yKCkpKSB7CisgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKworICAgICAgLy9pZiB0aGUgdGhyZWFkIGlzIGFscmVhZHkgaW50ZXJydXB0ZWQgZG9uJ3QgdHJ5IHRvIGF3YWl0IHRlcm1pbmF0aW9uCisgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIGNvbnRpbnVlOworCisgICAgICB0cnkgeworICAgICAgICBpZiAoIWV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKHRpbWVvdXQsIHRpbWVVbml0KSkgeworICAgICAgICAgIGFueUZhaWxlZEJ5VGltZW91dCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaW50ZXJydXB0ZWRFeGNlcHRpb24gPSBlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaW50ZXJydXB0ZWRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRocmVhZCB3YXMgaW50ZXJydXB0ZWQsICIgKworICAgICAgICAgICAgICAic2h1dGRvd24gbWV0aG9kcyBhcmUgaW52b2tlZCBidXQgbWF5YmUgdGFza3MgYXJlIG5vdCBmaW5pc2hlZCB5ZXQiLCBpbnRlcnJ1cHRlZEV4Y2VwdGlvbik7CisgICAgfQorICAgIGlmIChhbnlGYWlsZWRCeVRpbWVvdXQpCisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIGV4ZWN1dG9yIHdhcyBub3QgZnVsbHkgc2h1dGRvd24gYmVjYXVzZSB0aW1lb3V0IHdhcyBlbGFwc2VkIik7CisKKyAgfQorCisgIC8vdG9ycmVudEZpbGUg5piv56eN5a2Q6Lev5b6ECisgIHB1YmxpYyB2b2lkIGRvd25sb2FkVG9ycmVudChTdHJpbmcgdG9ycmVudEZpbGUsIFN0cmluZyBkb3dubG9hZERpciwgSW5ldEFkZHJlc3MgaVB2NEFkZHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KGlQdjRBZGRyZXNzKTsKKyAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICBMaXN0PFRvcnJlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gQ29sbGVjdGlvbnMuPFRvcnJlbnRMaXN0ZW5lcj5zaW5nbGV0b25MaXN0KAorICAgICAgICAgICAgbmV3IFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIoKSB7CisKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25Db21wbGV0ZShpbnQgdmFsaWRwaWVjZXMsIGludCB0b3RhbHBpZWNlcykgeworICAgICAgICAgICAgICAgIGlmICh2YWxpZHBpZWNlcyA9PSB0b3RhbHBpZWNlcykgc2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkb3dubG9hZENvbXBsZXRlKCkgeworICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICApOworICAgIFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyID0gY29tbXVuaWNhdGlvbk1hbmFnZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZSwgZG93bmxvYWREaXIsIGxpc3RlbmVycyk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgfQorCisgIHByaXZhdGUgVG9ycmVudE1hbmFnZXIgc3RhcnREb3dubG9hZGluZyhTdHJpbmcgdG9ycmVudEZpbGUsIFN0cmluZyBkb3dubG9hZERpciwgSW5ldEFkZHJlc3MgaVB2NEFkZHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RhcnQoaVB2NEFkZHJlc3MpOworICAgIHJldHVybiBjb21tdW5pY2F0aW9uTWFuYWdlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLCBkb3dubG9hZERpcik7CisgIH0KKworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgZG93bmxvYWRUb3JyZW50QXN5bmMoU3RyaW5nIHRvcnJlbnRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaVB2NEFkZHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHN0YXJ0RG93bmxvYWRpbmcodG9ycmVudEZpbGUsIGRvd25sb2FkRGlyLCBpUHY0QWRkcmVzcyk7CisgIH0KKworCisgIC8qKgorICAgKiBHZXQgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiB0b3JyZW50IGZpbGUKKyAgICogQHBhcmFtIGRvdFRvcnJlbnRGaWxlUGF0aAorICAgKiBAcmV0dXJuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdW5hYmxlIHRvIGdldCB0b3JyZW50IG1ldGFkYXRhCisgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoZSB0b3JyZW50IGhhcyBub3QgYmVlbiBsb2FkZWQKKyAgICovCisgIHB1YmxpYyBUb3JyZW50U3RhdGlzdGljIGdldFN0YXRpc3RpY3MoU3RyaW5nIGRvdFRvcnJlbnRGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlTWV0YWRhdGFQcm92aWRlciBtZXRhZGF0YVByb3ZpZGVyID0gbmV3IEZpbGVNZXRhZGF0YVByb3ZpZGVyKGRvdFRvcnJlbnRGaWxlUGF0aCk7CisgICAgVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhID0gbWV0YWRhdGFQcm92aWRlci5nZXRUb3JyZW50TWV0YWRhdGEoKTsKKyAgICBMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgPSBjb21tdW5pY2F0aW9uTWFuYWdlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5nZXRMb2FkZWRUb3JyZW50KG1ldGFkYXRhLmdldEhleEluZm9IYXNoKCkpOworICAgIGlmIChsb2FkZWRUb3JyZW50ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBuZXcgVG9ycmVudFN0YXRpc3RpYyhsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRTdGF0aXN0aWMoKSk7CisgICAgfQorCisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCIpOworCisgIH0KKworCisgIHB1YmxpYyBib29sZWFuIGhhc1N0b3AoKSB7CisgICAgcmV0dXJuIGNvbW11bmljYXRpb25NYW5hZ2VyLmhhc1N0b3AoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM0NmNlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEhhc2g7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCisvKioKKyAqIEBhdXRob3IgU2VyZ2V5LlBhaworICogRGF0ZTogOS85LzEzCisgKiBUaW1lOiA3OjQ2IFBNCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudENvbm5lY3Rpb25MaXN0ZW5lciB7CisKKyAgYm9vbGVhbiBoYXNUb3JyZW50KFRvcnJlbnRIYXNoIHRvcnJlbnRIYXNoKTsKKworICB2b2lkIGhhbmRsZU5ld1BlZXJDb25uZWN0aW9uKFNvY2tldENoYW5uZWwgcywgYnl0ZVtdIHBlZXJJZCwgU3RyaW5nIGhleEluZm9IYXNoKTsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYWI2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRMaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBjb25uZWN0aW9uIHdpdGggcGVlciBpcyBlc3RhYmxpc2hlZAorICAgKgorICAgKiBAcGFyYW0gcGVlckluZm9ybWF0aW9uIHNwZWNpZmllZCBpbmZvcm1hdGlvbiBhYm91dCBwZWVyCisgICAqLworICB2b2lkIHBlZXJDb25uZWN0ZWQoUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbik7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBjb25uZWN0aW9uIHdpdGggcGVlciBpcyBjbG9zZWQuCisgICAqCisgICAqIEBwYXJhbSBwZWVySW5mb3JtYXRpb24gc3BlY2lmaWVkIGluZm9ybWF0aW9uIGFib3V0IHBlZXIKKyAgICovCisgIHZvaWQgcGVlckRpc2Nvbm5lY3RlZChQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKTsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIHBpZWNlIGlzIGRvd25sb2FkZWQgYW5kIHZhbGlkYXRlZAorICAgKgorICAgKiBAcGFyYW0gcGllY2VJbmZvcm1hdGlvbiBzcGVjaWZpZWQgaW5mb3JtYXRpb24gYWJvdXQgcGllY2UKKyAgICogQHBhcmFtIHBlZXJJbmZvcm1hdGlvbiAgc3BlY2lmaWVkIGluZm9ybWF0aW9uIGFib3V0IHBlZXIKKyAgICovCisgIHZvaWQgcGllY2VEb3dubG9hZGVkKFBpZWNlSW5mb3JtYXRpb24gcGllY2VJbmZvcm1hdGlvbiwgUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbik7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBkb3dubG9hZGluZyBpcyBmdWxseSBkb3dubG9hZGVkIChsYXN0IHBpZWNlIGlzIHJlY2VpdmVkIGFuZCB2YWxpZGF0ZWQpCisgICAqLworICB2b2lkIGRvd25sb2FkQ29tcGxldGUoKTsKKworICAvKioKKyAgICogaW52b2tlZCB3aGVuIHBpZWNlIGlzIGRvd25sb2FkZWQgYnV0IG5vdCB2YWxpZGF0ZWQgeWV0CisgICAqCisgICAqIEBwYXJhbSBwaWVjZUluZm9ybWF0aW9uIHNwZWNpZmllZCBpbmZvcm1hdGlvbiBhYm91dCBwaWVjZQorICAgKiBAcGFyYW0gcGVlckluZm9ybWF0aW9uICBzcGVjaWZpZWQgaW5mb3JtYXRpb24gYWJvdXQgcGVlcgorICAgKi8KKyAgdm9pZCBwaWVjZVJlY2VpdmVkKFBpZWNlSW5mb3JtYXRpb24gcGllY2VJbmZvcm1hdGlvbiwgUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbik7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiBkb3dubG9hZCB3YXMgZmFpbGVkIHdpdGggYW55IGV4Y2VwdGlvbiAoZS5nLiBzb21lIHJ1bnRpbWUgZXhjZXB0aW9uIG9yIGkvbyBleGNlcHRpb24gaW4gZmlsZSBvcGVyYXRpb24pLgorICAgKgorICAgKiBAcGFyYW0gY2F1c2Ugc3BlY2lmaWVkIGV4Y2VwdGlvbgorICAgKi8KKyAgdm9pZCBkb3dubG9hZEZhaWxlZChUaHJvd2FibGUgY2F1c2UpOworCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gdmFsaWRhdGlvbiBvZiB0b3JyZW50IGlzIGRvbmUuCisgICAqIElmIHRvdGFsIHBpZWNlcyBjb3VudCBhbmQgdmFsaWQgcGllY2VzIGNvdW50IGFyZSBlcXVhbHMgaXQgbWVhbnMgdGhhdCB0b3JyZW50IGlzIGZ1bGx5IGRvd25sb2FkZWQuCisgICAqIHtAbGluayAjZG93bmxvYWRDb21wbGV0ZSgpfSBsaXN0ZW5lciB3aWxsIG5vdCBiZSBpbnZva2VkIGluIHRoaXMgY2FzZQorICAgKgorICAgKiBAcGFyYW0gdmFsaWRwaWVjZXMgY291bnQgb2YgdmFsaWQgcGllY2VzLiBNdXN0IGJlIG5vdCBncmVhdGVyIGFzICN0b3RhbHBpZWNlcworICAgKiBAcGFyYW0gdG90YWxwaWVjZXMgdG90YWwgcGllY2VzIGNvdW50IGluIHRvcnJlbnQKKyAgICovCisgIHZvaWQgdmFsaWRhdGlvbkNvbXBsZXRlKGludCB2YWxpZHBpZWNlcywgaW50IHRvdGFscGllY2VzKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TGlzdGVuZXJXcmFwcGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMaXN0ZW5lcldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM1NmZiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TGlzdGVuZXJXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK3B1YmxpYyBjbGFzcyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyIGltcGxlbWVudHMgVG9ycmVudExpc3RlbmVyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcGVlckNvbm5lY3RlZChQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwZWVyRGlzY29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHBpZWNlRG93bmxvYWRlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb3dubG9hZEZhaWxlZChUaHJvd2FibGUgY2F1c2UpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHBpZWNlUmVjZWl2ZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB2YWxpZGF0aW9uQ29tcGxldGUoaW50IHZhbGlkcGllY2VzLCBpbnQgdG90YWxwaWVjZXMpIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMb2FkZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTVmN2QKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudExvYWRlciB7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgb3IgZmluZHMgc2hhcmVkIHRvcnJlbnQgaW5zdGFuY2UgZm9yIHNwZWNpZmllZCBhbm5vdW5jZWFibGUgdG9ycmVudCBhbmQgcmV0dXJuIGl0CisgICAqCisgICAqIEBwYXJhbSBsb2FkZWRUb3JyZW50IHNwZWNpZmllZCB0b3JyZW50CisgICAqIEByZXR1cm4gc2hhcmVkIHRvcnJlbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgYW5ub3VuY2VhYmxlIHRvcnJlbnQKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgaWYgYW55IGlvIGVycm9yIG9jY3VycworICAgKi8KKyAgQE5vdE51bGwKKyAgU2hhcmVkVG9ycmVudCBsb2FkVG9ycmVudChATm90TnVsbCBMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TG9hZGVySW1wbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TG9hZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmZiZTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMb2FkZXJJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3kuUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLy/lrp7njrDliqDovb1TaGFyZWRUb3JyZW505qC55o2u57uZ5a6a55qEIExvYWRlZFRvcnJlbnQg5a+56LGh77yM5Yqg6L295LiA5LiqIFNoYXJlZFRvcnJlbnQg5a+56LGhCitwdWJsaWMgY2xhc3MgVG9ycmVudExvYWRlckltcGwgaW1wbGVtZW50cyBUb3JyZW50TG9hZGVyIHsKKworICBATm90TnVsbAorICBwcml2YXRlIGZpbmFsIFRvcnJlbnRzU3RvcmFnZSBteVRvcnJlbnRzU3RvcmFnZTsKKworICBwdWJsaWMgVG9ycmVudExvYWRlckltcGwoQE5vdE51bGwgVG9ycmVudHNTdG9yYWdlIHRvcnJlbnRzU3RvcmFnZSkgeworICAgIG15VG9ycmVudHNTdG9yYWdlID0gdG9ycmVudHNTdG9yYWdlOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBOb3ROdWxsCisgIHB1YmxpYyBTaGFyZWRUb3JyZW50IGxvYWRUb3JyZW50KEBOb3ROdWxsIExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCA9IGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudEhhc2goKS5nZXRIZXhJbmZvSGFzaCgpOworICAgIFNoYXJlZFRvcnJlbnQgb2xkID0gbXlUb3JyZW50c1N0b3JhZ2UuZ2V0VG9ycmVudChoZXhJbmZvSGFzaCk7CisgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGE7CisgICAgdHJ5IHsKKyAgICAgIHRvcnJlbnRNZXRhZGF0YSA9IGxvYWRlZFRvcnJlbnQuZ2V0TWV0YWRhdGEoKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgbXlUb3JyZW50c1N0b3JhZ2UucmVtb3ZlKGhleEluZm9IYXNoKTsKKyAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgZmluYWwgU2hhcmVkVG9ycmVudCBzaGFyZWRUb3JyZW50ID0gbmV3IFNoYXJlZFRvcnJlbnQodG9ycmVudE1ldGFkYXRhLCBsb2FkZWRUb3JyZW50LmdldFBpZWNlU3RvcmFnZSgpLAorICAgICAgICAgICAgbmV3IFJlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZygpLAorICAgICAgICAgICAgbG9hZGVkVG9ycmVudC5nZXRUb3JyZW50U3RhdGlzdGljKCksIGxvYWRlZFRvcnJlbnQuZ2V0RXZlbnREaXNwYXRjaGVyKCkpOworCisgICAgb2xkID0gbXlUb3JyZW50c1N0b3JhZ2UucHV0SWZBYnNlbnRBY3RpdmVUb3JyZW50KGhleEluZm9IYXNoLCBzaGFyZWRUb3JyZW50KTsKKyAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBvbGQ7CisgICAgfQorICAgIHJldHVybiBzaGFyZWRUb3JyZW50OworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNYW5hZ2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjNDkxMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudE1hbmFnZXIgZXh0ZW5kcyBUb3JyZW50SGFzaCB7CisKKyAgLyoqCisgICAqIGFkZCBzcGVjaWZpZWQgbGlzdGVuZXIgd2hpY2ggd2lsbCBiZSBub3RpZmllZCBvbiBuZXcgZXZlbnRzCisgICAqCisgICAqIEBwYXJhbSBsaXN0ZW5lciBzcGVjaWZpZWQgbGlzdGVuZXIKKyAgICovCisgIHZvaWQgYWRkTGlzdGVuZXIoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAvKioKKyAgICogcmVtb3ZlIHNwZWNpZmllZCBsaXN0ZW5lciB3aGljaCB3YXMgYWRkZWQgZWFybGllciBieSB7QGxpbmsgVG9ycmVudE1hbmFnZXIjYWRkTGlzdGVuZXJ9IG1ldGhvZC4KKyAgICogWW91IGNhbiByZWNlaXZlIGV2ZW50cyBpbiB0aGlzIGxpc3RlbmVyIGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kIGlmIG5vdGlmeSBtZXRob2Qgd2FzIGludm9rZWQgYmVmb3JlIHRoaXMgbWV0aG9kCisgICAqCisgICAqIEBwYXJhbSBsaXN0ZW5lciBzcGVjaWZpZWQgbGlzdGVuZXIKKyAgICogQHJldHVybiB0cnVlIGlmIGxpc3RlbmVycyB3YXMgcmVtb3ZlZCBvdGhlcndpc2UgZmFsc2UgKGUuZy4gbGlzdGVuZXIgd2FzIG5vdCBmb3VuZCkKKyAgICovCisgIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAvKioKKyAgICogd2FpdCB1bnRpbCBkb3dubG9hZCB3aWxsIGJlIGZpbmlzaGVkCisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0ICB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQKKyAgICogQHBhcmFtIHRpbWVVbml0IHRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVvdXQgYXJndW1lbnQKKyAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGlzIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQKKyAgICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uICAgICBpZiB0aW1lb3V0IHdhcyBlbGFwc2VkCisgICAqLworICB2b2lkIGF3YWl0RG93bmxvYWRDb21wbGV0ZShpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXJJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNYW5hZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWNmNTcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNYW5hZ2VySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK2NsYXNzIFRvcnJlbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIFRvcnJlbnRNYW5hZ2VyIHsKKworICBwcml2YXRlIGZpbmFsIEV2ZW50RGlzcGF0Y2hlciBldmVudERpc3BhdGNoZXI7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudEhhc2ggaGFzaDsKKworICBUb3JyZW50TWFuYWdlckltcGwoRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlciwgVG9ycmVudEhhc2ggaGFzaCkgeworICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gZXZlbnREaXNwYXRjaGVyOworICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgZXZlbnREaXNwYXRjaGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICByZXR1cm4gZXZlbnREaXNwYXRjaGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiBoYXNoLmdldEluZm9IYXNoKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gaGFzaC5nZXRIZXhJbmZvSGFzaCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGF3YWl0RG93bmxvYWRDb21wbGV0ZShpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgZmluYWwgU2VtYXBob3JlIHNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgVG9ycmVudExpc3RlbmVyV3JhcHBlciBsaXN0ZW5lciA9IG5ldyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb3dubG9hZENvbXBsZXRlKCkgeworICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgfQorICAgIH07CisgICAgdHJ5IHsKKyAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgIGlmICghc2VtYXBob3JlLnRyeUFjcXVpcmUodGltZW91dCwgdGltZVVuaXQpKSB7CisgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJVbmFibGUgdG8gZG93bmxvYWQgdG9ycmVudCBpbiBzcGVjaWZpZWQgdGltZW91dCIpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNZXRhZGF0YVByb3ZpZGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRNZXRhZGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4OWVjMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUb3JyZW50TWV0YWRhdGFQcm92aWRlciB7CisKKyAgLyoqCisgICAqIGxvYWQgYW5kIHJldHVybiBuZXcge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gaW5zdGFuY2UgZnJvbSBhbnkgc291cmNlCisgICAqCisgICAqIEByZXR1cm4gbmV3IHRvcnJlbnQgbWV0YWRhdGEgaW5zdGFuY2UKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgIGlmIGFueSBJTyBlcnJvciBvY2N1cnMKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGlmIHNwZWNpZmllZCBzb3VyY2UgaGFzIGludmFsaWQgQkVQIGZvcm1hdCBvciBtaXNzZWQgcmVxdWlyZWQgZmllbGRzCisgICAqLworICBATm90TnVsbAorICBUb3JyZW50TWV0YWRhdGEgZ2V0VG9ycmVudE1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRzU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50c1N0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU1ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50c1N0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBhaXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworCisvLyDlrqLmiLfnq6/ojrflj5YKKy8v6LSf6LSj566h55CG5Lik57G7IHRvcnJlbnTvvJrmtLvot4PnmoTvvIjmraPlnKjov5vooYzkuIvovb3miJbkuIrkvKDnmoTvvInlkozlt7LliqDovb3nmoTvvIjlt7Lnu4/ooqvop6PmnpDlubbliqDovb3ov5vlhoXlrZjkvYblj6/og73mnKrooqvmtLvot4Pkvb/nlKjnmoTvvIkgdG9ycmVudOOAggorLy/or6Xnsbvmj5Dkvpvkuobmlrnms5XmnaXmt7vliqDjgIHojrflj5bjgIHnp7vpmaTjgIHmo4Dmn6Xov5nkupsgdG9ycmVudO+8jOWQjOaXtuaUr+aMgemrmOaViOeahOW5tuWPkeiuv+mXru+8jOehruS/nee6v+eoi+WuieWFqOOAggorcHVibGljIGNsYXNzIFRvcnJlbnRzU3RvcmFnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIHJlYWRXcml0ZUxvY2s7CisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU2hhcmVkVG9ycmVudD4gYWN0aXZlVG9ycmVudHM7CisgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTG9hZGVkVG9ycmVudD4gbG9hZGVkVG9ycmVudHM7CisKKyAgcHVibGljIFRvcnJlbnRzU3RvcmFnZSgpIHsKKyAgICByZWFkV3JpdGVMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICBhY3RpdmVUb3JyZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2hhcmVkVG9ycmVudD4oKTsKKyAgICBsb2FkZWRUb3JyZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9hZGVkVG9ycmVudD4oKTsKKyAgfQorCisgIC8v5qC55o2uaGFzaOafpeaJvuaYr+WQpuacieWvueW6lOenjeWtkAorICBwdWJsaWMgYm9vbGVhbiBoYXNUb3JyZW50KFN0cmluZyBoYXNoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICByZXR1cm4gbG9hZGVkVG9ycmVudHMuY29udGFpbnNLZXkoaGFzaCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICAvL+iOt+WPluW3suWKoOi9veeahHRvcnJlbnQKKyAgcHVibGljIExvYWRlZFRvcnJlbnQgZ2V0TG9hZGVkVG9ycmVudChTdHJpbmcgaGFzaCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIGxvYWRlZFRvcnJlbnRzLmdldChoYXNoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIC8vIOWkhOeQhnBlZXLmlq3lvIDov57mjqXnmoTmg4XlhrUg56eN5a2Q5LiN5rS76LeD5LqG5Zyo5q2k5aSE6L+b6KGM5pON5L2cCisgIHB1YmxpYyB2b2lkIHBlZXJEaXNjb25uZWN0ZWQoU3RyaW5nIHRvcnJlbnRIYXNoKSB7CisgICAgZmluYWwgU2hhcmVkVG9ycmVudCB0b3JyZW50OworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIHRvcnJlbnQgPSBhY3RpdmVUb3JyZW50cy5nZXQodG9ycmVudEhhc2gpOworICAgICAgaWYgKHRvcnJlbnQgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICBib29sZWFuIGlzVG9ycmVudEZpbmlzaGVkID0gdG9ycmVudC5pc0ZpbmlzaGVkKCk7CisgICAgICBpZiAodG9ycmVudC5nZXREb3dubG9hZGVyc0NvdW50KCkgPT0gMCAmJiBpc1RvcnJlbnRGaW5pc2hlZCkgeworICAgICAgICBhY3RpdmVUb3JyZW50cy5yZW1vdmUodG9ycmVudEhhc2gpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgICB0b3JyZW50LmNsb3NlKCk7CisgIH0KKworICAvL+iOt+WPlua0u+i3g+eahHRvcnJlbnQKKyAgcHVibGljIFNoYXJlZFRvcnJlbnQgZ2V0VG9ycmVudChTdHJpbmcgaGFzaCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIGFjdGl2ZVRvcnJlbnRzLmdldChoYXNoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIC8vIOWwhuW3sue7j+WKoOi9veeahOenjeWtkOWKoOWFpQorICBwdWJsaWMgdm9pZCBhZGRUb3JyZW50KFN0cmluZyBoYXNoLCBMb2FkZWRUb3JyZW50IHRvcnJlbnQpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICBsb2FkZWRUb3JyZW50cy5wdXQoaGFzaCwgdG9ycmVudCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIFNoYXJlZFRvcnJlbnQgcHV0SWZBYnNlbnRBY3RpdmVUb3JyZW50KFN0cmluZyBoYXNoLCBTaGFyZWRUb3JyZW50IHRvcnJlbnQpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICBmaW5hbCBTaGFyZWRUb3JyZW50IG9sZCA9IGFjdGl2ZVRvcnJlbnRzLmdldChoYXNoKTsKKyAgICAgIGlmIChvbGQgIT0gbnVsbCkgcmV0dXJuIG9sZDsKKworICAgICAgcmV0dXJuIGFjdGl2ZVRvcnJlbnRzLnB1dChoYXNoLCB0b3JyZW50KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUGFpcjxTaGFyZWRUb3JyZW50LCBMb2FkZWRUb3JyZW50PiByZW1vdmUoU3RyaW5nIGhhc2gpIHsKKyAgICBmaW5hbCBQYWlyPFNoYXJlZFRvcnJlbnQsIExvYWRlZFRvcnJlbnQ+IHJlc3VsdDsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHNoYXJlZFRvcnJlbnQgPSBhY3RpdmVUb3JyZW50cy5yZW1vdmUoaGFzaCk7CisgICAgICBmaW5hbCBMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgPSBsb2FkZWRUb3JyZW50cy5yZW1vdmUoaGFzaCk7CisgICAgICByZXN1bHQgPSBuZXcgUGFpcjxTaGFyZWRUb3JyZW50LCBMb2FkZWRUb3JyZW50PihzaGFyZWRUb3JyZW50LCBsb2FkZWRUb3JyZW50KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5zZWNvbmQoKSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICByZXN1bHQuc2Vjb25kKCkuZ2V0UGllY2VTdG9yYWdlKCkuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdC5maXJzdCgpICE9IG51bGwpIHsKKyAgICAgIHJlc3VsdC5maXJzdCgpLmNsb3NlRnVsbHkoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIOiOt+WPlua0u+i3g+eahOenjeWtkAorICBwdWJsaWMgTGlzdDxTaGFyZWRUb3JyZW50PiBhY3RpdmVUb3JyZW50cygpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFNoYXJlZFRvcnJlbnQ+KGFjdGl2ZVRvcnJlbnRzLnZhbHVlcygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiBhbm5vdW5jZWFibGVUb3JyZW50cygpIHsKKyAgICBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPigpOworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgZm9yIChMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgOiBsb2FkZWRUb3JyZW50cy52YWx1ZXMoKSkgeworICAgICAgICBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbiA9IGxvYWRlZFRvcnJlbnQuY3JlYXRlQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24oKTsKKyAgICAgICAgaWYgKFRvcnJlbnRVdGlscy5pc1RyYWNrZXJMZXNzSW5mbyhhbm5vdW5jZWFibGVJbmZvcm1hdGlvbikpIGNvbnRpbnVlOworICAgICAgICByZXN1bHQuYWRkKGFubm91bmNlYWJsZUluZm9ybWF0aW9uKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTGlzdDxMb2FkZWRUb3JyZW50PiBnZXRMb2FkZWRUb3JyZW50cygpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PExvYWRlZFRvcnJlbnQ+KGxvYWRlZFRvcnJlbnRzLnZhbHVlcygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIGZpbmFsIENvbGxlY3Rpb248U2hhcmVkVG9ycmVudD4gc2hhcmVkVG9ycmVudHM7CisgICAgZmluYWwgQ29sbGVjdGlvbjxMb2FkZWRUb3JyZW50PiBsb2FkZWRUb3JyZW50czsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICBzaGFyZWRUb3JyZW50cyA9IG5ldyBBcnJheUxpc3Q8U2hhcmVkVG9ycmVudD4oYWN0aXZlVG9ycmVudHMudmFsdWVzKCkpOworICAgICAgbG9hZGVkVG9ycmVudHMgPSBuZXcgQXJyYXlMaXN0PExvYWRlZFRvcnJlbnQ+KHRoaXMubG9hZGVkVG9ycmVudHMudmFsdWVzKCkpOworICAgICAgdGhpcy5sb2FkZWRUb3JyZW50cy5jbGVhcigpOworICAgICAgYWN0aXZlVG9ycmVudHMuY2xlYXIoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgICAgZm9yIChTaGFyZWRUb3JyZW50IHNoYXJlZFRvcnJlbnQgOiBzaGFyZWRUb3JyZW50cykgeworICAgICAgc2hhcmVkVG9ycmVudC5jbG9zZUZ1bGx5KCk7CisgICAgfQorICAgIGZvciAoTG9hZGVkVG9ycmVudCBsb2FkZWRUb3JyZW50IDogbG9hZGVkVG9ycmVudHMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxvYWRlZFRvcnJlbnQuZ2V0UGllY2VTdG9yYWdlKCkuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM4NzAwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZS5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCisvKioKKyAqIEJpdFRvcnJlbnQgYW5ub3VuY2Ugc3ViLXN5c3RlbS4KKyAqIDxwLz4KKyAqIDxwPgorICogQSBCaXRUb3JyZW50IGNsaWVudCBtdXN0IGNoZWNrLWluIHRvIHRoZSB0b3JyZW50J3MgdHJhY2tlcihzKSB0byBnZXQgcGVlcnMKKyAqIGFuZCB0byByZXBvcnQgY2VydGFpbiBldmVudHMuCisgKiA8L3A+CisgKiA8cC8+CisgKiA8cD4KKyAqIFRoaXMgQW5ub3VuY2UgY2xhc3MgaW1wbGVtZW50cyBhIHBlcmlvZGljIGFubm91bmNlIHJlcXVlc3QgdGhyZWFkIHRoYXQgd2lsbAorICogbm90aWZ5IGFubm91bmNlIHJlcXVlc3QgZXZlbnQgbGlzdGVuZXJzIGZvciBlYWNoIHRyYWNrZXIgcmVzcG9uc2UuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKiBAc2VlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZQorICovCitwdWJsaWMgY2xhc3MgQW5ub3VuY2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQW5ub3VuY2UuY2xhc3MpOworCisgIHByaXZhdGUgTGlzdDxQZWVyPiBteVBlZXJzOworICBwcml2YXRlIGZpbmFsIFRyYWNrZXJDbGllbnRGYWN0b3J5IG15VHJhY2tlckNsaWVudEZhY3Rvcnk7CisKKyAgLyoqCisgICAqIFRoZSB0aWVycyBvZiB0cmFja2VyIGNsaWVudHMgbWF0Y2hpbmcgdGhlIHRyYWNrZXIgVVJJcyBkZWZpbmVkIGluIHRoZQorICAgKiB0b3JyZW50LgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgVHJhY2tlckNsaWVudD4gY2xpZW50czsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKworICAvKioKKyAgICogQW5ub3VuY2UgdGhyZWFkIGFuZCBjb250cm9sLgorICAgKi8KKyAgcHJpdmF0ZSBUaHJlYWQgdGhyZWFkOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcDsKKyAgcHJpdmF0ZSBib29sZWFuIGZvcmNlU3RvcDsKKworICAvKioKKyAgICogQW5ub3VuY2UgaW50ZXJ2YWwuCisgICAqLworICBwcml2YXRlIGludCBteUFubm91bmNlSW50ZXJ2YWw7CisgIHByaXZhdGUgVHJhY2tlckNsaWVudCBteURlZmF1bHRUcmFja2VyOworCisgIC8qKgorICAgKiBJbml0aWFsaXplIHRoZSBiYXNlIGFubm91bmNlIGNsYXNzIG1lbWJlcnMgZm9yIHRoZSBhbm5vdW5jZXIuCisgICAqLworICBwdWJsaWMgQW5ub3VuY2UoQ29udGV4dCBjb250ZXh0LCBUcmFja2VyQ2xpZW50RmFjdG9yeSB0cmFja2VyQ2xpZW50RmFjdG9yeSkgeworICAgIHRoaXMuY2xpZW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFRyYWNrZXJDbGllbnQ+KCk7CisgICAgdGhpcy50aHJlYWQgPSBudWxsOworICAgIG15VHJhY2tlckNsaWVudEZhY3RvcnkgPSB0cmFja2VyQ2xpZW50RmFjdG9yeTsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICAgIG15UGVlcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UGVlcj4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZvcmNlQW5ub3VuY2UoQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCwgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGxpc3RlbmVyLCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCkgdGhyb3dzIFVua25vd25TZXJ2aWNlRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgVVJJIHRyYWNrZXJVcmwgPSBVUkkuY3JlYXRlKHRvcnJlbnQuZ2V0QW5ub3VuY2UoKSk7CisgICAgVHJhY2tlckNsaWVudCBjbGllbnQgPSB0aGlzLmNsaWVudHMuZ2V0KHRyYWNrZXJVcmwudG9TdHJpbmcoKSk7CisgICAgdHJ5IHsKKyAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkgeworICAgICAgICBjbGllbnQgPSBteVRyYWNrZXJDbGllbnRGYWN0b3J5LmNyZWF0ZVRyYWNrZXJDbGllbnQobXlQZWVycywgdHJhY2tlclVybCk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIHRoaXMuY2xpZW50cy5wdXQodHJhY2tlclVybC50b1N0cmluZygpLCBjbGllbnQpOworICAgICAgfQorICAgICAgY2xpZW50LmFubm91bmNlQWxsSW50ZXJmYWNlcyhldmVudCwgZmFsc2UsIHRvcnJlbnQpOworICAgIH0gY2F0Y2ggKEFubm91bmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBmb3JjZSBhbm5vdW5jZSB0b3JyZW50ICVzIG9uIHRyYWNrZXIgJXMuIiwgdG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCBTdHJpbmcudmFsdWVPZih0cmFja2VyVXJsKSkpOworICAgICAgbG9nZ2VyLmRlYnVnKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBmb3JjZSBhbm5vdW5jZSB0b3JyZW50ICVzIG9uIHRyYWNrZXIgJXMuIiwgdG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCBTdHJpbmcudmFsdWVPZih0cmFja2VyVXJsKSksIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTdGFydCB0aGUgYW5ub3VuY2UgcmVxdWVzdCB0aHJlYWQuCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBVUkkgZGVmYXVsdFRyYWNrZXJVUkksIGZpbmFsIEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciBsaXN0ZW5lciwgZmluYWwgUGVlcltdIHBlZXJzLCBmaW5hbCBpbnQgYW5ub3VuY2VJbnRlcnZhbCkgeworICAgIG15QW5ub3VuY2VJbnRlcnZhbCA9IGFubm91bmNlSW50ZXJ2YWw7CisgICAgbXlQZWVycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwZWVycykpOworICAgIGlmIChkZWZhdWx0VHJhY2tlclVSSSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBteURlZmF1bHRUcmFja2VyID0gbXlUcmFja2VyQ2xpZW50RmFjdG9yeS5jcmVhdGVUcmFja2VyQ2xpZW50KG15UGVlcnMsIGRlZmF1bHRUcmFja2VyVVJJKTsKKyAgICAgICAgbXlEZWZhdWx0VHJhY2tlci5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIHRoaXMuY2xpZW50cy5wdXQoZGVmYXVsdFRyYWNrZXJVUkkudG9TdHJpbmcoKSwgbXlEZWZhdWx0VHJhY2tlcik7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBteURlZmF1bHRUcmFja2VyID0gbnVsbDsKKyAgICB9CisKKyAgICB0aGlzLnN0b3AgPSBmYWxzZTsKKyAgICB0aGlzLmZvcmNlU3RvcCA9IGZhbHNlOworCisgICAgaWYgKHRoaXMudGhyZWFkID09IG51bGwgfHwgIXRoaXMudGhyZWFkLmlzQWxpdmUoKSkgeworICAgICAgdGhpcy50aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgICAgdGhpcy50aHJlYWQuc2V0TmFtZSgidG9ycmVudCB0cmFja2VyIGFubm91bmNlIHRocmVhZCIpOworICAgICAgdGhpcy50aHJlYWQuc3RhcnQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBhbm5vdW5jZSBpbnRlcnZhbC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEFubm91bmNlSW50ZXJ2YWwoaW50IGFubm91bmNlSW50ZXJ2YWwpIHsKKyAgICBpZiAoYW5ub3VuY2VJbnRlcnZhbCA8PSAwKSB7CisgICAgICB0aGlzLnN0b3AodHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRoaXMubXlBbm5vdW5jZUludGVydmFsID09IGFubm91bmNlSW50ZXJ2YWwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb2dnZXIudHJhY2UoIlNldHRpbmcgYW5ub3VuY2UgaW50ZXJ2YWwgdG8ge31zIHBlciB0cmFja2VyIHJlcXVlc3QuIiwKKyAgICAgICAgICAgIGFubm91bmNlSW50ZXJ2YWwpOworICAgIHRoaXMubXlBbm5vdW5jZUludGVydmFsID0gYW5ub3VuY2VJbnRlcnZhbDsKKyAgfQorCisgIC8qKgorICAgKiBTdG9wIHRoZSBhbm5vdW5jZSB0aHJlYWQuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIE9uZSBsYXN0ICdzdG9wcGVkJyBhbm5vdW5jZSBldmVudCBtaWdodCBiZSBzZW50IHRvIHRoZSB0cmFja2VyIHRvCisgICAqIGFubm91bmNlIHdlJ3JlIGdvaW5nIGF3YXksIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisKKyAgICB0aGlzLnN0b3AgPSB0cnVlOworCisgICAgaWYgKHRoaXMudGhyZWFkICE9IG51bGwgJiYgdGhpcy50aHJlYWQuaXNBbGl2ZSgpKSB7CisgICAgICB0aGlzLnRocmVhZC5pbnRlcnJ1cHQoKTsKKworICAgICAgZm9yIChUcmFja2VyQ2xpZW50IGNsaWVudCA6IHRoaXMuY2xpZW50cy52YWx1ZXMoKSkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy50aHJlYWQuam9pbigpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgLy8gSWdub3JlCisgICAgICB9CisgICAgfQorICAgIHRoaXMubXlQZWVycy5jbGVhcigpOworCisgICAgdGhpcy50aHJlYWQgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIE1haW4gYW5ub3VuY2UgbG9vcC4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVGhlIGFubm91bmNlIHRocmVhZCBzdGFydHMgYnkgbWFraW5nIHRoZSBpbml0aWFsICdzdGFydGVkJyBhbm5vdW5jZQorICAgKiByZXF1ZXN0IHRvIHJlZ2lzdGVyIG9uIHRoZSB0cmFja2VyIGFuZCBnZXQgdGhlIGFubm91bmNlIGludGVydmFsIHZhbHVlLgorICAgKiBTdWJzZXF1ZW50IGFubm91bmNlIHJlcXVlc3RzIGFyZSBvcmRpbmFyeSwgZXZlbnQtbGVzcywgcGVyaW9kaWMgcmVxdWVzdHMKKyAgICogZm9yIHBlZXJzLgorICAgKiA8L3A+CisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFVubGVzcyBmb3JjZWZ1bGx5IHN0b3BwZWQsIHRoZSBhbm5vdW5jZSB0aHJlYWQgd2lsbCB0ZXJtaW5hdGUgYnkgc2VuZGluZworICAgKiBhICdzdG9wcGVkJyBhbm5vdW5jZSByZXF1ZXN0IGJlZm9yZSBzdG9wcGluZy4KKyAgICogPC9wPgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgYW5ub3VuY2UgbG9vcC4uLiIpOworCisKKyAgICB3aGlsZSAoIXRoaXMuc3RvcCAmJiAhVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKworICAgICAgZmluYWwgTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gYW5ub3VuY2VhYmxlSW5mb3JtYXRpb25MaXN0ID0gbXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmFubm91bmNlYWJsZVRvcnJlbnRzKCk7CisgICAgICBsb2dnZXIuZGVidWcoIlN0YXJ0aW5nIGFubm91bmNlIGZvciB7fSB0b3JyZW50cyIsIGFubm91bmNlYWJsZUluZm9ybWF0aW9uTGlzdC5zaXplKCkpOworICAgICAgYW5ub3VuY2VBbGxUb3JyZW50cyhhbm5vdW5jZWFibGVJbmZvcm1hdGlvbkxpc3QsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50Lk5PTkUpOworICAgICAgdHJ5IHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHRoaXMubXlBbm5vdW5jZUludGVydmFsICogMTAwMCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhbm5vdW5jZUFsbFRvcnJlbnRzKG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hbm5vdW5jZWFibGVUb3JyZW50cygpLCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5TVE9QUEVEKTsKKworICAgIGxvZ2dlci5pbmZvKCJFeGl0ZWQgYW5ub3VuY2UgbG9vcC4iKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZWZhdWx0QW5ub3VuY2UoTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gdG9ycmVudHNGb3JBbm5vdW5jZSkgeworICAgIGZvciAoQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCA6IHRvcnJlbnRzRm9yQW5ub3VuY2UpIHsKKyAgICAgIGlmICh0aGlzLnN0b3AgfHwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBUcmFja2VyQ2xpZW50IHRyYWNrZXJDbGllbnQgPSB0aGlzLmdldEN1cnJlbnRUcmFja2VyQ2xpZW50KHRvcnJlbnQpOworICAgICAgICBpZiAodHJhY2tlckNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgdHJhY2tlckNsaWVudC5hbm5vdW5jZUFsbEludGVyZmFjZXMoQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuTk9ORSwgZmFsc2UsIHRvcnJlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvZ2dlci53YXJuKCJUcmFja2VyIGNsaWVudCBmb3Ige30gaXMgbnVsbC4gVG9ycmVudCBpcyBub3QgYW5ub3VuY2VkIG9uIHRyYWNrZXIiLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dnZXIuaW5mbyhlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGxvZ2dlci5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFubm91bmNlQWxsVG9ycmVudHMoTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gYW5ub3VuY2VhYmxlSW5mb3JtYXRpb25MaXN0LCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCkgeworCisgICAgbG9nZ2VyLmRlYnVnKCJTdGFydGVkIG11bHRpIGFubm91bmNlLiBFdmVudCB7fSwgdG9ycmVudHMge30iLCBldmVudCwgYW5ub3VuY2VhYmxlSW5mb3JtYXRpb25MaXN0KTsKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPj4gdG9ycmVudHNHcm91cGluZ0J5QW5ub3VuY2VVcmwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+PigpOworCisgICAgZm9yIChBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50IDogYW5ub3VuY2VhYmxlSW5mb3JtYXRpb25MaXN0KSB7CisgICAgICBmaW5hbCBVUkkgdXJpRm9yVG9ycmVudCA9IGdldFVSSUZvclRvcnJlbnQodG9ycmVudCk7CisgICAgICBpZiAodXJpRm9yVG9ycmVudCA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgIFN0cmluZyB0b3JyZW50VVJJID0gdXJpRm9yVG9ycmVudC50b1N0cmluZygpOworICAgICAgTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gc2hhcmVkVG9ycmVudHMgPSB0b3JyZW50c0dyb3VwaW5nQnlBbm5vdW5jZVVybC5nZXQodG9ycmVudFVSSSk7CisgICAgICBpZiAoc2hhcmVkVG9ycmVudHMgPT0gbnVsbCkgeworICAgICAgICBzaGFyZWRUb3JyZW50cyA9IG5ldyBBcnJheUxpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+KCk7CisgICAgICAgIHRvcnJlbnRzR3JvdXBpbmdCeUFubm91bmNlVXJsLnB1dCh0b3JyZW50VVJJLCBzaGFyZWRUb3JyZW50cyk7CisgICAgICB9CisgICAgICBzaGFyZWRUb3JyZW50cy5hZGQodG9ycmVudCk7CisgICAgfQorCisgICAgTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gdW5hbm5vdW5jZWRUb3JyZW50cyA9IG5ldyBBcnJheUxpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+KCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPj4gZSA6IHRvcnJlbnRzR3JvdXBpbmdCeUFubm91bmNlVXJsLmVudHJ5U2V0KCkpIHsKKyAgICAgIFRyYWNrZXJDbGllbnQgdHJhY2tlckNsaWVudCA9IHRoaXMuY2xpZW50cy5nZXQoZS5nZXRLZXkoKSk7CisgICAgICBpZiAodHJhY2tlckNsaWVudCAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHJhY2tlckNsaWVudC5tdWx0aUFubm91bmNlKGV2ZW50LCBmYWxzZSwgZS5nZXRWYWx1ZSgpLCBteVBlZXJzKTsKKyAgICAgICAgfSBjYXRjaCAoQW5ub3VuY2VFeGNlcHRpb24gdCkgeworICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAicHJvYmxlbSBpbiBtdWx0aSBhbm5vdW5jZSB7fSIsIHQuZ2V0TWVzc2FnZSgpLCB0KTsKKyAgICAgICAgICB1bmFubm91bmNlZFRvcnJlbnRzLmFkZEFsbChlLmdldFZhbHVlKCkpOworICAgICAgICB9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICBMb2dnZXJVdGlscy53YXJuV2l0aE1lc3NhZ2VBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHRyYWNrZXIge30iLCBlLmdldEtleSgpLCB0KTsKKyAgICAgICAgICBsb2dnZXIuZGVidWcoIm5leHQgdG9ycmVudHMgY29udGFpbiB7fSBpbiB0cmFja2VyIGxpc3QuIHt9IiwgZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nZ2VyLndhcm4oIlRyYWNrZXIgY2xpZW50IGZvciB7fSBpcyBudWxsLiBUb3JyZW50cyBhcmUgbm90IGFubm91bmNlZCBvbiB0cmFja2VyIiwgZS5nZXRLZXkoKSk7CisgICAgICAgIGlmIChlLmdldEtleSgpID09IG51bGwgfHwgZS5nZXRLZXkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBmb3IgKEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGFubm91bmNlYWJsZUluZm9ybWF0aW9uIDogZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICBteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkucmVtb3ZlKGFubm91bmNlYWJsZUluZm9ybWF0aW9uLmdldEhleEluZm9IYXNoKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAodW5hbm5vdW5jZWRUb3JyZW50cy5zaXplKCkgPiAwKSB7CisgICAgICBkZWZhdWx0QW5ub3VuY2UodW5hbm5vdW5jZWRUb3JyZW50cyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdHJhY2tlciBjbGllbnQgdXNlZCBmb3IgYW5ub3VuY2VzLgorICAgKi8KKyAgcHVibGljIFRyYWNrZXJDbGllbnQgZ2V0Q3VycmVudFRyYWNrZXJDbGllbnQoQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCkgeworICAgIGZpbmFsIFVSSSB1cmkgPSBnZXRVUklGb3JUb3JyZW50KHRvcnJlbnQpOworICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgcmV0dXJuIHRoaXMuY2xpZW50cy5nZXQodXJpLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBVUkkgZ2V0VVJJRm9yVG9ycmVudChBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50KSB7CisgICAgTGlzdDxMaXN0PFN0cmluZz4+IGFubm91bmNlTGlzdCA9IHRvcnJlbnQuZ2V0QW5ub3VuY2VMaXN0KCk7CisgICAgaWYgKGFubm91bmNlTGlzdC5zaXplKCkgPT0gMCkgcmV0dXJuIG51bGw7CisgICAgTGlzdDxTdHJpbmc+IHVyaXMgPSBhbm5vdW5jZUxpc3QuZ2V0KDApOworICAgIGlmICh1cmlzLnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gVVJJLmNyZWF0ZSh1cmlzLmdldCgwKSk7CisgIH0KKworICBwdWJsaWMgVVJJIGdldERlZmF1bHRUcmFja2VyVVJJKCkgeworICAgIGlmIChteURlZmF1bHRUcmFja2VyID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gbXlEZWZhdWx0VHJhY2tlci5nZXRUcmFja2VyVVJJKCk7CisgIH0KKworICAvKioKKyAgICogU3RvcCB0aGUgYW5ub3VuY2UgdGhyZWFkLgorICAgKgorICAgKiBAcGFyYW0gaGFyZCBXaGV0aGVyIHRvIGZvcmNlIHN0b3AgdGhlIGFubm91bmNlIHRocmVhZCBvciBub3QsIGkuZS4gbm90CisgICAqICAgICAgICAgICAgIHNlbmQgdGhlIGZpbmFsICdzdG9wcGVkJyBhbm5vdW5jZSByZXF1ZXN0IG9yIG5vdC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBzdG9wKGJvb2xlYW4gaGFyZCkgeworICAgIHRoaXMuZm9yY2VTdG9wID0gaGFyZDsKKyAgICB0aGlzLnN0b3AoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZUV4Y2VwdGlvbi5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjg3N2YKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYW4gYW5ub3VuY2UgcmVxdWVzdCBmYWlsZWQuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdW5jZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE7CisKKyAgcHVibGljIEFubm91bmNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgQW5ub3VuY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9CisKKyAgcHVibGljIEFubm91bmNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlUmVzcG9uc2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODNjYmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlUmVzcG9uc2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCisvKioKKyAqIEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgd2FudCB0byByZWNlaXZlIHRyYWNrZXIgcmVzcG9uc2VzLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisgIC8qKgorICAgKiBIYW5kbGUgYW4gYW5ub3VuY2UgcmVzcG9uc2UgZXZlbnQuCisgICAqCisgICAqIEBwYXJhbSBpbnRlcnZhbCAgIFRoZSBhbm5vdW5jZSBpbnRlcnZhbCByZXF1ZXN0ZWQgYnkgdGhlIHRyYWNrZXIuCisgICAqIEBwYXJhbSBjb21wbGV0ZSAgIFRoZSBudW1iZXIgb2Ygc2VlZGVycyBvbiB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBpbmNvbXBsZXRlIFRoZSBudW1iZXIgb2YgbGVlY2hlcnMgb24gdGhpcyB0b3JyZW50LgorICAgKi8KKyAgdm9pZCBoYW5kbGVBbm5vdW5jZVJlc3BvbnNlKGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgU3RyaW5nIGhleEluZm9IYXNoKTsKKworICAvKioKKyAgICogSGFuZGxlIHRoZSBkaXNjb3Zlcnkgb2YgbmV3IHBlZXJzLgorICAgKgorICAgKiBAcGFyYW0gcGVlcnMgVGhlIGxpc3Qgb2YgcGVlcnMgZGlzY292ZXJlZCAoZnJvbSB0aGUgYW5ub3VuY2UgcmVzcG9uc2Ugb3IKKyAgICogICAgICAgICAgICAgIGFueSBvdGhlciBtZWFucyBsaWtlIERIVC9QRVgsIGV0Yy4pLgorICAgKi8KKyAgdm9pZCBoYW5kbGVEaXNjb3ZlcmVkUGVlcnMoTGlzdDxQZWVyPiBwZWVycywgU3RyaW5nIGhleEluZm9IYXNoKTsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvSFRUUFRyYWNrZXJDbGllbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvSFRUUFRyYWNrZXJDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9IVFRQVHJhY2tlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkRlY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLk1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cC5IVFRQVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFubm91bmNlciBmb3IgSFRUUCB0cmFja2Vycy4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3dpa2kudGhlb3J5Lm9yZy9CaXRUb3JyZW50U3BlY2lmaWNhdGlvbiNUcmFja2VyX1JlcXVlc3RfUGFyYW1ldGVycyI+Qml0VG9ycmVudCB0cmFja2VyIHJlcXVlc3Qgc3BlY2lmaWNhdGlvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIEhUVFBUcmFja2VyQ2xpZW50IGV4dGVuZHMgVHJhY2tlckNsaWVudCB7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSFRUUFRyYWNrZXJDbGllbnQuY2xhc3MpOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBhbm5vdW5jZXIgZm9yIHRoZSBnaXZlbiB0b3JyZW50LgorICAgKgorICAgKiBAcGFyYW0gcGVlcnMgT3VyIG93biBwZWVyIHNwZWNpZmljYXRpb24uCisgICAqLworICBwdWJsaWMgSFRUUFRyYWNrZXJDbGllbnQoTGlzdDxQZWVyPiBwZWVycywgVVJJIHRyYWNrZXIpIHsKKyAgICBzdXBlcihwZWVycywgdHJhY2tlcik7CisgIH0KKworICAvKioKKyAgICogQnVpbGQsIHNlbmQgYW5kIHByb2Nlc3MgYSB0cmFja2VyIGFubm91bmNlIHJlcXVlc3QuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGJ1aWxkcyBhbiBhbm5vdW5jZSByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50CisgICAqIHdpdGggYWxsIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLiBUaGVuLCB0aGUgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZQorICAgKiB0cmFja2VyIGFuZCB0aGUgcmVzcG9uc2UgYW5hbHl6ZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIEFsbCByZWdpc3RlcmVkIHtAbGluayBBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXJ9IG9iamVjdHMgYXJlIHRoZW4gZmlyZWQKKyAgICogd2l0aCB0aGUgZGVjb2RlZCBwYXlsb2FkLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBldmVudCAgICAgICAgIFRoZSBhbm5vdW5jZSBldmVudCB0eXBlIChjYW4gYmUgQW5ub3VuY2VFdmVudC5OT05FIGZvcgorICAgKiAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpYyB1cGRhdGVzKS4KKyAgICogQHBhcmFtIGluaGliaXRFdmVudHMgUHJldmVudCBldmVudCBsaXN0ZW5lcnMgZnJvbSBiZWluZyBub3RpZmllZC4KKyAgICogQHBhcmFtIHRvcnJlbnRJbmZvCisgICAqLworICBwdWJsaWMgdm9pZCBhbm5vdW5jZShmaW5hbCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnRzLCBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50SW5mbywgZmluYWwgTGlzdDxQZWVyPiBhZHJlc3NlcykgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICBsb2dBbm5vdW5jZVJlcXVlc3QoZXZlbnQsIHRvcnJlbnRJbmZvKTsKKworICAgIGZpbmFsIExpc3Q8SFRUUFRyYWNrZXJNZXNzYWdlPiB0cmFja2VyUmVzcG9uc2VzID0gbmV3IEFycmF5TGlzdDxIVFRQVHJhY2tlck1lc3NhZ2U+KCk7CisgICAgZm9yIChmaW5hbCBQZWVyIGFkZHJlc3MgOiBhZHJlc3NlcykgeworICAgICAgZmluYWwgVVJMIHRhcmdldCA9IGVuY29kZUFubm91bmNlVG9VUkwoZXZlbnQsIHRvcnJlbnRJbmZvLCBhZGRyZXNzKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHNlbmRBbm5vdW5jZSh0YXJnZXQsICJHRVQiLCBuZXcgUmVzcG9uc2VQYXJzZXIoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCByZXNwb25zZUNvZGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSAyMDApIHsKKyAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInJlY2VpdmVkIG5vdCBodHRwIDIwMCBjb2RlIGZyb20gdHJhY2tlciBmb3IgcmVxdWVzdCAiICsgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2tlclJlc3BvbnNlcy5hZGQoSFRUUFRyYWNrZXJNZXNzYWdlLnBhcnNlKGlucHV0U3RyZWFtKSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0gY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgfQorICAgIH0KKyAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgZmlyc3QgcmVxdWVzdDoKKyAgICBpZiAodHJhY2tlclJlc3BvbnNlcy5zaXplKCkgPiAwKSB7CisgICAgICBmaW5hbCBIVFRQVHJhY2tlck1lc3NhZ2UgbWVzc2FnZSA9IHRyYWNrZXJSZXNwb25zZXMuZ2V0KDApOworICAgICAgdGhpcy5oYW5kbGVUcmFja2VyQW5ub3VuY2VSZXNwb25zZShtZXNzYWdlLCBpbmhpYml0RXZlbnRzLCB0b3JyZW50SW5mby5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgbXVsdGlBbm5vdW5jZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gdG9ycmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQZWVyPiBhZGRyZXNzZXMpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiB7CisgICAgTGlzdDxMaXN0PEhUVFBUcmFja2VyTWVzc2FnZT4+IHRyYWNrZXJSZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PExpc3Q8SFRUUFRyYWNrZXJNZXNzYWdlPj4oKTsKKworICAgIFVSTCB0cmFja2VyVXJsOworICAgIHRyeSB7CisgICAgICB0cmFja2VyVXJsID0gdGhpcy50cmFja2VyLnRvVVJMKCk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiSW52YWxpZCB0cmFja2VyIFVSTCAiICsgdGhpcy50cmFja2VyLCBlKTsKKyAgICB9CisKKyAgICBmb3IgKGZpbmFsIFBlZXIgYWRkcmVzcyA6IGFkZHJlc3NlcykgeworICAgICAgU3RyaW5nQnVpbGRlciBib2R5ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudEluZm8gOiB0b3JyZW50cykgeworICAgICAgICBib2R5LmFwcGVuZChlbmNvZGVBbm5vdW5jZVRvVVJMKGV2ZW50LCB0b3JyZW50SW5mbywgYWRkcmVzcykpLmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIExpc3Q8SFRUUFRyYWNrZXJNZXNzYWdlPiByZXNwb25zZXNGb3JDdXJyZW50SXAgPSBuZXcgQXJyYXlMaXN0PEhUVFBUcmFja2VyTWVzc2FnZT4oKTsKKyAgICAgIGZpbmFsIFN0cmluZyBib2R5U3RyID0gYm9keS5zdWJzdHJpbmcoMCwgYm9keS5sZW5ndGgoKSAtIDEpOworICAgICAgc2VuZEFubm91bmNlKHRyYWNrZXJVcmwsIGJvZHlTdHIsICJQT1NUIiwgbmV3IFJlc3BvbnNlUGFyc2VyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCByZXNwb25zZUNvZGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSAyMDApIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJyZWNlaXZlZCB7fSBjb2RlIGZyb20gdHJhY2tlciBmb3IgbXVsdGkgYW5ub3VuY2UgcmVxdWVzdC4iLCByZXNwb25zZUNvZGUpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGJvZHlTdHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGZpbmFsIEJFVmFsdWUgYmRlY29kZSA9IEJEZWNvZGVyLmJkZWNvZGUoaW5wdXRTdHJlYW0pOworICAgICAgICAgIGlmIChiZGVjb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ0cmFja2VyIHNlbnQgYmFkIHJlc3BvbnNlIGZvciBtdWx0aSBhbm5vdW5jZSBtZXNzYWdlLiIpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGJvZHlTdHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbCBMaXN0PEJFVmFsdWU+IGxpc3QgPSBiZGVjb2RlLmdldExpc3QoKTsKKyAgICAgICAgICBmb3IgKEJFVmFsdWUgdmFsdWUgOiBsaXN0KSB7CisgICAgICAgICAgICByZXNwb25zZXNGb3JDdXJyZW50SXAuYWRkKEhUVFBUcmFja2VyTWVzc2FnZS5wYXJzZSh2YWx1ZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBpZiAoIXJlc3BvbnNlc0ZvckN1cnJlbnRJcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdHJhY2tlclJlc3BvbnNlcy5hZGQocmVzcG9uc2VzRm9yQ3VycmVudElwKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gd2UgcHJvY2VzcyBvbmx5IGZpcnN0IHJlcXVlc3Q6CisgICAgaWYgKHRyYWNrZXJSZXNwb25zZXMuc2l6ZSgpID4gMCkgeworICAgICAgZmluYWwgTGlzdDxIVFRQVHJhY2tlck1lc3NhZ2U+IG1lc3NhZ2VzID0gdHJhY2tlclJlc3BvbnNlcy5nZXQoMCk7CisgICAgICBmb3IgKEhUVFBUcmFja2VyTWVzc2FnZSBtZXNzYWdlIDogbWVzc2FnZXMpIHsKKworICAgICAgICBpZiAoIShtZXNzYWdlIGluc3RhbmNlb2YgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKSkgeworICAgICAgICAgIGxvZ2dlci5pbmZvKCJJbmNvcnJlY3QgaW5zdGFuY2Ugb2YgbWVzc2FnZSB7fS4gU2tpcHBpbmcuLi4iLCBtZXNzYWdlKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCA9ICgoSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKSBtZXNzYWdlKS5nZXRIZXhJbmZvSGFzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHRoaXMuaGFuZGxlVHJhY2tlckFubm91bmNlUmVzcG9uc2UobWVzc2FnZSwgaW5oaWJpdEV2ZW50LCBoZXhJbmZvSGFzaCk7CisgICAgICAgIH0gY2F0Y2ggKEFubm91bmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJVbmFibGUgdG8gcHJvY2VzcyB0cmFja2VyIHJlc3BvbnNlIHt9IiwgbWVzc2FnZSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFVSTCBlbmNvZGVBbm5vdW5jZVRvVVJMKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50SW5mbywgUGVlciBwZWVyKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIFVSTCByZXN1bHQ7CisgICAgdHJ5IHsKKyAgICAgIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHJlcXVlc3QgPSB0aGlzLmJ1aWxkQW5ub3VuY2VSZXF1ZXN0KGV2ZW50LCB0b3JyZW50SW5mbywgcGVlcik7CisgICAgICByZXN1bHQgPSByZXF1ZXN0LmJ1aWxkQW5ub3VuY2VVUkwodGhpcy50cmFja2VyLnRvVVJMKCkpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiSW52YWxpZCBhbm5vdW5jZSBVUkwgKCIgKworICAgICAgICAgICAgICBtdWUuZ2V0TWVzc2FnZSgpICsgIikiLCBtdWUpOworICAgIH0gY2F0Y2ggKE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIG12ZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJBbm5vdW5jZSByZXF1ZXN0IGNyZWF0aW9uIHZpb2xhdGVkICIgKworICAgICAgICAgICAgICAiZXhwZWN0ZWQgcHJvdG9jb2wgKCIgKyBtdmUuZ2V0TWVzc2FnZSgpICsgIikiLCBtdmUpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJFcnJvciBidWlsZGluZyBhbm5vdW5jZSByZXF1ZXN0ICgiICsKKyAgICAgICAgICAgICAgaW9lLmdldE1lc3NhZ2UoKSArICIpIiwgaW9lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kQW5ub3VuY2UoZmluYWwgVVJMIHVybCwgZmluYWwgU3RyaW5nIG1ldGhvZCwgUmVzcG9uc2VQYXJzZXIgcGFyc2VyKQorICAgICAgICAgIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiB7CisgICAgc2VuZEFubm91bmNlKHVybCwgIiIsIG1ldGhvZCwgcGFyc2VyKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kQW5ub3VuY2UoZmluYWwgVVJMIHVybCwgZmluYWwgU3RyaW5nIGJvZHksIGZpbmFsIFN0cmluZyBtZXRob2QsIFJlc3BvbnNlUGFyc2VyIHBhcnNlcikKKyAgICAgICAgICB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24geworICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbikgb3BlbkNvbm5lY3Rpb25DaGVja1JlZGlyZWN0cyh1cmwsIGJvZHksIG1ldGhvZCk7CisgICAgICBpbiA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgaW4gPSBjb25uLmdldEVycm9yU3RyZWFtKCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCBpZiB0aGUgaW5wdXQgc3RyZWFtIGlzIG51bGwgaXQgbWVhbnMgd2UgaGF2ZSBuZWl0aGVyIGEKKyAgICAvLyByZXNwb25zZSBib2R5IG5vciBhbiBlcnJvciBzdHJlYW0gZnJvbSB0aGUgc2VydmVyLiBObyBwb2ludCBpbiBnb2luZworICAgIC8vIGFueSBmdXJ0aGVyLgorICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQ29ubmVjdEV4Y2VwdGlvbigiTm8gcmVzcG9uc2Ugb3IgdW5yZWFjaGFibGUgdHJhY2tlciEiKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcGFyc2VyLnBhcnNlKGluLCBjb25uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyB0cmFja2VyIHJlc3BvbnNlISIsIGlvZSk7CisgICAgfSBjYXRjaCAoTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24gbXZlKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIlRyYWNrZXIgbWVzc2FnZSB2aW9sYXRlcyBleHBlY3RlZCAiICsKKyAgICAgICAgICAgICAgInByb3RvY29sICgiICsgbXZlLmdldE1lc3NhZ2UoKSArICIpIiwgbXZlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsb3NlIGV2ZXJ5dGhpbmcgZG93biBhdCB0aGUgZW5kIHRvIGF2b2lkIHJlc291cmNlCisgICAgICAvLyBsZWFrcy4KKyAgICAgIHRyeSB7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlByb2JsZW0gZW5zdXJpbmcgZXJyb3Igc3RyZWFtIGNsb3NlZCEiKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJQcm9ibGVtIGVuc3VyaW5nIGVycm9yIHN0cmVhbSBjbG9zZWQhIiwgaW9lKTsKKyAgICAgIH0KKworICAgICAgLy8gVGhpcyBtZWFucyB0cnlpbmcgdG8gY2xvc2UgdGhlIGVycm9yIHN0cmVhbSBhcyB3ZWxsLgorICAgICAgSW5wdXRTdHJlYW0gZXJyID0gY29ubi5nZXRFcnJvclN0cmVhbSgpOworICAgICAgaWYgKGVyciAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZXJyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgIGxvZ2dlci5pbmZvKCJQcm9ibGVtIGVuc3VyaW5nIGVycm9yIHN0cmVhbSBjbG9zZWQhIik7CisgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJQcm9ibGVtIGVuc3VyaW5nIGVycm9yIHN0cmVhbSBjbG9zZWQhIiwgaW9lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbkNoZWNrUmVkaXJlY3RzKFVSTCB1cmwsIFN0cmluZyBib2R5LCBTdHJpbmcgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJvb2xlYW4gbmVlZFJlZGlyZWN0OworICAgIGludCByZWRpcmVjdHMgPSAwOworICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgIGJvb2xlYW4gZmlyc3RJdGVyYXRpb24gPSB0cnVlOworICAgIGRvIHsKKyAgICAgIG5lZWRSZWRpcmVjdCA9IGZhbHNlOworICAgICAgY29ubmVjdGlvbi5zZXRDb25uZWN0VGltZW91dCgxMDAwMCk7CisgICAgICBjb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KDEwMDAwKTsKKyAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHAgPSBudWxsOworICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgeworICAgICAgICBodHRwID0gKEh0dHBVUkxDb25uZWN0aW9uKSBjb25uZWN0aW9uOworICAgICAgICBodHRwLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIGlmIChodHRwICE9IG51bGwpIHsKKworICAgICAgICBpZiAoZmlyc3RJdGVyYXRpb24pIHsKKyAgICAgICAgICBmaXJzdEl0ZXJhdGlvbiA9IGZhbHNlOworICAgICAgICAgIGh0dHAuc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCIpOworICAgICAgICAgIGh0dHAuc2V0UmVxdWVzdE1ldGhvZChtZXRob2QpOworICAgICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKGJvZHkuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBzdGF0ID0gaHR0cC5nZXRSZXNwb25zZUNvZGUoKTsKKyAgICAgICAgaWYgKHN0YXQgPj0gMzAwICYmIHN0YXQgPD0gMzA3ICYmIHN0YXQgIT0gMzA2ICYmCisgICAgICAgICAgICAgICAgc3RhdCAhPSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PVF9NT0RJRklFRCkgeworICAgICAgICAgIFVSTCBiYXNlID0gaHR0cC5nZXRVUkwoKTsKKyAgICAgICAgICBTdHJpbmcgbmV3TG9jYXRpb24gPSBodHRwLmdldEhlYWRlckZpZWxkKCJMb2NhdGlvbiIpOworICAgICAgICAgIFVSTCB0YXJnZXQgPSBuZXdMb2NhdGlvbiA9PSBudWxsID8gbnVsbCA6IG5ldyBVUkwoYmFzZSwgbmV3TG9jYXRpb24pOworICAgICAgICAgIGh0dHAuZGlzY29ubmVjdCgpOworICAgICAgICAgIC8vIFJlZGlyZWN0aW9uIHNob3VsZCBiZSBhbGxvd2VkIG9ubHkgZm9yIEhUVFAgYW5kIEhUVFBTCisgICAgICAgICAgLy8gYW5kIHNob3VsZCBiZSBsaW1pdGVkIHRvIDUgcmVkaXJlY3Rpb25zIGF0IG1vc3QuCisgICAgICAgICAgaWYgKHJlZGlyZWN0cyA+PSA1KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRvbyBtYW55IHJlZGlyZWN0cyIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgISh0YXJnZXQuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImh0dHAiKQorICAgICAgICAgICAgICAgICAgfHwgdGFyZ2V0LmdldFByb3RvY29sKCkuZXF1YWxzKCJodHRwcyIpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJpbGxlZ2FsIFVSTCByZWRpcmVjdCBvciBwcm90b2NvbCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBuZWVkUmVkaXJlY3QgPSB0cnVlOworICAgICAgICAgIGNvbm5lY3Rpb24gPSB0YXJnZXQub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICByZWRpcmVjdHMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAobmVlZFJlZGlyZWN0KTsKKyAgICByZXR1cm4gY29ubmVjdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZCB0aGUgYW5ub3VuY2UgcmVxdWVzdCB0cmFja2VyIG1lc3NhZ2UuCisgICAqCisgICAqIEBwYXJhbSBldmVudCBUaGUgYW5ub3VuY2UgZXZlbnQgKGNhbiBiZSA8dHQ+Tk9ORTwvdHQ+IG9yIDxlbT5udWxsPC9lbT4pCisgICAqIEByZXR1cm4gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIHtAbGluayBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZX0KKyAgICogdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGFubm91bmNlIFVSTCwgd2l0aAorICAgKiBwYXJhbWV0ZXJzLCB0byBtYWtlIHRoZSBhbm5vdW5jZSByZXF1ZXN0LgorICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uCisgICAqLworICBwcml2YXRlIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGJ1aWxkQW5ub3VuY2VSZXF1ZXN0KAorICAgICAgICAgIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50SW5mbywgUGVlciBwZWVyKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgLy8gQnVpbGQgYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlCisgICAgZmluYWwgbG9uZyB1cGxvYWRlZCA9IHRvcnJlbnRJbmZvLmdldFVwbG9hZGVkKCk7CisgICAgZmluYWwgbG9uZyBkb3dubG9hZGVkID0gdG9ycmVudEluZm8uZ2V0RG93bmxvYWRlZCgpOworICAgIGZpbmFsIGxvbmcgbGVmdCA9IHRvcnJlbnRJbmZvLmdldExlZnQoKTsKKyAgICByZXR1cm4gSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuY3JhZnQoCisgICAgICAgICAgICB0b3JyZW50SW5mby5nZXRJbmZvSGFzaCgpLAorICAgICAgICAgICAgcGVlci5nZXRQZWVySWRBcnJheSgpLAorICAgICAgICAgICAgcGVlci5nZXRQb3J0KCksCisgICAgICAgICAgICB1cGxvYWRlZCwKKyAgICAgICAgICAgIGRvd25sb2FkZWQsCisgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGV2ZW50LAorICAgICAgICAgICAgcGVlci5nZXRJcCgpLAorICAgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5ERUZBVUxUX05VTV9XQU5UKTsKKyAgfQorCisgIHByaXZhdGUgaW50ZXJmYWNlIFJlc3BvbnNlUGFyc2VyIHsKKworICAgIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCByZXNwb25zZUNvZGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb247CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWRkZjYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlc3BvbnNlTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLkVycm9yTWVzc2FnZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhY2tlckNsaWVudCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNrZXJDbGllbnQuY2xhc3MpOworCisKKyAgLyoqCisgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGFubm91bmNlIHJlcXVlc3QgYW5zd2Vycy4KKyAgICovCisgIHByaXZhdGUgZmluYWwgU2V0PEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lcj4gbGlzdGVuZXJzOworCisgIHByb3RlY3RlZCBmaW5hbCBMaXN0PFBlZXI+IG15QWRkcmVzczsKKyAgcHJvdGVjdGVkIGZpbmFsIFVSSSB0cmFja2VyOworCisgIHB1YmxpYyBUcmFja2VyQ2xpZW50KGZpbmFsIExpc3Q8UGVlcj4gcGVlcnMsIGZpbmFsIFVSSSB0cmFja2VyKSB7CisgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgSGFzaFNldDxBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXI+KCk7CisgICAgbXlBZGRyZXNzID0gcGVlcnM7CisgICAgdGhpcy50cmFja2VyID0gdHJhY2tlcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWdpc3RlciBhIG5ldyBhbm5vdW5jZSByZXNwb25zZSBsaXN0ZW5lci4KKyAgICoKKyAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZWdpc3RlciBvbiB0aGlzIGFubm91bmNlciBldmVudHMuCisgICAqLworICBwdWJsaWMgdm9pZCByZWdpc3RlcihBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIFVSSSB0aGlzIHRyYWNrZXIgY2xpZW50cyBjb25uZWN0cyB0by4KKyAgICovCisgIHB1YmxpYyBVUkkgZ2V0VHJhY2tlclVSSSgpIHsKKyAgICByZXR1cm4gdGhpcy50cmFja2VyOworICB9CisKKyAgcHVibGljIHZvaWQgYW5ub3VuY2VBbGxJbnRlcmZhY2VzKGZpbmFsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnQsIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnQpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGFubm91bmNlKGV2ZW50LCBpbmhpYml0RXZlbnQsIHRvcnJlbnQsIG15QWRkcmVzcyk7CisgICAgfSBjYXRjaCAoQW5ub3VuY2VFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuYWJsZSB0byBhbm5vdW5jZSB0cmFja2VyICVzIGV2ZW50ICVzIGZvciB0b3JyZW50ICVzIGFuZCBwZWVycyAlcy4gUmVhc29uICVzIiwKKyAgICAgICAgICAgICAgZ2V0VHJhY2tlclVSSSgpLCBldmVudC5nZXRFdmVudE5hbWUoKSwgdG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCBBcnJheXMudG9TdHJpbmcobXlBZGRyZXNzLnRvQXJyYXkoKSksIGUuZ2V0TWVzc2FnZSgpKSwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEJ1aWxkLCBzZW5kIGFuZCBwcm9jZXNzIGEgdHJhY2tlciBhbm5vdW5jZSByZXF1ZXN0LgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBidWlsZHMgYW4gYW5ub3VuY2UgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCBldmVudAorICAgKiB3aXRoIGFsbCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy4gVGhlbiwgdGhlIHJlcXVlc3QgaXMgbWFkZSB0byB0aGUKKyAgICogdHJhY2tlciBhbmQgdGhlIHJlc3BvbnNlIGFuYWx5emVkLgorICAgKiA8L3A+CisgICAqCisgICAqIDxwPgorICAgKiBBbGwgcmVnaXN0ZXJlZCB7QGxpbmsgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyfSBvYmplY3RzIGFyZSB0aGVuIGZpcmVkCisgICAqIHdpdGggdGhlIGRlY29kZWQgcGF5bG9hZC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gZXZlbnQgICAgICAgIFRoZSBhbm5vdW5jZSBldmVudCB0eXBlIChjYW4gYmUgQW5ub3VuY2VFdmVudC5OT05FIGZvcgorICAgKiAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljIHVwZGF0ZXMpLgorICAgKiBAcGFyYW0gaW5oaWJpdEV2ZW50IFByZXZlbnQgZXZlbnQgbGlzdGVuZXJzIGZyb20gYmVpbmcgbm90aWZpZWQuCisgICAqIEBwYXJhbSB0b3JyZW50CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhbm5vdW5jZShmaW5hbCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnQsIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnQsIGZpbmFsIExpc3Q8UGVlcj4gcGVlcikgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uOworCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG11bHRpQW5ub3VuY2UoZmluYWwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+IHRvcnJlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UGVlcj4gcGVlcikgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uOworCisgIHByb3RlY3RlZCB2b2lkIGxvZ0Fubm91bmNlUmVxdWVzdChBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCkgeworICAgIGlmIChldmVudCAhPSBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5OT05FKSB7CisgICAgICBsb2dnZXIuZGVidWcoIkFubm91bmNpbmcge30gdG8gdHJhY2tlciB3aXRoIHt9VS97fUQve31MIGJ5dGVzLi4uIiwKKyAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0QW5ub3VuY2VFdmVudChldmVudCksCisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXRVcGxvYWRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0RG93bmxvYWRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0TGVmdCgpCisgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBsb2dnZXIuZGVidWcoIlNpbXBseSBhbm5vdW5jaW5nIHRvIHRyYWNrZXIgd2l0aCB7fVUve31EL3t9TCBieXRlcy4uLiIsCisgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldFVwbG9hZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXREb3dubG9hZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXRMZWZ0KCkKKyAgICAgICAgICAgICAgfSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENsb3NlIGFueSBvcGVuZWQgYW5ub3VuY2UgY29ubmVjdGlvbi4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBtYWtlIHN1cmUgYWxsIGNvbm5lY3Rpb25zCisgICAqIGFyZSBjb3JyZWN0bHkgY2xvc2VkIHdoZW4gdGhlIGFubm91bmNlIHRocmVhZCBpcyBhc2tlZCB0byBzdG9wLgorICAgKiA8L3A+CisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgb3ZlcmxvYWRlZC4KKyAgfQorCisgIC8qKgorICAgKiBGb3JtYXRzIGFuIGFubm91bmNlIGV2ZW50IGludG8gYSB1c2FibGUgc3RyaW5nLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRBbm5vdW5jZUV2ZW50KAorICAgICAgICAgIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50KSB7CisgICAgcmV0dXJuIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50Lk5PTkUuZXF1YWxzKGV2ZW50KQorICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgOiBTdHJpbmcuZm9ybWF0KCIgJXMiLCBldmVudC5uYW1lKCkpOworICB9CisKKyAgLyoqCisgICAqIEhhbmRsZSB0aGUgYW5ub3VuY2UgcmVzcG9uc2UgZnJvbSB0aGUgdHJhY2tlci4KKyAgICoKKyAgICogPHA+CisgICAqIEFuYWx5emVzIHRoZSByZXNwb25zZSBmcm9tIHRoZSB0cmFja2VyIGFuZCBhY3RzIG9uIGl0LiBJZiB0aGUgcmVzcG9uc2UKKyAgICogaXMgYW4gZXJyb3IsIGl0IGlzIGxvZ2dlZC4gT3RoZXJ3aXNlLCB0aGUgYW5ub3VuY2UgcmVzcG9uc2UgaXMgdXNlZAorICAgKiB0byBmaXJlIHRoZSBjb3JyZXNwb25kaW5nIGFubm91bmNlIGFuZCBwZWVyIGV2ZW50cyB0byBhbGwgYW5ub3VuY2UKKyAgICogbGlzdGVuZXJzLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlICAgICAgIFRoZSBpbmNvbWluZyB7QGxpbmsgVHJhY2tlck1lc3NhZ2V9LgorICAgKiBAcGFyYW0gaW5oaWJpdEV2ZW50cyBXaGV0aGVyIG9yIG5vdCB0byBwcmV2ZW50IGV2ZW50cyBmcm9tIGJlaW5nIGZpcmVkLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVHJhY2tlckFubm91bmNlUmVzcG9uc2UoVHJhY2tlck1lc3NhZ2UgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnRzLCBTdHJpbmcgaGV4SW5mb0hhc2gpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiB7CisgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvck1lc3NhZ2UpIHsKKyAgICAgIEVycm9yTWVzc2FnZSBlcnJvciA9IChFcnJvck1lc3NhZ2UpIG1lc3NhZ2U7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oZXJyb3IuZ2V0UmVhc29uKCkpOworICAgIH0KKworICAgIGlmICghKG1lc3NhZ2UgaW5zdGFuY2VvZiBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSkpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB0cmFja2VyIG1lc3NhZ2UgdHlwZSAiICsKKyAgICAgICAgICAgICAgbWVzc2FnZS5nZXRUeXBlKCkubmFtZSgpICsgIiEiKTsKKyAgICB9CisKKworICAgIEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0KKyAgICAgICAgICAgIChBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSkgbWVzc2FnZTsKKworICAgIHRoaXMuZmlyZUFubm91bmNlUmVzcG9uc2VFdmVudCgKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldENvbXBsZXRlKCksCisgICAgICAgICAgICByZXNwb25zZS5nZXRJbmNvbXBsZXRlKCksCisgICAgICAgICAgICByZXNwb25zZS5nZXRJbnRlcnZhbCgpLAorICAgICAgICAgICAgaGV4SW5mb0hhc2gpOworCisgICAgaWYgKGluaGliaXRFdmVudHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLmZpcmVEaXNjb3ZlcmVkUGVlcnNFdmVudCgKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldFBlZXJzKCksCisgICAgICAgICAgICBoZXhJbmZvSGFzaCk7CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgYW5ub3VuY2UgcmVzcG9uc2UgZXZlbnQgdG8gYWxsIGxpc3RlbmVycy4KKyAgICoKKyAgICogQHBhcmFtIGNvbXBsZXRlICAgVGhlIG51bWJlciBvZiBzZWVkZXJzIG9uIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGluY29tcGxldGUgVGhlIG51bWJlciBvZiBsZWVjaGVycyBvbiB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBpbnRlcnZhbCAgIFRoZSBhbm5vdW5jZSBpbnRlcnZhbCByZXF1ZXN0ZWQgYnkgdGhlIHRyYWNrZXIuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBmaXJlQW5ub3VuY2VSZXNwb25zZUV2ZW50KGludCBjb21wbGV0ZSwgaW50IGluY29tcGxldGUsIGludCBpbnRlcnZhbCwgU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgZm9yIChBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlQW5ub3VuY2VSZXNwb25zZShpbnRlcnZhbCwgY29tcGxldGUsIGluY29tcGxldGUsIGhleEluZm9IYXNoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgbmV3IHBlZXIgZGlzY292ZXJ5IGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMuCisgICAqCisgICAqIEBwYXJhbSBwZWVycyBUaGUgbGlzdCBvZiBwZWVycyBkaXNjb3ZlcmVkLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgZmlyZURpc2NvdmVyZWRQZWVyc0V2ZW50KExpc3Q8UGVlcj4gcGVlcnMsIFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIGZvciAoQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZURpc2NvdmVyZWRQZWVycyhwZWVycywgaGV4SW5mb0hhc2gpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9UcmFja2VyQ2xpZW50RmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9UcmFja2VyQ2xpZW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjFlMzYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGludGVyZmFjZSBUcmFja2VyQ2xpZW50RmFjdG9yeSB7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIHtAbGluayBUcmFja2VyQ2xpZW50fSBhbm5vdW5jaW5nIHRvIHRoZSBnaXZlbiB0cmFja2VyIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBwZWVycyAgIFRoZSBsaXN0IHBlZXIgdGhlIHRyYWNrZXIgY2xpZW50IHdpbGwgYW5ub3VuY2Ugb24gYmVoYWxmIG9mLgorICAgKiBAcGFyYW0gdHJhY2tlciBUaGUgdHJhY2tlciBhZGRyZXNzIGFzIGEge0BsaW5rIGphdmEubmV0LlVSSX0uCisgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gICAgSWYgdGhlIHRyYWNrZXIgYWRkcmVzcyBpcyBpbnZhbGlkLgorICAgKiBAdGhyb3dzIFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIElmIHRoZSB0cmFja2VyIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAqLworICBUcmFja2VyQ2xpZW50IGNyZWF0ZVRyYWNrZXJDbGllbnQoTGlzdDxQZWVyPiBwZWVycywgVVJJIHRyYWNrZXIpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgVW5rbm93blNlcnZpY2VFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudEZhY3RvcnlJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmJkYTAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBUcmFja2VyQ2xpZW50RmFjdG9yeUltcGwgaW1wbGVtZW50cyBUcmFja2VyQ2xpZW50RmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUcmFja2VyQ2xpZW50IGNyZWF0ZVRyYWNrZXJDbGllbnQoTGlzdDxQZWVyPiBwZWVycywgVVJJIHRyYWNrZXIpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgVW5rbm93blNlcnZpY2VFeGNlcHRpb24geworICAgIFN0cmluZyBzY2hlbWUgPSB0cmFja2VyLmdldFNjaGVtZSgpOworCisgICAgaWYgKCJodHRwIi5lcXVhbHMoc2NoZW1lKSB8fCAiaHR0cHMiLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICByZXR1cm4gbmV3IEhUVFBUcmFja2VyQ2xpZW50KHBlZXJzLCB0cmFja2VyKTsKKyAgICB9IGVsc2UgaWYgKCJ1ZHAiLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICByZXR1cm4gbmV3IFVEUFRyYWNrZXJDbGllbnQocGVlcnMsIHRyYWNrZXIpOworICAgIH0KKworICAgIHRocm93IG5ldyBVbmtub3duU2VydmljZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZCBhbm5vdW5jZSBzY2hlbWU6ICIgKyBzY2hlbWUgKyAiISIpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1VEUFRyYWNrZXJDbGllbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVURQVHJhY2tlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDk5MDgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1VEUFRyYWNrZXJDbGllbnQuamF2YQpAQCAtMCwwICsxLDM3MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLkNvbm5lY3Rpb25SZXNwb25zZU1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLkVycm9yTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcC5VRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHAuVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHAuVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wudWRwLlVEUFRyYWNrZXJNZXNzYWdlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIEFubm91bmNlciBmb3IgVURQIHRyYWNrZXJzLgorICoKKyAqIDxwPgorICogVGhlIFVEUCB0cmFja2VyIHByb3RvY29sIHJlcXVpcmVzIGEgdHdvLXN0ZXAgYW5ub3VuY2UgcmVxdWVzdC9yZXNwb25zZQorICogZXhjaGFuZ2Ugd2hlcmUgdGhlIHBlZXIgaXMgZmlyc3QgcmVxdWlyZWQgdG8gZXN0YWJsaXNoIGEgImNvbm5lY3Rpb24iCisgKiB3aXRoIHRoZSB0cmFja2VyIGJ5IHNlbmRpbmcgYSBjb25uZWN0aW9uIHJlcXVlc3QgbWVzc2FnZSBhbmQgcmV0cmVpdmluZworICogYSBjb25uZWN0aW9uIElEIGZyb20gdGhlIHRyYWNrZXIgdG8gdXNlIGluIHRoZSBmb2xsb3dpbmcgYW5ub3VuY2UKKyAqIHJlcXVlc3QgbWVzc2FnZXMgKHZhbGlkIGZvciAyIG1pbnV0ZXMpLgorICogPC9wPgorICoKKyAqIDxwPgorICogSXQgYWxzbyBjb250YWlucyBhIGJhY2tpbmctb2ZmIHJldHJ5IG1lY2hhbmlzbSAob24gYSAxNSoyXm4gc2Vjb25kcworICogc2NoZW1lKSwgaW4gd2hpY2ggaWYgdGhlIGFubm91bmNlIHJlcXVlc3QgdGltZXMtb3V0IGZvciBtb3JlIHRoYW4gdGhlCisgKiBjb25uZWN0aW9uIElEIHZhbGlkaXR5IHBlcmlvZCwgYW5vdGhlciBjb25uZWN0aW9uIHJlcXVlc3QvcmVzcG9uc2UKKyAqIGV4Y2hhbmdlIG11c3QgYmUgbWFkZSBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXRyYW5zbWl0IHRoZSBhbm5vdW5jZQorICogcmVxdWVzdC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFVEUFRyYWNrZXJDbGllbnQgZXh0ZW5kcyBUcmFja2VyQ2xpZW50IHsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVRFBUcmFja2VyQ2xpZW50LmNsYXNzKTsKKworICAvKioKKyAgICogQmFjay1vZmYgdGltZW91dCB1c2VzIDE1ICogMiBeIG4gZm9ybXVsYS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfQkFTRV9USU1FT1VUX1NFQ09ORFMgPSAxNTsKKworICAvKioKKyAgICogV2UgZG9uJ3QgdHJ5IG1vcmUgdGhhbiA4IHRpbWVzICgzODQwIHNlY29uZHMsIGFzIHBlciB0aGUgZm9ybXVsYSBkZWZpbmVkCisgICAqIGZvciB0aGUgYmFja2luZy1vZmYgdGltZW91dC4KKyAgICoKKyAgICogQHNlZSAjVURQX0JBU0VfVElNRU9VVF9TRUNPTkRTCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX01BWF9UUklFUyA9IDg7CisKKyAgLyoqCisgICAqIEZvciBTVE9QUEVEIGFubm91bmNlIGV2ZW50LCB3ZSBkb24ndCB3YW50IHRvIGJlIGJvdGhlcmVkIHdpdGggd2FpdGluZworICAgKiB0aGF0IGxvbmcuIFdlJ2xsIHRyeSBvbmNlIGFuZCBiYWlsLW91dCBlYXJseS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfTUFYX1RSSUVTX09OX1NUT1BQRUQgPSAxOworCisgIC8qKgorICAgKiBNYXhpbXVtIFVEUCBwYWNrZXQgc2l6ZSBleHBlY3RlZCwgaW4gYnl0ZXMuCisgICAqCisgICAqIFRoZSBiaWdnZXN0IHBhY2tldCBpbiB0aGUgZXhjaGFuZ2UgaXMgdGhlIGFubm91bmNlIHJlc3BvbnNlLCB3aGljaCBpbiAyMAorICAgKiBieXRlcyArIDYgYnl0ZXMgcGVyIHBlZXIuIENvbW1vbiBudW1XYW50IGlzIDUwLCBzbyAyMCArIDYgKiA1MCA9IDMyMC4KKyAgICogV2l0aCBoZWFkcm9vbSwgd2UnbGwgYXNrIGZvciA1MTIgYnl0ZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX1BBQ0tFVF9MRU5HVEggPSA1MTI7CisKKyAgcHJpdmF0ZSBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzOworICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb207CisKKyAgcHJpdmF0ZSBEYXRhZ3JhbVNvY2tldCBzb2NrZXQ7CisgIHByaXZhdGUgRGF0ZSBjb25uZWN0aW9uRXhwaXJhdGlvbjsKKyAgcHJpdmF0ZSBsb25nIGNvbm5lY3Rpb25JZDsKKyAgcHJpdmF0ZSBpbnQgdHJhbnNhY3Rpb25JZDsKKyAgcHJpdmF0ZSBib29sZWFuIHN0b3A7CisKKyAgcHJpdmF0ZSBlbnVtIFN0YXRlIHsKKyAgICBDT05ORUNUX1JFUVVFU1QsCisgICAgQU5OT1VOQ0VfUkVRVUVTVAorICB9CisKKyAgLyoqCisgICAqCisgICAqLworICBwcm90ZWN0ZWQgVURQVHJhY2tlckNsaWVudChMaXN0PFBlZXI+IHBlZXJzLCBVUkkgdHJhY2tlcikKKyAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgIHN1cGVyKHBlZXJzLCB0cmFja2VyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBVRFAgYW5ub3VuY2UgcmVxdWVzdCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIElQdjQKKyAgICAgKgorICAgICAqIEBzZWUgaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTUuaHRtbCNpcHY2CisgICAgICovCisgICAgZm9yIChQZWVyIHBlZXIgOiBwZWVycykgeworICAgICAgaWYgKCEoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHBlZXIuZ2V0SXAoKSkgaW5zdGFuY2VvZiBJbmV0NEFkZHJlc3MpKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5hZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgdHJhY2tlci5nZXRIb3N0KCksCisgICAgICAgICAgICB0cmFja2VyLmdldFBvcnQoKSk7CisKKyAgICB0aGlzLnNvY2tldCA9IG51bGw7CisgICAgdGhpcy5yYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgdGhpcy5jb25uZWN0aW9uRXhwaXJhdGlvbiA9IG51bGw7CisgICAgdGhpcy5zdG9wID0gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgbXVsdGlBbm5vdW5jZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwgYm9vbGVhbiBpbmhpYml0RXZlbnQsIExpc3Q8PyBleHRlbmRzIEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiB0b3JyZW50cywgTGlzdDxQZWVyPiBwZWVyKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYW5ub3VuY2UoZmluYWwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5oaWJpdEV2ZW50cywgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCwgZmluYWwgTGlzdDxQZWVyPiBwZWVycykgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICBsb2dBbm5vdW5jZVJlcXVlc3QoZXZlbnQsIHRvcnJlbnQpOworCisgICAgU3RhdGUgc3RhdGUgPSBTdGF0ZS5DT05ORUNUX1JFUVVFU1Q7CisgICAgaW50IG1heEF0dGVtcHRzID0gQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQKKyAgICAgICAgICAgIC5TVE9QUEVELmVxdWFscyhldmVudCkKKyAgICAgICAgICAgID8gVURQX01BWF9UUklFU19PTl9TVE9QUEVECisgICAgICAgICAgICA6IFVEUF9NQVhfVFJJRVM7CisgICAgaW50IGF0dGVtcHRzID0gLTE7CisKKyAgICB0cnkgeworICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgRGF0YWdyYW1Tb2NrZXQoKTsKKyAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QodGhpcy5hZGRyZXNzKTsKKworICAgICAgd2hpbGUgKCsrYXR0ZW1wdHMgPD0gbWF4QXR0ZW1wdHMpIHsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb24gSUQgaXMgcmFuZG9taXplZCBmb3IgZWFjaCBleGNoYW5nZS4KKyAgICAgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdGhpcy5yYW5kb20ubmV4dEludCgpOworCisgICAgICAgIC8vIEltbWVkaWF0ZWx5IGRlY2lkZSBpZiB3ZSBjYW4gc2VuZCB0aGUgYW5ub3VuY2UgcmVxdWVzdAorICAgICAgICAvLyBkaXJlY3RseSBvciBub3QuIEZvciB0aGlzLCB3ZSBuZWVkIGEgdmFsaWQsIG5vbi1leHBpcmVkCisgICAgICAgIC8vIGNvbm5lY3Rpb24gSUQuCisgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25FeHBpcmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAobmV3IERhdGUoKS5iZWZvcmUodGhpcy5jb25uZWN0aW9uRXhwaXJhdGlvbikpIHsKKyAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQU5OT1VOQ0VfUkVRVUVTVDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJBbm5vdW5jZSBjb25uZWN0aW9uIElEIGV4cGlyZWQsICIgKworICAgICAgICAgICAgICAgICAgICAicmVjb25uZWN0aW5nIHdpdGggdHJhY2tlci4uLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICBjYXNlIENPTk5FQ1RfUkVRVUVTVDoKKyAgICAgICAgICAgIHRoaXMuc2VuZChVRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgLmNyYWZ0KHRoaXMudHJhbnNhY3Rpb25JZCkuZ2V0RGF0YSgpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmFja2VyQ29ubmVjdFJlc3BvbnNlKAorICAgICAgICAgICAgICAgICAgICAgIFVEUFRyYWNrZXJNZXNzYWdlLlVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZSh0aGlzLnJlY3YoYXR0ZW1wdHMpKSk7CisgICAgICAgICAgICAgIGF0dGVtcHRzID0gLTE7CisgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHN0ZSkgeworICAgICAgICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgdGhlIHRpbWVvdXQgYW5kIHJldHJ5IHdpdGggYQorICAgICAgICAgICAgICAvLyBsb25nZXIgdGltZW91dCwgdW5sZXNzIGFubm91bmNlIHN0b3Agd2FzCisgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gZXhpdCByaWdodAorICAgICAgICAgICAgICAvLyBhd2F5LgorICAgICAgICAgICAgICBpZiAoc3RvcCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEFOTk9VTkNFX1JFUVVFU1Q6CisgICAgICAgICAgICBmb3IgKFBlZXIgcGVlciA6IHBlZXJzKSB7CisgICAgICAgICAgICAgIHRoaXMuc2VuZCh0aGlzLmJ1aWxkQW5ub3VuY2VSZXF1ZXN0KGV2ZW50LCB0b3JyZW50LCBwZWVyKS5nZXREYXRhKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYWNrZXJBbm5vdW5jZVJlc3BvbnNlKAorICAgICAgICAgICAgICAgICAgICAgIFVEUFRyYWNrZXJNZXNzYWdlLlVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZSh0aGlzLnJlY3YoYXR0ZW1wdHMpKSwgaW5oaWJpdEV2ZW50cywgdG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUsIHdlIHN1Y2Nlc2Z1bGx5IGNvbXBsZXRlZCB0aGlzCisgICAgICAgICAgICAgIC8vIGFubm91bmNlIGV4Y2hhbmdlIGFuZCBjYW4gc2ltcGx5IHJldHVybiB0byBleGl0IHRoZQorICAgICAgICAgICAgICAvLyBsb29wLgorICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHN0ZSkgeworICAgICAgICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgdGhlIHRpbWVvdXQgYW5kIHJldHJ5IHdpdGggYQorICAgICAgICAgICAgICAvLyBsb25nZXIgdGltZW91dCwgdW5sZXNzIGFubm91bmNlIHN0b3Agd2FzCisgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gZXhpdCByaWdodAorICAgICAgICAgICAgICAvLyBhd2F5LgorICAgICAgICAgICAgICBpZiAoc3RvcCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgYW5ub3VuY2Ugc3RhdGUhIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gV2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgd2FzIHJlYWNoZWQsIHRoZSBhbm5vdW5jZQorICAgICAgLy8gcmVhbGx5IHRpbWVkLW91dC4gV2UnbGwgdHJ5IGFnYWluIGluIHRoZSBuZXh0IGFubm91bmNlIGxvb3AuCisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIlRpbWVvdXQgd2hpbGUgYW5ub3VuY2luZyIgKworICAgICAgICAgICAgICB0aGlzLmZvcm1hdEFubm91bmNlRXZlbnQoZXZlbnQpICsgIiB0byB0cmFja2VyISIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBhbm5vdW5jaW5nIiArCisgICAgICAgICAgICAgIHRoaXMuZm9ybWF0QW5ub3VuY2VFdmVudChldmVudCkgKworICAgICAgICAgICAgICAiIHRvIHRyYWNrZXI6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgIH0gY2F0Y2ggKE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIG12ZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJUcmFja2VyIG1lc3NhZ2UgdmlvbGF0ZXMgZXhwZWN0ZWQgIiArCisgICAgICAgICAgICAgICJwcm90b2NvbCAoIiArIG12ZS5nZXRNZXNzYWdlKCkgKyAiKSIsIG12ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhhbmRsZXMgdGhlIHRyYWNrZXIgYW5ub3VuY2UgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFZlcmlmaWVzIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbWVzc2FnZSBiZWZvcmUgcGFzc2luZyBpdCBvdmVyIHRvCisgICAqIHtAbGluayBBbm5vdW5jZSMoKX0uCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgdHJhY2tlciBpbiByZXNwb25zZSB0byB0aGUKKyAgICogICAgICAgICAgICAgICAgYW5ub3VuY2UgcmVxdWVzdC4KKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUcmFja2VyQW5ub3VuY2VSZXNwb25zZShUcmFja2VyTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudHMsIFN0cmluZyBoZXhJbmZvSGFzaCkgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICB0aGlzLnZhbGlkYXRlVHJhY2tlclJlc3BvbnNlKG1lc3NhZ2UpOworICAgIHN1cGVyLmhhbmRsZVRyYWNrZXJBbm5vdW5jZVJlc3BvbnNlKG1lc3NhZ2UsIGluaGliaXRFdmVudHMsIGhleEluZm9IYXNoKTsKKyAgfQorCisgIC8qKgorICAgKiBDbG9zZSB0aGlzIGFubm91bmNlIGNvbm5lY3Rpb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CisgICAgdGhpcy5zdG9wID0gdHJ1ZTsKKworICAgIC8vIENsb3NlIHRoZSBzb2NrZXQgdG8gZm9yY2UgYmxvY2tpbmcgb3BlcmF0aW9ucyB0byByZXR1cm4uCisgICAgaWYgKHRoaXMuc29ja2V0ICE9IG51bGwgJiYgIXRoaXMuc29ja2V0LmlzQ2xvc2VkKCkpIHsKKyAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGJ1aWxkQW5ub3VuY2VSZXF1ZXN0KAorICAgICAgICAgIGZpbmFsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50LCBmaW5hbCBQZWVyIHBlZXIpIHsKKyAgICByZXR1cm4gVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5jcmFmdCgKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHRvcnJlbnQuZ2V0SW5mb0hhc2goKSwKKyAgICAgICAgICAgIHBlZXIuZ2V0UGVlcklkQXJyYXkoKSwKKyAgICAgICAgICAgIHRvcnJlbnQuZ2V0RG93bmxvYWRlZCgpLAorICAgICAgICAgICAgdG9ycmVudC5nZXRVcGxvYWRlZCgpLAorICAgICAgICAgICAgdG9ycmVudC5nZXRMZWZ0KCksCisgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgIHBlZXIuZ2V0QWRkcmVzcygpLmdldEFkZHJlc3MoKSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLkRFRkFVTFRfTlVNX1dBTlQsCisgICAgICAgICAgICBwZWVyLmdldFBvcnQoKSk7CisgIH0KKworICAvKioKKyAgICogVmFsaWRhdGVzIGFuIGluY29taW5nIHRyYWNrZXIgbWVzc2FnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFZlcmlmaWVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbm90IGFuIGVycm9yIG1lc3NhZ2UgKHRocm93cyBhbiBleGNlcHRpb24KKyAgICogd2l0aCB0aGUgZXJyb3IgbWVzc2FnZSBpZiBpdCBpcykgYW5kIHRoYXQgdGhlIHRyYW5zYWN0aW9uIElEIG1hdGNoZXMgdGhlCisgICAqIGN1cnJlbnQgb25lLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBpbmNvbWluZyB0cmFja2VyIG1lc3NhZ2UuCisgICAqLworICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUcmFja2VyUmVzcG9uc2UoVHJhY2tlck1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgICB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3JNZXNzYWdlKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oKChFcnJvck1lc3NhZ2UpIG1lc3NhZ2UpLmdldFJlYXNvbigpKTsKKyAgICB9CisKKyAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFVEUFRyYWNrZXJNZXNzYWdlICYmCisgICAgICAgICAgICAoKChVRFBUcmFja2VyTWVzc2FnZSkgbWVzc2FnZSkuZ2V0VHJhbnNhY3Rpb25JZCgpICE9IHRoaXMudHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiSW52YWxpZCB0cmFuc2FjdGlvbiBJRCEiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGFuZGxlcyB0aGUgdHJhY2tlciBjb25uZWN0IHJlc3BvbnNlIG1lc3NhZ2UuCisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHRyYWNrZXIgaW4gcmVzcG9uc2UgdG8gdGhlCisgICAqICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gcmVxdWVzdC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBoYW5kbGVUcmFja2VyQ29ubmVjdFJlc3BvbnNlKFRyYWNrZXJNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgICAgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICB0aGlzLnZhbGlkYXRlVHJhY2tlclJlc3BvbnNlKG1lc3NhZ2UpOworCisgICAgaWYgKCEobWVzc2FnZSBpbnN0YW5jZW9mIENvbm5lY3Rpb25SZXNwb25zZU1lc3NhZ2UpKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdHJhY2tlciBtZXNzYWdlIHR5cGUgIiArCisgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VHlwZSgpLm5hbWUoKSArICIhIik7CisgICAgfQorCisgICAgVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZSBjb25uZWN0UmVzcG9uc2UgPQorICAgICAgICAgICAgKFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UpIG1lc3NhZ2U7CisKKyAgICB0aGlzLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3RSZXNwb25zZS5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICBDYWxlbmRhciBub3cgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgIG5vdy5hZGQoQ2FsZW5kYXIuTUlOVVRFLCAxKTsKKyAgICB0aGlzLmNvbm5lY3Rpb25FeHBpcmF0aW9uID0gbm93LmdldFRpbWUoKTsKKyAgfQorCisgIC8qKgorICAgKiBTZW5kIGEgVURQIHBhY2tldCB0byB0aGUgdHJhY2tlci4KKyAgICoKKyAgICogQHBhcmFtIGRhdGEgVGhlIHtAbGluayBCeXRlQnVmZmVyfSB0byBzZW5kIGluIGEgZGF0YWdyYW0gcGFja2V0IHRvIHRoZQorICAgKiAgICAgICAgICAgICB0cmFja2VyLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHNlbmQoQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuc29ja2V0LnNlbmQobmV3IERhdGFncmFtUGFja2V0KAorICAgICAgICAgICAgICBkYXRhLmFycmF5KCksCisgICAgICAgICAgICAgIGRhdGEuY2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzKSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICBsb2dnZXIuaW5mbygiRXJyb3Igc2VuZGluZyBkYXRhZ3JhbSBwYWNrZXQgdG8gdHJhY2tlciBhdCB7fToge30uIiwgdGhpcy5hZGRyZXNzLCBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVjZWl2ZSBhIFVEUCBwYWNrZXQgZnJvbSB0aGUgdHJhY2tlci4KKyAgICoKKyAgICogQHBhcmFtIGF0dGVtcHQgVGhlIGF0dGVtcHQgbnVtYmVyLCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdGltZW91dCBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgIHJlY2VpdmUgb3BlcmF0aW9uLgorICAgKiBAcmV0dW4gUmV0dXJucyBhIHtAbGluayBCeXRlQnVmZmVyfSBjb250YWluaW5nIHRoZSBwYWNrZXQgZGF0YS4KKyAgICovCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciByZWN2KGludCBhdHRlbXB0KQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU29ja2V0RXhjZXB0aW9uLCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICBpbnQgdGltZW91dCA9IFVEUF9CQVNFX1RJTUVPVVRfU0VDT05EUyAqIChpbnQpIE1hdGgucG93KDIsIGF0dGVtcHQpOworICAgIGxvZ2dlci50cmFjZSgiU2V0dGluZyByZWNlaXZlIHRpbWVvdXQgdG8ge31zIGZvciBhdHRlbXB0IHt9Li4uIiwKKyAgICAgICAgICAgIHRpbWVvdXQsIGF0dGVtcHQpOworICAgIHRoaXMuc29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0ICogMTAwMCk7CisKKyAgICB0cnkgeworICAgICAgRGF0YWdyYW1QYWNrZXQgcCA9IG5ldyBEYXRhZ3JhbVBhY2tldCgKKyAgICAgICAgICAgICAgbmV3IGJ5dGVbVURQX1BBQ0tFVF9MRU5HVEhdLAorICAgICAgICAgICAgICBVRFBfUEFDS0VUX0xFTkdUSCk7CisgICAgICB0aGlzLnNvY2tldC5yZWNlaXZlKHApOworICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChwLmdldERhdGEoKSwgMCwgcC5nZXRMZW5ndGgoKSk7CisgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBzdGUpIHsKKyAgICAgIHRocm93IHN0ZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9Db3VudExpbWl0Q29ubmVjdGlvbkFsbG93ZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9Db3VudExpbWl0Q29ubmVjdGlvbkFsbG93ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FlZThiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0NvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGVlcnNTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuTmV3Q29ubmVjdGlvbkFsbG93ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5Db25zdGFudHMuREVGQVVMVF9NQVhfQ09OTkVDVElPTl9DT1VOVDsKKworLyoqCisgKiB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyBmaXhlZCBjb3VudCBvZiBvcGVuIGNvbm5lY3Rpb24gc2ltdWx0YW5lb3VzbHkKKyAqLworCisvL+mZkOWItuWQjOaXtuW7uueri+i/nuaOpeeahOaVsOmHjworcHVibGljIGNsYXNzIENvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlciBpbXBsZW1lbnRzIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIHsKKworICBwcml2YXRlIGZpbmFsIFBlZXJzU3RvcmFnZSBteVBlZXJzU3RvcmFnZTsKKworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlNYXhDb25uZWN0aW9uQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgIHB1YmxpYyBDb3VudExpbWl0Q29ubmVjdGlvbkFsbG93ZXIoUGVlcnNTdG9yYWdlIHBlZXJzU3RvcmFnZSkgeworICAgIHRoaXMubXlQZWVyc1N0b3JhZ2UgPSBwZWVyc1N0b3JhZ2U7CisgICAgbXlNYXhDb25uZWN0aW9uQ291bnQuc2V0KERFRkFVTFRfTUFYX0NPTk5FQ1RJT05fQ09VTlQpOworCisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRNeU1heENvbm5lY3Rpb25Db3VudChpbnQgbmV3TWF4Q291bnQpIHsKKyAgICBteU1heENvbm5lY3Rpb25Db3VudC5zZXQobmV3TWF4Q291bnQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzTmV3Q29ubmVjdGlvbkFsbG93ZWQoKSB7CisgICAgcmV0dXJuIG15UGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKSA8IG15TWF4Q29ubmVjdGlvbkNvdW50LmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvRGF0YVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0RhdGFQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk2NDVhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0RhdGFQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKKworcHVibGljIGludGVyZmFjZSBEYXRhUHJvY2Vzc29yIHsKKworICAvKioKKyAgICogdGhlIG1ldGhvZCBtdXN0IHJlYWQgZGF0YSBmcm9tIGNoYW5uZWwgYW5kIHByb2Nlc3MgaXQKKyAgICoKKyAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgc3BlY2lmaWVkIHNvY2tldCBjaGFubmVsIHdpdGggZGF0YQorICAgKiBAcmV0dXJuIGRhdGEgcHJvY2Vzc29yIHdoaWNoIG11c3QgcHJvY2VzcyBuZXh0IGRhdGEKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAqLworICBEYXRhUHJvY2Vzc29yIHByb2Nlc3NBbmRHZXROZXh0KEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogdGhlIG1ldGhvZCBtdXN0IGhhbmRsZSBlcnJvciBhbmQgY29ycmVjdGx5IHJlbGVhc2UgcmVzb3VyY2VzCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXRDaGFubmVsIHNwZWNpZmllZCBjaGFubmVsCisgICAqIEBwYXJhbSBlICAgICAgICAgICAgIHNwZWNpZmllZCBleGNlcHRpb24KKyAgICogQHJldHVybiBkYXRhIHByb2Nlc3NvciB3aGljaCBtdXN0IHByb2Nlc3MgbmV4dCBlcnJvci4gQ2FuIGJlIG51bGwKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAqLworICBEYXRhUHJvY2Vzc29yIGhhbmRsZUVycm9yKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9EYXRhUHJvY2Vzc29yVXRpbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0RhdGFQcm9jZXNzb3JVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhNjM5OQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9EYXRhUHJvY2Vzc29yVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhUHJvY2Vzc29yVXRpbCB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQ2hhbm5lbElmT3BlbihMb2dnZXIgbG9nZ2VyLCBCeXRlQ2hhbm5lbCBjaGFubmVsKSB7CisgICAgaWYgKGNoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiY2xvc2UgY2hhbm5lbCB7fSIsIGNoYW5uZWwpOworICAgICAgdHJ5IHsKKyAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgdG8gY2xvc2UgY2hhbm5lbCB7fSIsIGNoYW5uZWwsIGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVJlY2VpdmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZlYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29udGV4dDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuSGFuZHNoYWtlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Mb2FkZWRUb3JyZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5TaGFyZWRUb3JyZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlclVJRDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEhhbmRzaGFrZVJlY2VpdmVyIGltcGxlbWVudHMgRGF0YVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIYW5kc2hha2VSZWNlaXZlci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlIb3N0QWRkcmVzczsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlQb3J0OworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbXlJc091dGdvaW5nQ29ubmVjdGlvbjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1lc3NhZ2VCeXRlczsKKyAgcHJpdmF0ZSBpbnQgcHN0ckxlbmd0aDsKKworICBIYW5kc2hha2VSZWNlaXZlcihDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPdXRnb2luZ0xpc3RlbmVyKSB7CisgICAgbXlDb250ZXh0ID0gY29udGV4dDsKKyAgICBteUhvc3RBZGRyZXNzID0gaG9zdEFkZHJlc3M7CisgICAgbXlQb3J0ID0gcG9ydDsKKyAgICB0aGlzLnBzdHJMZW5ndGggPSAtMTsKKyAgICB0aGlzLm15SXNPdXRnb2luZ0Nvbm5lY3Rpb24gPSBpc091dGdvaW5nTGlzdGVuZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgcHJvY2Vzc0FuZEdldE5leHQoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGlmIChwc3RyTGVuZ3RoID09IC0xKSB7CisgICAgICBCeXRlQnVmZmVyIGxlbiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSk7CisgICAgICBpbnQgcmVhZEJ5dGVzID0gLTE7CisgICAgICB0cnkgeworICAgICAgICByZWFkQnl0ZXMgPSBzb2NrZXRDaGFubmVsLnJlYWQobGVuKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgIH0KKyAgICAgIGlmIChyZWFkQnl0ZXMgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93blByb2Nlc3NvcigpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgICAgfQorICAgICAgaWYgKHJlYWRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgbGVuLnJld2luZCgpOworICAgICAgYnl0ZSBwc3RyTGVuID0gbGVuLmdldCgpOworICAgICAgdGhpcy5wc3RyTGVuZ3RoID0gcHN0ckxlbjsKKyAgICAgIG1lc3NhZ2VCeXRlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUodGhpcy5wc3RyTGVuZ3RoICsgSGFuZHNoYWtlLkJBU0VfSEFORFNIQUtFX0xFTkdUSCk7CisgICAgICBtZXNzYWdlQnl0ZXMucHV0KHBzdHJMZW4pOworICAgIH0KKyAgICBpbnQgcmVhZEJ5dGVzID0gLTE7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRCeXRlcyA9IHNvY2tldENoYW5uZWwucmVhZChtZXNzYWdlQnl0ZXMpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIHRvIHJlYWQgZGF0YSBmcm9tIHt9Iiwgc29ja2V0Q2hhbm5lbCwgZSk7CisgICAgfQorICAgIGlmIChyZWFkQnl0ZXMgPT0gLTEpIHsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisgICAgaWYgKG1lc3NhZ2VCeXRlcy5yZW1haW5pbmcoKSAhPSAwKSB7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgSGFuZHNoYWtlIGhzID0gcGFyc2VIYW5kc2hha2Uoc29ja2V0Q2hhbm5lbC50b1N0cmluZygpKTsKKworICAgIGlmIChocyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgZmluYWwgTG9hZGVkVG9ycmVudCBhbm5vdW5jZWFibGVUb3JyZW50ID0gbXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmdldExvYWRlZFRvcnJlbnQoaHMuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICBpZiAoYW5ub3VuY2VhYmxlVG9ycmVudCA9PSBudWxsKSB7CisgICAgICBsb2dnZXIuZGVidWcoIkFubm91bmNlYWJsZSB0b3JyZW50IHt9IGlzIG5vdCBmb3VuZCBpbiBzdG9yYWdlIiwgaHMuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgU2hhcmVkVG9ycmVudCB0b3JyZW50OworICAgIHRyeSB7CisgICAgICB0b3JyZW50ID0gbXlDb250ZXh0LmdldFRvcnJlbnRMb2FkZXIoKS5sb2FkVG9ycmVudChhbm5vdW5jZWFibGVUb3JyZW50KTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93blByb2Nlc3NvcigpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5XaXRoTWVzc2FnZUFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJjYW5ub3QgbG9hZCB0b3JyZW50IHt9IiwgaHMuZ2V0SGV4SW5mb0hhc2goKSwgZSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgbG9nZ2VyLnRyYWNlKCJnb3QgaGFuZHNoYWtlIHt9IGZyb20ge30iLCBBcnJheXMudG9TdHJpbmcobWVzc2FnZUJ5dGVzLmFycmF5KCkpLCBzb2NrZXRDaGFubmVsKTsKKworICAgIFN0cmluZyBjbGllbnRUeXBlVmVyc2lvbiA9IG5ldyBTdHJpbmcoQXJyYXlzLmNvcHlPZihocy5nZXRQZWVySWQoKSwgOCkpOworICAgIFN0cmluZyBjbGllbnRUeXBlID0gY2xpZW50VHlwZVZlcnNpb24uc3Vic3RyaW5nKDEsIDMpOworICAgIGludCBjbGllbnRWZXJzaW9uID0gMDsKKyAgICB0cnkgeworICAgICAgY2xpZW50VmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoY2xpZW50VHlwZVZlcnNpb24uc3Vic3RyaW5nKDMsIDcpKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkge30KKyAgICBmaW5hbCBTaGFyaW5nUGVlciBzaGFyaW5nUGVlciA9CisgICAgICAgICAgICBteUNvbnRleHQuY3JlYXRlU2hhcmluZ1BlZXIobXlIb3N0QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgbXlQb3J0LAorICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAoaHMuZ2V0UGVlcklkKCkpLAorICAgICAgICAgICAgICAgICAgICB0b3JyZW50LAorICAgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjbGllbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICBjbGllbnRWZXJzaW9uKTsKKyAgICBQZWVyVUlEIHBlZXJVSUQgPSBuZXcgUGVlclVJRChzaGFyaW5nUGVlci5nZXRBZGRyZXNzKCksIGhzLmdldEhleEluZm9IYXNoKCkpOworCisgICAgU2hhcmluZ1BlZXIgb2xkID0gbXlDb250ZXh0LmdldFBlZXJzU3RvcmFnZSgpLnB1dElmQWJzZW50KHBlZXJVSUQsIHNoYXJpbmdQZWVyKTsKKyAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQWxyZWFkeSBjb25uZWN0ZWQgdG8gb2xkIHBlZXIge30sIGNsb3NlIGN1cnJlbnQgY29ubmVjdGlvbiB3aXRoIHt9Iiwgb2xkLCBzaGFyaW5nUGVlcik7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgLy8gSWYgSSBhbSBub3QgYSBsZWVjaGVyCisgICAgaWYgKCFteUlzT3V0Z29pbmdDb25uZWN0aW9uKSB7CisgICAgICBsb2dnZXIudHJhY2UoInNlbmQgaGFuZHNoYWtlIHRvIHt9Iiwgc29ja2V0Q2hhbm5lbCk7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBIYW5kc2hha2UgY3JhZnQgPSBIYW5kc2hha2UuY3JhZnQoaHMuZ2V0SW5mb0hhc2goKSwgbXlDb250ZXh0LmdldFBlZXJzU3RvcmFnZSgpLmdldFNlbGYoKS5nZXRQZWVySWRBcnJheSgpKTsKKyAgICAgICAgc29ja2V0Q2hhbm5lbC53cml0ZShjcmFmdC5nZXREYXRhKCkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgImVycm9yIGluIHNlbmRpbmcgaGFuZHNoYWtlIHRvIHt9Iiwgc29ja2V0Q2hhbm5lbCwgZSk7CisgICAgICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKHBlZXJVSUQsIG15Q29udGV4dCk7CisgICAgICB9CisgICAgfQorCisgICAgbG9nZ2VyLmRlYnVnKCJzZXR1cCBuZXcgY29ubmVjdGlvbiB3aXRoIHt9Iiwgc2hhcmluZ1BlZXIpOworCisgICAgdHJ5IHsKKyAgICAgIG15Q29udGV4dC5nZXRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNoYXJpbmdQZWVyLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCk7CisgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5oYW5kbGVkIGV4Y2VwdGlvbiB7fSBpbiBleGVjdXRvciB0YXNrIChvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCkiLCBlLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICB0b3JyZW50LmFkZENvbm5lY3RlZFBlZXIoc2hhcmluZ1BlZXIpOworICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidGFzayAnb25Db25uZWN0aW9uRXN0YWJsaXNoZWQnIHN1Ym1pdCBpcyBmYWlsZWQuIFJlYXNvbjoge30iLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihwZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKworICAgIHJldHVybiBuZXcgV29ya2luZ1JlY2VpdmVyKHBlZXJVSUQsIG15Q29udGV4dCk7CisgIH0KKworICBwcml2YXRlIEhhbmRzaGFrZSBwYXJzZUhhbmRzaGFrZShTdHJpbmcgc29ja2V0Q2hhbm5lbEZvckxvZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbWVzc2FnZUJ5dGVzLnJld2luZCgpOworICAgICAgcmV0dXJuIEhhbmRzaGFrZS5wYXJzZShtZXNzYWdlQnl0ZXMsIHBzdHJMZW5ndGgpOworICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJpbmNvcnJlY3QgaGFuZHNoYWtlIG1lc3NhZ2UgZnJvbSAiICsgc29ja2V0Q2hhbm5lbEZvckxvZywgZSk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIGhhbmRsZUVycm9yKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVNlbmRlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDBlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlU2VuZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5IYW5kc2hha2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBIYW5kc2hha2VTZW5kZXIgaW1wbGVtZW50cyBEYXRhUHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhhbmRzaGFrZVNlbmRlci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50SGFzaCBteVRvcnJlbnRIYXNoOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteVJlbW90ZVBlZXJJcDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlSZW1vdGVQZWVyUG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKworICBwdWJsaWMgSGFuZHNoYWtlU2VuZGVyKFRvcnJlbnRIYXNoIHRvcnJlbnRIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdGVQZWVySXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbW90ZVBlZXJQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkgeworICAgIG15VG9ycmVudEhhc2ggPSB0b3JyZW50SGFzaDsKKyAgICBteVJlbW90ZVBlZXJJcCA9IHJlbW90ZVBlZXJJcDsKKyAgICBteVJlbW90ZVBlZXJQb3J0ID0gcmVtb3RlUGVlclBvcnQ7CisgICAgbXlDb250ZXh0ID0gY29udGV4dDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YVByb2Nlc3NvciBwcm9jZXNzQW5kR2V0TmV4dChCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgUGVlciBzZWxmID0gbXlDb250ZXh0LmdldFBlZXJzU3RvcmFnZSgpLmdldFNlbGYoKTsKKyAgICBIYW5kc2hha2UgaGFuZHNoYWtlID0gSGFuZHNoYWtlLmNyYWZ0KG15VG9ycmVudEhhc2guZ2V0SW5mb0hhc2goKSwgc2VsZi5nZXRQZWVySWRBcnJheSgpKTsKKyAgICBpZiAoaGFuZHNoYWtlID09IG51bGwpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJjYW4gbm90IGNyYWZ0IGhhbmRzaGFrZSBtZXNzYWdlLiBTZWxmIHBlZXIgaWQgaXMge30sIHRvcnJlbnQgaGFzaCBpcyB7fSIsCisgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhzZWxmLmdldFBlZXJJZEFycmF5KCkpLAorICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcobXlUb3JyZW50SGFzaC5nZXRJbmZvSGFzaCgpKSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCk7CisgICAgfQorICAgIEJ5dGVCdWZmZXIgbWVzc2FnZVRvU2VuZCA9IEJ5dGVCdWZmZXIud3JhcChoYW5kc2hha2UuZ2V0RGF0YSgpLmFycmF5KCkpOworICAgIGxvZ2dlci50cmFjZSgidHJ5IHNlbmQgaGFuZHNoYWtlIHt9IHRvIHt9IiwgaGFuZHNoYWtlLCBzb2NrZXRDaGFubmVsKTsKKyAgICB3aGlsZSAobWVzc2FnZVRvU2VuZC5oYXNSZW1haW5pbmcoKSkgeworICAgICAgc29ja2V0Q2hhbm5lbC53cml0ZShtZXNzYWdlVG9TZW5kKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBIYW5kc2hha2VSZWNlaXZlcigKKyAgICAgICAgICAgIG15Q29udGV4dCwKKyAgICAgICAgICAgIG15UmVtb3RlUGVlcklwLAorICAgICAgICAgICAgbXlSZW1vdGVQZWVyUG9ydCwKKyAgICAgICAgICAgIHRydWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIGhhbmRsZUVycm9yKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL091dGdvaW5nQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvT3V0Z29pbmdDb25uZWN0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNkNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL091dGdvaW5nQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIE91dGdvaW5nQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIHsKKworICBwcml2YXRlIHZvbGF0aWxlIERhdGFQcm9jZXNzb3IgbXlOZXh0OworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRIYXNoIHRvcnJlbnRIYXNoOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteVJlbW90ZVBlZXJJcDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlSZW1vdGVQZWVyUG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKworICBwdWJsaWMgT3V0Z29pbmdDb25uZWN0aW9uTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudEhhc2ggdG9ycmVudEhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVtb3RlUGVlcklwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbW90ZVBlZXJQb3J0KSB7CisgICAgdGhpcy50b3JyZW50SGFzaCA9IHRvcnJlbnRIYXNoOworICAgIG15UmVtb3RlUGVlcklwID0gcmVtb3RlUGVlcklwOworICAgIG15UmVtb3RlUGVlclBvcnQgPSByZW1vdGVQZWVyUG9ydDsKKyAgICBteU5leHQgPSBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKTsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uTmV3RGF0YUF2YWlsYWJsZShTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teU5leHQgPSB0aGlzLm15TmV4dC5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSGFuZHNoYWtlU2VuZGVyIGhhbmRzaGFrZVNlbmRlciA9IG5ldyBIYW5kc2hha2VTZW5kZXIoCisgICAgICAgICAgICB0b3JyZW50SGFzaCwKKyAgICAgICAgICAgIG15UmVtb3RlUGVlcklwLAorICAgICAgICAgICAgbXlSZW1vdGVQZWVyUG9ydCwKKyAgICAgICAgICAgIG15Q29udGV4dCk7CisgICAgdGhpcy5teU5leHQgPSBoYW5kc2hha2VTZW5kZXIucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25FcnJvcihTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLm15TmV4dC5oYW5kbGVFcnJvcihzb2NrZXRDaGFubmVsLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIzNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1NodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29udGV4dDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGVlcnNTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyVUlEOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKKworcHVibGljIGNsYXNzIFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvciBpbXBsZW1lbnRzIERhdGFQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFBlZXJVSUQgbXlQZWVyVUlEOworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworCisgIHB1YmxpYyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IoUGVlclVJRCBwZWVySWQsIENvbnRleHQgY29udGV4dCkgeworICAgIG15UGVlclVJRCA9IHBlZXJJZDsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIHByb2Nlc3NBbmRHZXROZXh0KEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGF0YVByb2Nlc3NvclV0aWwuY2xvc2VDaGFubmVsSWZPcGVuKGxvZ2dlciwgc29ja2V0Q2hhbm5lbCk7CisgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgcmVtb3ZlIGFuZCB1bmJpbmQgcGVlci4gUGVlciBVSUQgLSB7fSIsIG15UGVlclVJRCk7CisgICAgcmVtb3ZlUGVlcigpOworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZVBlZXIoKSB7CisgICAgUGVlcnNTdG9yYWdlIHBlZXJzU3RvcmFnZSA9IG15Q29udGV4dC5nZXRQZWVyc1N0b3JhZ2UoKTsKKyAgICBTaGFyaW5nUGVlciByZW1vdmVkUGVlciA9IHBlZXJzU3RvcmFnZS5yZW1vdmVTaGFyaW5nUGVlcihteVBlZXJVSUQpOworICAgIGlmIChyZW1vdmVkUGVlciA9PSBudWxsKSB7CisgICAgICBsb2dnZXIuaW5mbygidHJ5IHRvIHNodXRkb3duIHBlZXIgd2l0aCBpZCB7fSwgYnV0IGl0IGlzIG5vdCBmb3VuZCBpbiBzdG9yYWdlIiwgbXlQZWVyVUlEKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVtb3ZlZFBlZXIudW5iaW5kKHRydWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIGhhbmRsZUVycm9yKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBwcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1NodXRkb3duUHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU2h1dGRvd25Qcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZhODgzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1NodXRkb3duUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKKworcHVibGljIGNsYXNzIFNodXRkb3duUHJvY2Vzc29yIGltcGxlbWVudHMgRGF0YVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaHV0ZG93blByb2Nlc3Nvci5jbGFzcyk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIHByb2Nlc3NBbmRHZXROZXh0KEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRGF0YVByb2Nlc3NvclV0aWwuY2xvc2VDaGFubmVsSWZPcGVuKGxvZ2dlciwgc29ja2V0Q2hhbm5lbCk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgaGFuZGxlRXJyb3IoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU3RhdGVDaGFubmVsTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TdGF0ZUNoYW5uZWxMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTY2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU3RhdGVDaGFubmVsTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbnRleHQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBTdGF0ZUNoYW5uZWxMaXN0ZW5lciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBEYXRhUHJvY2Vzc29yIG15TmV4dDsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKworICBwdWJsaWMgU3RhdGVDaGFubmVsTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgbXlDb250ZXh0ID0gY29udGV4dDsKKyAgICBteU5leHQgPSBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbk5ld0RhdGFBdmFpbGFibGUoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubXlOZXh0ID0gdGhpcy5teU5leHQucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubXlOZXh0ID0gbmV3IEhhbmRzaGFrZVJlY2VpdmVyKAorICAgICAgICAgICAgbXlDb250ZXh0LAorICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5zb2NrZXQoKS5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksCisgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLmdldFBvcnQoKSwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkVycm9yKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubXlOZXh0ID0gdGhpcy5teU5leHQuaGFuZGxlRXJyb3Ioc29ja2V0Q2hhbm5lbCwgZXgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvV29ya2luZ1JlY2VpdmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvV29ya2luZ1JlY2VpdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NmRlNQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9Xb3JraW5nUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5TaGFyZWRUb3JyZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlclVJRDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlBlZXJNZXNzYWdlOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgV29ya2luZ1JlY2VpdmVyIGltcGxlbWVudHMgRGF0YVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihXb3JraW5nUmVjZWl2ZXIuY2xhc3MpOworICAvLzE2IGJ5dGVzIGlzIHN1ZmZpY2llbnQgZm9yIGFsbCB0b3JyZW50cyBtZXNzYWdlcyBleGNlcHQgYml0ZmllbGQgYW5kIHBpZWNlLgorICAvL1NvIHBpZWNlIGFuZCBiaXRmaWVsZCBoYXZlIGR5bmFtaWMgc2l6ZSBiZWNhdXNlIGJ5dGVidWZmZXIgZm9yIHRoaXMgbWVzc2FnZXMgd2lsbCBiZSBhbGxvY2F0ZWQgYWZ0ZXIgZ2V0IG1lc3NhZ2UgbGVuZ3RoCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZfQlVGRkVSX1NJWkUgPSAxNjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9NRVNTQUdFX1NJWkUgPSAyICogMTAyNCAqIDEwMjQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBQZWVyVUlEIG15UGVlclVJRDsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG15Q29udGV4dDsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1lc3NhZ2VCeXRlczsKKyAgcHJpdmF0ZSBpbnQgcHN0ckxlbmd0aDsKKworICBXb3JraW5nUmVjZWl2ZXIoUGVlclVJRCBwZWVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB7CisgICAgbXlQZWVyVUlEID0gcGVlcklkOworICAgIG15Q29udGV4dCA9IGNvbnRleHQ7CisKKyAgICB0aGlzLm1lc3NhZ2VCeXRlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoREVGX0JVRkZFUl9TSVpFKTsKKyAgICB0aGlzLnBzdHJMZW5ndGggPSAtMTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YVByb2Nlc3NvciBwcm9jZXNzQW5kR2V0TmV4dChCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvZ2dlci50cmFjZSgicmVjZWl2ZWQgZGF0YSBmcm9tIGNoYW5uZWwiLCBzb2NrZXRDaGFubmVsKTsKKyAgICBpZiAocHN0ckxlbmd0aCA9PSAtMSkgeworICAgICAgbWVzc2FnZUJ5dGVzLmxpbWl0KFBlZXJNZXNzYWdlLk1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUpOworICAgICAgZmluYWwgaW50IHJlYWQ7CisgICAgICB0cnkgeworICAgICAgICByZWFkID0gc29ja2V0Q2hhbm5lbC5yZWFkKG1lc3NhZ2VCeXRlcyk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vU29tZSBjbGllbnRzIGNsb3NlIGNvbm5lY3Rpb24gc28gdGhhdCBqYXZhIHRocm93cyBJT0V4Y2VwdGlvbiAiQW4gZXhpc3RpbmcgY29ubmVjdGlvbiB3YXMgZm9yY2libHkgY2xvc2VkIGJ5IHRoZSByZW1vdGUgaG9zdCIKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJ1bmFibGUgdG8gcmVhZCBkYXRhIGZyb20gY2hhbm5lbCAiICsgc29ja2V0Q2hhbm5lbCwgZSk7CisgICAgICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKG15UGVlclVJRCwgbXlDb250ZXh0KS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZWFkIDwgMCkgeworICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5uZWwge30gaXMgY2xvc2VkIGJ5IG90aGVyIHBlZXIiLCBzb2NrZXRDaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgICAgfQorICAgICAgaWYgKG1lc3NhZ2VCeXRlcy5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHRoaXMucHN0ckxlbmd0aCA9IG1lc3NhZ2VCeXRlcy5nZXRJbnQoMCk7CisgICAgICBsb2dnZXIudHJhY2UoInJlYWQgb2YgbWVzc2FnZSBsZW5ndGggZmluaXNoZWQsIE1lc3NhZ2UgbGVuZ3RoIGlzIHt9IiwgdGhpcy5wc3RyTGVuZ3RoKTsKKworICAgICAgaWYgKHRoaXMucHN0ckxlbmd0aCA+IE1BWF9NRVNTQUdFX1NJWkUpIHsKKyAgICAgICAgbG9nZ2VyLndhcm4oIlByb3Bvc2VkIGxpbWl0IG9mIHt9IGlzIGxhcmdlciB0aGFuIG1heCBtZXNzYWdlIHNpemUge30iLAorICAgICAgICAgICAgICAgIFBlZXJNZXNzYWdlLk1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyB0aGlzLnBzdHJMZW5ndGgsIE1BWF9NRVNTQUdFX1NJWkUpOworICAgICAgICBsb2dnZXIud2FybigiY3VycmVudCBieXRlcyBpbiBidWZmZXIgaXMge30iLCBBcnJheXMudG9TdHJpbmcobWVzc2FnZUJ5dGVzLmFycmF5KCkpKTsKKyAgICAgICAgbG9nZ2VyLndhcm4oIkNsb3NlIGNvbm5lY3Rpb24gd2l0aCBwZWVyIHt9IiwgbXlQZWVyVUlEKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChQZWVyTWVzc2FnZS5NRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgdGhpcy5wc3RyTGVuZ3RoID4gbWVzc2FnZUJ5dGVzLmNhcGFjaXR5KCkpIHsKKyAgICAgIEJ5dGVCdWZmZXIgb2xkID0gbWVzc2FnZUJ5dGVzOworICAgICAgb2xkLnJld2luZCgpOworICAgICAgbWVzc2FnZUJ5dGVzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShQZWVyTWVzc2FnZS5NRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgdGhpcy5wc3RyTGVuZ3RoKTsKKyAgICAgIG1lc3NhZ2VCeXRlcy5wdXQob2xkKTsKKyAgICB9CisKKyAgICBtZXNzYWdlQnl0ZXMubGltaXQoUGVlck1lc3NhZ2UuTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIHRoaXMucHN0ckxlbmd0aCk7CisKKyAgICBsb2dnZXIudHJhY2UoInRyeSByZWFkIGRhdGEgZnJvbSB7fSIsIHNvY2tldENoYW5uZWwpOworICAgIGludCByZWFkQnl0ZXM7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRCeXRlcyA9IHNvY2tldENoYW5uZWwucmVhZChtZXNzYWdlQnl0ZXMpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKG15UGVlclVJRCwgbXlDb250ZXh0KS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisgICAgaWYgKHJlYWRCeXRlcyA8IDApIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbm5lbCB7fSBpcyBjbG9zZWQgYnkgb3RoZXIgcGVlciIsIHNvY2tldENoYW5uZWwpOworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKyAgICBpZiAobWVzc2FnZUJ5dGVzLmhhc1JlbWFpbmluZygpKSB7CisgICAgICBsb2dnZXIudHJhY2UoImJ1ZmZlciBpcyBub3QgZnVsbCwgY29udGludWUgcmVhZGluZy4uLiIpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGxvZ2dlci50cmFjZSgiZmluaXNoZWQgcmVhZCBkYXRhIGZyb20ge30iLCBzb2NrZXRDaGFubmVsKTsKKworICAgIG1lc3NhZ2VCeXRlcy5yZXdpbmQoKTsKKyAgICB0aGlzLnBzdHJMZW5ndGggPSAtMTsKKworICAgIGZpbmFsIFNoYXJpbmdQZWVyIHBlZXIgPSBteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCkuZ2V0U2hhcmluZ1BlZXIobXlQZWVyVUlEKTsKKworICAgIGZpbmFsIFN0cmluZyBoZXhJbmZvSGFzaCA9IHBlZXIuZ2V0SGV4SW5mb0hhc2goKTsKKyAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQgPSBteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkuZ2V0VG9ycmVudChoZXhJbmZvSGFzaCk7CisgICAgaWYgKHRvcnJlbnQgPT0gbnVsbCB8fCAhbXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmhhc1RvcnJlbnQoaGV4SW5mb0hhc2gpKSB7CisgICAgICBsb2dnZXIuZGVidWcoInRvcnJlbnQgd2l0aCBoYXNoIHt9IGZvciBwZWVyIHt9IGRvZXNuJ3QgZm91bmQgaW4gc3RvcmFnZS4gTWF5YmUgc29tZWJvZHkgZGVsZXRlcyBpdCBtYW51YWxseSIsIGhleEluZm9IYXNoLCBwZWVyKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKG15UGVlclVJRCwgbXlDb250ZXh0KS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisKKyAgICBsb2dnZXIudHJhY2UoInRyeSBwYXJzZSBtZXNzYWdlIGZyb20ge30uIFRvcnJlbnQge30iLCBwZWVyLCB0b3JyZW50KTsKKyAgICBCeXRlQnVmZmVyIGJ1ZmZlckNvcHkgPSBCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZihtZXNzYWdlQnl0ZXMuYXJyYXkoKSwgbWVzc2FnZUJ5dGVzLmxpbWl0KCkpKTsKKworICAgIHRoaXMubWVzc2FnZUJ5dGVzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShERUZfQlVGRkVSX1NJWkUpOworICAgIGZpbmFsIFBlZXJNZXNzYWdlIG1lc3NhZ2U7CisKKyAgICB0cnkgeworICAgICAgbWVzc2FnZSA9IFBlZXJNZXNzYWdlLnBhcnNlKGJ1ZmZlckNvcHksIHRvcnJlbnQpOworICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiaW5jb3JyZWN0IG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGZyb20gcGVlciB7fSIsIHBlZXIsIGUpOworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKworICAgIGxvZ2dlci50cmFjZSgiZ2V0IG1lc3NhZ2Uge30gZnJvbSB7fSIsIG1lc3NhZ2UsIHNvY2tldENoYW5uZWwpOworCisgICAgdHJ5IHsKKyAgICAgIG15Q29udGV4dC5nZXRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgZmluYWwgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgIGZpbmFsIFN0cmluZyBvbGROYW1lID0gY3VycmVudFRocmVhZC5nZXROYW1lKCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1cnJlbnRUaHJlYWQuc2V0TmFtZShvbGROYW1lICsgIiBoYW5kbGUgbWVzc2FnZSBmb3IgdG9ycmVudCAiICsgbXlQZWVyVUlELmdldFRvcnJlbnRIYXNoKCkgKyAiIHBlZXI6ICIgKyBwZWVyLmdldEhvc3RJZGVudGlmaWVyKCkpOworICAgICAgICAgICAgcGVlci5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuaGFuZGxlZCBleGNlcHRpb24ge30gaW4gZXhlY3V0b3IgdGFzayAoaGFuZGxlTWVzc2FnZSkiLCBlLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJyZW50VGhyZWFkLnNldE5hbWUob2xkTmFtZSk7CisgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidGFzayBzdWJtaXQgaXMgZmFpbGVkLiBSZWFzb246IHt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YVByb2Nlc3NvciBoYW5kbGVFcnJvcihCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsLCBUaHJvd2FibGUgZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9NZXNzYWdlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThjYTMzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL01lc3NhZ2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuUGVlck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCisvKioKKyAqIEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgd2FudCB0byByZWNlaXZlIGluY29taW5nIG1lc3NhZ2VzCisgKiBmcm9tIHBlZXJzLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisgIHZvaWQgaGFuZGxlTWVzc2FnZShQZWVyTWVzc2FnZSBtc2cpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1BlZXJBY3Rpdml0eUxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvUGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZlODg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1BlZXJBY3Rpdml0eUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKworLyoqCisgKiBFdmVudExpc3RlbmVyIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHdhbnQgdG8gaGFuZGxlIHBlZXIgYWN0aXZpdHkKKyAqIGV2ZW50cyBsaWtlIHBpZWNlIGF2YWlsYWJpbGl0eSwgb3IgcGllY2UgY29tcGxldGlvbiBldmVudHMsIGFuZCBtb3JlLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlZXJBY3Rpdml0eUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIFBlZXIgY2hva2VkIGhhbmRsZXIuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGhhbmRsZXIgaXMgZmlyZWQgd2hlbiBhIHBlZXIgY2hva2VkIGFuZCBub3cgcmVmdXNlcyB0byBzZW5kIGRhdGEgdG8KKyAgICogdXMuIFRoaXMgbWVhbnMgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gcmVxdWVzdCBvciBleHBlY3QgYW55dGhpbmcgZnJvbSBpdAorICAgKiB1bnRpbCBpdCBiZWNvbWVzIHJlYWR5IGFnYWluLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyIFRoZSBwZWVyIHRoYXQgY2hva2VkLgorICAgKi8KKyAgdm9pZCBoYW5kbGVQZWVyQ2hva2VkKFNoYXJpbmdQZWVyIHBlZXIpOworCisgIC8qKgorICAgKiBQZWVyIHJlYWR5IGhhbmRsZXIuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGhhbmRsZXIgaXMgZmlyZWQgd2hlbiBhIHBlZXIgbm90aWZpZWQgdGhhdCBpdCBpcyBubyBsb25nZXIgY2hva2VkLgorICAgKiBUaGlzIG1lYW5zIHdlIGNhbiBzZW5kIHBpZWNlIGJsb2NrIHJlcXVlc3RzIHRvIGl0IGFuZCBzdGFydCBkb3dubG9hZGluZy4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciB0aGF0IGJlY2FtZSByZWFkeS4KKyAgICovCisgIHZvaWQgaGFuZGxlUGVlclJlYWR5KFNoYXJpbmdQZWVyIHBlZXIpOworCisgIC8qKgorICAgKiBQaWVjZSBhdmFpbGFiaWxpdHkgaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGFuIHVwZGF0ZSBpbiBwaWVjZSBhdmFpbGFiaWxpdHkgaXMgcmVjZWl2ZWQKKyAgICogZnJvbSBhIHBlZXIncyBIQVZFIG1lc3NhZ2UuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgIFRoZSBwZWVyIHdlIGdvdCB0aGUgdXBkYXRlIGZyb20uCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgdGhhdCBiZWNhbWUgYXZhaWxhYmxlIGZyb20gdGhpcyBwZWVyLgorICAgKi8KKyAgdm9pZCBoYW5kbGVQaWVjZUF2YWlsYWJpbGl0eShTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSk7CisKKyAgLyoqCisgICAqIEJpdCBmaWVsZCBhdmFpbGFiaWxpdHkgaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGFuIHVwZGF0ZSBpbiBwaWVjZSBhdmFpbGFiaWxpdHkgaXMgcmVjZWl2ZWQKKyAgICogZnJvbSBhIHBlZXIncyBCSVRGSUVMRCBtZXNzYWdlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyICAgICAgICAgICAgVGhlIHBlZXIgd2UgZ290IHRoZSB1cGRhdGUgZnJvbS4KKyAgICogQHBhcmFtIGF2YWlsYWJsZVBpZWNlcyBUaGUgcGllY2VzIGF2YWlsYWJpbGl0eSBiaXQgZmllbGQgb2YgdGhlIHBlZXIuCisgICAqLworICB2b2lkIGhhbmRsZUJpdGZpZWxkQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyk7CisKKyAgLyoqCisgICAqIFBpZWNlIHVwbG9hZCBjb21wbGV0aW9uIGhhbmRsZXIuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGhhbmRsZXIgaXMgZmlyZWQgd2hlbiBhIHBpZWNlIGhhcyBiZWVuIHVwbG9hZGVkIGVudGlyZWx5IHRvIGEgcGVlci4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgVGhlIHBlZXIgdGhlIHBpZWNlIHdhcyBzZW50IHRvLgorICAgKiBAcGFyYW0gcGllY2UgVGhlIHBpZWNlIGluIHF1ZXN0aW9uLgorICAgKi8KKyAgdm9pZCBoYW5kbGVQaWVjZVNlbnQoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpOworCisgIC8qKgorICAgKiBQaWVjZSBkb3dubG9hZCBjb21wbGV0aW9uIGhhbmRsZXIuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGhhbmRsZXIgaXMgZmlyZWQgd2hlbiBhIHBpZWNlIGhhcyBiZWVuIGRvd25sb2FkZWQgZW50aXJlbHkgYW5kIHRoZQorICAgKiBwaWVjZSBkYXRhIGhhcyBiZWVuIHJldmFsaWRhdGVkLgorICAgKiA8L3A+CisgICAqCisgICAqIDxwPgorICAgKiA8Yj5Ob3RlOjwvYj4gdGhlIHBpZWNlIG1heSA8ZW0+bm90PC9lbT4gYmUgdmFsaWQgYWZ0ZXIgaXQgaGFzIGJlZW4KKyAgICogZG93bmxvYWRlZCwgaW4gd2hpY2ggY2FzZSBhcHByb3ByaWF0ZSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHRvCisgICAqIHJlZG93bmxvYWQgdGhlIHBpZWNlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyICBUaGUgcGVlciB3ZSBnb3QgdGhpcyBwaWVjZSBmcm9tLgorICAgKiBAcGFyYW0gcGllY2UgVGhlIHBpZWNlIGluIHF1ZXN0aW9uLgorICAgKi8KKyAgdm9pZCBoYW5kbGVQaWVjZUNvbXBsZXRlZChTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFBlZXIgZGlzY29ubmVjdGlvbiBoYW5kbGVyLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBoYW5kbGVyIGlzIGZpcmVkIHdoZW4gYSBwZWVyIGRpc2Nvbm5lY3RzLCBvciBpcyBkaXNjb25uZWN0ZWQgZHVlIHRvCisgICAqIHByb3RvY29sIHZpb2xhdGlvbi4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciB3ZSBnb3QgdGhpcyBwaWVjZSBmcm9tLgorICAgKi8KKyAgdm9pZCBoYW5kbGVQZWVyRGlzY29ubmVjdGVkKFNoYXJpbmdQZWVyIHBlZXIpOworCisgIC8qKgorICAgKiBIYW5kbGVyIGZvciBJT0V4Y2VwdGlvbiBkdXJpbmcgcGVlciBvcGVyYXRpb24uCisgICAqCisgICAqIEBwYXJhbSBwZWVyIFRoZSBwZWVyIHdob3NlIGFjdGl2aXR5IHRyaWdnZXIgdGhlIGV4Y2VwdGlvbi4KKyAgICogQHBhcmFtIGlvZSAgVGhlIElPRXhjZXB0aW9uIG9iamVjdCwgZm9yIHJlcG9ydGluZy4KKyAgICovCisgIHZvaWQgaGFuZGxlSU9FeGNlcHRpb24oU2hhcmluZ1BlZXIgcGVlciwgSU9FeGNlcHRpb24gaW9lKTsKKworCisgIHZvaWQgaGFuZGxlTmV3UGVlckNvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKTsKKworICB2b2lkIGFmdGVyUGVlclJlbW92ZWQoU2hhcmluZ1BlZXIgcGVlcik7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9SYXRlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvUmF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjg4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvUmF0ZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXI7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworCisvKioKKyAqIEEgZGF0YSBleGNoYW5nZSByYXRlIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIDxwPgorICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8ga2VlcCB0cmFjaywgYW5kIGNvbXBhcmUsIG9mIHRoZSBkYXRhIGV4Y2hhbmdlCisgKiByYXRlIChlaXRoZXIgZG93bmxvYWQgb3IgdXBsb2FkKSB3aXRoIGEgcGVlci4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFJhdGUgaW1wbGVtZW50cyBDb21wYXJhYmxlPFJhdGU+IHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UmF0ZT4gUkFURV9DT01QQVJBVE9SID0KKyAgICAgICAgICBuZXcgUmF0ZUNvbXBhcmF0b3IoKTsKKworICBwcml2YXRlIGxvbmcgYnl0ZXMgPSAwOworICBwcml2YXRlIGxvbmcgcmVzZXQgPSAwOworICBwcml2YXRlIGxvbmcgbGFzdCA9IDA7CisKKyAgLyoqCisgICAqIEFkZCBhIGJ5dGUgY291bnQgdG8gdGhlIGN1cnJlbnQgbWVhc3VyZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIGV4Y2hhbmdlZCBzaW5jZSB0aGUgbGFzdCByZXNldC4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQobG9uZyBjb3VudCkgeworICAgIHRoaXMuYnl0ZXMgKz0gY291bnQ7CisgICAgaWYgKHRoaXMucmVzZXQgPT0gMCkgeworICAgICAgdGhpcy5yZXNldCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKyAgICB0aGlzLmxhc3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGN1cnJlbnQgcmF0ZS4KKyAgICoKKyAgICogPHA+CisgICAqIFRoZSBleGNoYW5nZSByYXRlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZXhjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CisgICAqIHJlc2V0IGFuZCB0aGUgbGFzdCBpbnB1dC4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBmbG9hdCBnZXQoKSB7CisgICAgaWYgKHRoaXMubGFzdCAtIHRoaXMucmVzZXQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuYnl0ZXMgLyAoKHRoaXMubGFzdCAtIHRoaXMucmVzZXQpIC8gMTAwMC4wZik7CisgIH0KKworICAvKioKKyAgICogUmVzZXQgdGhlIG1lYXN1cmVtZW50LgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgeworICAgIHRoaXMuYnl0ZXMgPSAwOworICAgIHRoaXMucmVzZXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0aGlzLmxhc3QgPSB0aGlzLnJlc2V0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFJhdGUgb3RoZXIpIHsKKyAgICByZXR1cm4gUkFURV9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgb3RoZXIpOworICB9CisKKyAgLyoqCisgICAqIEEgcmF0ZSBjb21wYXJhdG9yLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbXBhcmF0b3IgdG8gc29ydCBwZWVycyBieSBhbiBleGNoYW5nZSByYXRlLAorICAgKiBjb21wYXJpbmcgdHdvIHJhdGVzIGFuZCByZXR1cm5pbmcgYW4gYXNjZW5kaW5nIG9yZGVyaW5nLgorICAgKiA8L3A+CisgICAqCisgICAqIDxwPgorICAgKiA8Yj5Ob3RlOjwvYj4gd2UgbmVlZCB0byBtYWtlIHN1cmUgaGVyZSB0aGF0IHdlIGRvbid0IHJldHVybiAwLCB3aGljaAorICAgKiB3b3VsZCBwcm92aWRlIGFuIG9yZGVyaW5nIHRoYXQgaXMgaW5jb25zaXN0ZW50IHdpdGgKKyAgICogPGNvZGU+ZXF1YWxzKCk8L2NvZGU+J3MgYmVoYXZpb3IsIGFuZCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvcgorICAgKiBmb3Igc29ydGVkIGNvbGxlY3Rpb25zIHVzaW5nIHRoaXMgY29tcGFyYXRvci4KKyAgICogPC9wPgorICAgKgorICAgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJhdGVDb21wYXJhdG9yCisgICAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhdG9yPFJhdGU+LCBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzI0NjAyMzMwMDM2MDBMOworCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gcmF0ZXMgdG9nZXRoZXIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjb21wYXJlcyBmbG9hdCwgYnV0IHdlIGRvbid0IGNhcmUgdG9vIG11Y2ggYWJvdXQKKyAgICAgKiByb3VuZGluZyBlcnJvcnMuIEl0J3MganVzdCB0byBvcmRlciBwZWVycyBzbyBzdXBlci1zdHJpY3QgcmF0ZSBiYXNlZAorICAgICAqIG9yZGVyIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYQorICAgICAqIEBwYXJhbSBiCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlKFJhdGUgYSwgUmF0ZSBiKSB7CisgICAgICBpZiAoYS5nZXQoKSA+IGIuZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9TaGFyaW5nUGVlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1NoYXJpbmdQZWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiM2IzNAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9TaGFyaW5nUGVlci5qYXZhCkBAIC0wLDAgKzEsODA3IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBlZXJJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNoYXJlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5QZWVyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLldyaXRlTGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Xcml0ZVRhc2s7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCisKKy8qKgorICogQSBwZWVyIGV4Y2hhbmdpbmcgb24gYSB0b3JyZW50IHdpIHRoIHRoZSBCaXRUb3JyZW50IGNsaWVudC4KKyAqIOaVsOaNruS6pOaNogorICogPHAvPgorICogPHA+CisgKiBBIFNoYXJpbmdQZWVyIGV4dGVuZHMgdGhlIGJhc2UgUGVlciBjbGFzcyB3aXRoIGFsbCB0aGUgZGF0YSBhbmQgbG9naWMgbmVlZGVkCisgKiBieSB0aGUgQml0VG9ycmVudCBjbGllbnQgdG8gaW50ZXJhY3Qgd2l0aCBhIHBlZXIgZXhjaGFuZ2luZyBvbiB0aGUgc2FtZQorICogdG9ycmVudC4KKyAqIDwvcD4KKyAqIDxwLz4KKyAqIDxwPgorICogUGVlcnMgYXJlIGRlZmluZWQgYnkgdGhlaXIgcGVlciBJRCwgSVAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIsIGp1c3QgbGlrZQorICogYmFzZSBwZWVycy4gUGVlcnMgd2UgZXhjaGFuZ2Ugd2l0aCBhbHNvIGNvbnRhaW4gZm91ciBjcnVjaWFsIGF0dHJpYnV0ZXM6CisgKiA8L3A+CisgKiA8cC8+CisgKiA8dWw+CisgKiA8bGk+PGNvZGU+Y2hva2luZzwvY29kZT4sIHdoaWNoIG1lYW5zIHdlIGFyZSBjaG9raW5nIHRoaXMgcGVlciBhbmQgd2UncmUKKyAqIG5vdCB3aWxsaW5nIHRvIHNlbmQgaGltIGFueXRoaW5nIGZvciBub3c7PC9saT4KKyAqIDxsaT48Y29kZT5pbnRlcmVzdGluZzwvY29kZT4sIHdoaWNoIG1lYW5zIHdlIGFyZSBpbnRlcmVzdGVkIGluIGEgcGllY2UKKyAqIHRoaXMgcGVlciBoYXM7PC9saT4KKyAqIDxsaT48Y29kZT5jaG9rZWQ8L2NvZGU+LCBpZiB0aGlzIHBlZXIgaXMgY2hva2luZyBhbmQgd29uJ3Qgc2VuZCB1cworICogYW55dGhpbmcgcmlnaHQgbm93OzwvbGk+CisgKiA8bGk+PGNvZGU+aW50ZXJlc3RlZDwvY29kZT4sIGlmIHRoaXMgcGVlciBpcyBpbnRlcmVzdGVkIGluIHNvbWV0aGluZyB3ZQorICogaGF2ZS48L2xpPgorICogPC91bD4KKyAqIDxwLz4KKyAqIDxwPgorICogUGVlcnMgc3RhcnQgY2hva2VkIGFuZCB1bmludGVyZXN0ZWQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBTaGFyaW5nUGVlciBleHRlbmRzIFBlZXIgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIsIFBlZXJJbmZvcm1hdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaGFyaW5nUGVlci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgYXZhaWxhYmxlUGllY2VzTG9jazsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNob2tpbmc7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpbnRlcmVzdGluZzsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNob2tlZDsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGludGVyZXN0ZWQ7CisgIHByaXZhdGUgZmluYWwgU2hhcmVkVG9ycmVudCB0b3JyZW50OworICBwcml2YXRlIGZpbmFsIEJpdFNldCBhdmFpbGFibGVQaWVjZXM7CisgIHByaXZhdGUgQml0U2V0IHBvb3JseUF2YWlsYWJsZVBpZWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8UGllY2UsIEludGVnZXI+IG15UmVxdWVzdGVkUGllY2VzOworCisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkb3dubG9hZGluZzsKKworICBwcml2YXRlIGZpbmFsIFJhdGUgZG93bmxvYWQ7CisgIHByaXZhdGUgZmluYWwgUmF0ZSB1cGxvYWQ7CisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBkb3dubG9hZGVkUGllY2VzQ291bnQ7CisgIHByaXZhdGUgZmluYWwgTGlzdDxQZWVyQWN0aXZpdHlMaXN0ZW5lcj4gbGlzdGVuZXJzOworCisgIHByaXZhdGUgZmluYWwgT2JqZWN0IHJlcXVlc3RzTG9jazsKKworICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNTdG9wcGVkOworCisgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbDsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBjbGllbnRJZGVudGlmaWVyOworICBwcml2YXRlIGZpbmFsIGludCBjbGllbnRWZXJzaW9uOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgc2hhcmluZyBwZWVyIG9uIGEgZ2l2ZW4gdG9ycmVudC4KKyAgICogIEBwYXJhbSBpcCAgICAgIFRoZSBwZWVyJ3MgSVAgYWRkcmVzcy4KKyAgICogQHBhcmFtIHBvcnQgICAgVGhlIHBlZXIncyBwb3J0LgorICAgKiBAcGFyYW0gcGVlcklkICBUaGUgYnl0ZS1lbmNvZGVkIHBlZXIgSUQuCisgICAqIEBwYXJhbSB0b3JyZW50IFRoZSB0b3JyZW50IHRoaXMgcGVlciBleGNoYW5nZXMgd2l0aCB1cyBvbi4KKyAgICogQHBhcmFtIGNsaWVudElkZW50aWZpZXIKKyAgICogQHBhcmFtIGNsaWVudFZlcnNpb24KKyAgICovCisgIHB1YmxpYyBTaGFyaW5nUGVlcihTdHJpbmcgaXAsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgcGVlcklkLAorICAgICAgICAgICAgICAgICAgICAgU2hhcmVkVG9ycmVudCB0b3JyZW50LAorICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICBQZWVyQWN0aXZpdHlMaXN0ZW5lciBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICBCeXRlQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgeworICAgIHN1cGVyKGlwLCBwb3J0LCBwZWVySWQpOworCisgICAgdGhpcy50b3JyZW50ID0gdG9ycmVudDsKKyAgICB0aGlzLmNsaWVudElkZW50aWZpZXIgPSBjbGllbnRJZGVudGlmaWVyOworICAgIHRoaXMuY2xpZW50VmVyc2lvbiA9IGNsaWVudFZlcnNpb247CisgICAgdGhpcy5saXN0ZW5lcnMgPSBBcnJheXMuYXNMaXN0KGNsaWVudCwgdG9ycmVudCk7CisgICAgdGhpcy5hdmFpbGFibGVQaWVjZXMgPSBuZXcgQml0U2V0KHRvcnJlbnQuZ2V0UGllY2VDb3VudCgpKTsKKyAgICB0aGlzLnBvb3JseUF2YWlsYWJsZVBpZWNlcyA9IG5ldyBCaXRTZXQodG9ycmVudC5nZXRQaWVjZUNvdW50KCkpOworCisgICAgdGhpcy5yZXF1ZXN0c0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgdGhpcy5zb2NrZXRDaGFubmVsID0gY2hhbm5lbDsKKyAgICB0aGlzLmlzU3RvcHBlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICB0aGlzLmF2YWlsYWJsZVBpZWNlc0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgdGhpcy5teVJlcXVlc3RlZFBpZWNlcyA9IG5ldyBIYXNoTWFwPFBpZWNlLCBJbnRlZ2VyPigpOworICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPSBjb25uZWN0aW9uTWFuYWdlcjsKKyAgICB0aGlzLmRvd25sb2FkID0gbmV3IFJhdGUoKTsKKyAgICB0aGlzLnVwbG9hZCA9IG5ldyBSYXRlKCk7CisgICAgdGhpcy5zZXRUb3JyZW50SGFzaCh0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgIHRoaXMuY2hva2luZyA9IHRydWU7CisgICAgdGhpcy5pbnRlcmVzdGluZyA9IGZhbHNlOworICAgIHRoaXMuY2hva2VkID0gdHJ1ZTsKKyAgICB0aGlzLmludGVyZXN0ZWQgPSBmYWxzZTsKKyAgICB0aGlzLmRvd25sb2FkaW5nID0gZmFsc2U7CisgICAgdGhpcy5kb3dubG9hZGVkUGllY2VzQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICB9CisKKyAgcHVibGljIFJhdGUgZ2V0RExSYXRlKCkgeworICAgIHJldHVybiB0aGlzLmRvd25sb2FkOworICB9CisKKyAgcHVibGljIFJhdGUgZ2V0VUxSYXRlKCkgeworICAgIHJldHVybiB0aGlzLnVwbG9hZDsKKyAgfQorCisgIC8qKgorICAgKiBDaG9rZSB0aGlzIHBlZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFdlIGRvbid0IHdhbnQgdG8gdXBsb2FkIHRvIHRoaXMgcGVlciBhbnltb3JlLCBzbyBtYXJrIHRoYXQgd2UncmUgY2hva2luZworICAgKiBmcm9tIHRoaXMgcGVlci4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgY2hva2UoKSB7CisgICAgaWYgKCF0aGlzLmNob2tpbmcpIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiQ2hva2luZyB7fSIsIHRoaXMpOworICAgICAgdGhpcy5zZW5kKFBlZXJNZXNzYWdlLkNob2tlTWVzc2FnZS5jcmFmdCgpKTsKKyAgICAgIHRoaXMuY2hva2luZyA9IHRydWU7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SWQoKSB7CisgICAgcmV0dXJuIGdldFBlZXJJZEFycmF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDbGllbnRJZGVudGlmaWVyKCkgeworICAgIHJldHVybiBjbGllbnRJZGVudGlmaWVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0Q2xpZW50VmVyc2lvbigpIHsKKyAgICByZXR1cm4gY2xpZW50VmVyc2lvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKCkgeworICAgIGZpcmVQZWVyQ29ubmVjdGVkKCk7CisgICAgQml0U2V0IHBpZWNlcyA9IHRoaXMudG9ycmVudC5nZXRDb21wbGV0ZWRQaWVjZXMoKTsKKyAgICBpZiAocGllY2VzLmNhcmRpbmFsaXR5KCkgPiAwKSB7CisgICAgICB0aGlzLnNlbmQoUGVlck1lc3NhZ2UuQml0ZmllbGRNZXNzYWdlLmNyYWZ0KHBpZWNlcykpOworICAgIH0KKyAgICByZXNldFJhdGVzKCk7CisgIH0KKworICAvKioKKyAgICogVW5jaG9rZSB0aGlzIHBlZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIE1hcmsgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGNob2tpbmcgZnJvbSB0aGlzIHBlZXIgYW5kIGNhbiByZXN1bWUKKyAgICogdXBsb2FkaW5nIHRvIGl0LgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgdm9pZCB1bmNob2tlKCkgeworICAgIGxvZ2dlci50cmFjZSgiVW5jaG9raW5nIHt9IiwgdGhpcyk7CisgICAgdGhpcy5zZW5kKFBlZXJNZXNzYWdlLlVuY2hva2VNZXNzYWdlLmNyYWZ0KCkpOworICAgIHRoaXMuY2hva2luZyA9IGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNDaG9raW5nKCkgeworICAgIHJldHVybiB0aGlzLmNob2tpbmc7CisgIH0KKworICBwdWJsaWMgdm9pZCBpbnRlcmVzdGluZygpIHsKKyAgICBpZiAoIXRoaXMuaW50ZXJlc3RpbmcpIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiVGVsbGluZyB7fSB3ZSdyZSBpbnRlcmVzdGVkLiIsIHRoaXMpOworICAgICAgdGhpcy5zZW5kKFBlZXJNZXNzYWdlLkludGVyZXN0ZWRNZXNzYWdlLmNyYWZ0KCkpOworICAgICAgdGhpcy5pbnRlcmVzdGluZyA9IHRydWU7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgbm90SW50ZXJlc3RpbmcoKSB7CisgICAgaWYgKHRoaXMuaW50ZXJlc3RpbmcpIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiVGVsbGluZyB7fSB3ZSdyZSBubyBsb25nZXIgaW50ZXJlc3RlZC4iLCB0aGlzKTsKKyAgICAgIHRoaXMuc2VuZChQZWVyTWVzc2FnZS5Ob3RJbnRlcmVzdGVkTWVzc2FnZS5jcmFmdCgpKTsKKyAgICAgIHRoaXMuaW50ZXJlc3RpbmcgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0aW5nKCkgeworICAgIHJldHVybiB0aGlzLmludGVyZXN0aW5nOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNDaG9rZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuY2hva2VkOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmVzdGVkKCkgeworICAgIHJldHVybiB0aGlzLmludGVyZXN0ZWQ7CisgIH0KKworICBwdWJsaWMgQml0U2V0IGdldFBvb3JseUF2YWlsYWJsZVBpZWNlcygpIHsKKyAgICByZXR1cm4gcG9vcmx5QXZhaWxhYmxlUGllY2VzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBwaWVjZXMgZnJvbSB0aGlzIHBlZXIuCisgICAqCisgICAqIEByZXR1cm4gQSBjbG9uZSBvZiB0aGUgYXZhaWxhYmxlIHBpZWNlcyBiaXQgZmllbGQgZnJvbSB0aGlzIHBlZXIuCisgICAqLworICBwdWJsaWMgQml0U2V0IGdldEF2YWlsYWJsZVBpZWNlcygpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXZhaWxhYmxlUGllY2VzTG9jaykgeworICAgICAgcmV0dXJuIChCaXRTZXQpIHRoaXMuYXZhaWxhYmxlUGllY2VzLmNsb25lKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgcGllY2UsIGlmIGFueS4KKyAgICovCisgIHB1YmxpYyBTZXQ8UGllY2U+IGdldFJlcXVlc3RlZFBpZWNlcygpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RzTG9jaykgeworICAgICAgcmV0dXJuIG15UmVxdWVzdGVkUGllY2VzLmtleVNldCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2V0UmF0ZXMoKSB7CisgICAgdGhpcy5kb3dubG9hZC5yZXNldCgpOworICAgIHRoaXMudXBsb2FkLnJlc2V0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwaWVjZURvd25sb2FkZWQoKSB7CisgICAgZG93bmxvYWRlZFBpZWNlc0NvdW50LmluY3JlbWVudEFuZEdldCgpOworICB9CisKKyAgcHVibGljIGludCBnZXREb3dubG9hZGVkUGllY2VzQ291bnQoKSB7CisgICAgcmV0dXJuIGRvd25sb2FkZWRQaWVjZXNDb3VudC5nZXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGVlciBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiB0aHJvdWdoIGEgcGVlciBleGNoYW5nZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworICAgIHJldHVybiB0aGlzLnNvY2tldENoYW5uZWwuaXNPcGVuKCk7CisgIH0KKworICAvKioKKyAgICogVW5iaW5kIGFuZCBkaXNjb25uZWN0IHRoaXMgcGVlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVGhpcyB0ZXJtaW5hdGVzIHRoZSBldmVudHVhbGx5IHByZXNlbnQgYW5kL29yIGNvbm5lY3RlZCBwZWVyIGV4Y2hhbmdlCisgICAqIHdpdGggdGhlIHBlZXIgYW5kIGZpcmVzIHRoZSBwZWVyIGRpc2Nvbm5lY3RlZCBldmVudCB0byBhbnkgcGVlciBhY3Rpdml0eQorICAgKiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBvbiB0aGlzIHBlZXIuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGZvcmNlIEZvcmNlIHVuYmluZCB3aXRob3V0IHNlbmRpbmcgY2FuY2VsIHJlcXVlc3RzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdW5iaW5kKGJvb2xlYW4gZm9yY2UpIHsKKyAgICBpZiAoaXNTdG9wcGVkLmdldEFuZFNldCh0cnVlKSkKKyAgICAgIHJldHVybjsKKworICAgIHRyeSB7CisgICAgICBjb25uZWN0aW9uTWFuYWdlci5jbG9zZUNoYW5uZWwoc29ja2V0Q2hhbm5lbCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiY2Fubm90IGNsb3NlIHNvY2tldCBjaGFubmVsLiBQZWVyIHt9IiwgdGhpcywgZSk7CisgICAgfQorCisgICAgdGhpcy5maXJlUGVlckRpc2Nvbm5lY3RlZCgpOworCisgICAgc3luY2hyb25pemVkIChyZXF1ZXN0c0xvY2spIHsKKyAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBteVJlcXVlc3RlZFBpZWNlcy5zaXplKCkgPiAwOworICAgICAgbXlSZXF1ZXN0ZWRQaWVjZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB0aGlzLmFmdGVyUGVlckRpc2Nvbm5lY3RlZCgpOworICB9CisKKyAgLyoqCisgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBwZWVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBEZWxpdmVyeSBvZiB0aGUgbWVzc2FnZSBjYW4gb25seSBoYXBwZW4gaWYgdGhlIHBlZXIgaXMgY29ubmVjdGVkLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHJlbW90ZSBwZWVyIHRocm91Z2ggb3VyIHBlZXIKKyAgICogICAgICAgICAgICAgICAgZXhjaGFuZ2UuCisgICAqLworICBwdWJsaWMgdm9pZCBzZW5kKFBlZXJNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgIGxvZ2dlci50cmFjZSgiU2VuZGluZyBtc2cge30gdG8ge30iLCBtZXNzYWdlLmdldFR5cGUoKSwgdGhpcyk7CisgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeworICAgICAgQnl0ZUJ1ZmZlciBkYXRhID0gbWVzc2FnZS5nZXREYXRhKCk7CisgICAgICBkYXRhLnJld2luZCgpOworICAgICAgY29ubmVjdGlvbk1hbmFnZXIub2ZmZXJXcml0ZShuZXcgV3JpdGVUYXNrKHNvY2tldENoYW5uZWwsIGRhdGEsIG5ldyBXcml0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Xcml0ZUZhaWxlZChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uKXsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhtZXNzYWdlLCBlKTsKKyAgICAgICAgICAgIHVuYmluZCh0cnVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsIG1lc3NhZ2UsIGUpOworICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uV3JpdGVEb25lKCkgeworICAgICAgICB9CisgICAgICB9KSwgMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiQXR0ZW1wdGluZyB0byBzZW5kIGEgbWVzc2FnZSB0byBub24tY29ubmVjdGVkIHBlZXIge30hIiwgdGhpcyk7CisgICAgICB1bmJpbmQodHJ1ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERvd25sb2FkIHRoZSBnaXZlbiBwaWVjZSBmcm9tIHRoaXMgcGVlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogU3RhcnRzIGEgYmxvY2sgcmVxdWVzdCBxdWV1ZSBhbmQgcHJlLWZpbGwgaXQgd2l0aCBNQVhfUElQRUxJTkVEX1JFUVVFU1RTCisgICAqIGJsb2NrIHJlcXVlc3RzLgorICAgKiA8L3A+CisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIEZ1cnRoZXIgcmVxdWVzdHMgd2lsbCBiZSBhZGRlZCwgb25lIGJ5IG9uZSwgZXZlcnkgdGltZSBhIGJsb2NrIGlzCisgICAqIHJldHVybmVkLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgY2hvc2VuIHRvIGJlIGRvd25sb2FkZWQgZnJvbSB0aGlzIHBlZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBkb3dubG9hZFBpZWNlKGZpbmFsIFBpZWNlIHBpZWNlKQorICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgIExpc3Q8UGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U+IHRvU2VuZCA9IG5ldyBBcnJheUxpc3Q8UGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2U+KCk7CisgICAgc3luY2hyb25pemVkICh0aGlzLnJlcXVlc3RzTG9jaykgeworICAgICAgaWYgKG15UmVxdWVzdGVkUGllY2VzLmNvbnRhaW5zS2V5KHBpZWNlKSkgeworICAgICAgICAvL2FscmVhZHkgcmVxdWVzdGVkCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGludCByZXF1ZXN0ZWRCbG9ja3NDb3VudCA9IDA7CisgICAgICBpbnQgbGFzdFJlcXVlc3RlZE9mZnNldCA9IDA7CisgICAgICB3aGlsZSAobGFzdFJlcXVlc3RlZE9mZnNldCA8IHBpZWNlLnNpemUoKSkgeworICAgICAgICBQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZSByZXF1ZXN0ID0gUGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAuY3JhZnQocGllY2UuZ2V0SW5kZXgoKSwgbGFzdFJlcXVlc3RlZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKChpbnQpIChwaWVjZS5zaXplKCkgLSBsYXN0UmVxdWVzdGVkT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2UuREVGQVVMVF9SRVFVRVNUX1NJWkUpKTsKKyAgICAgICAgdG9TZW5kLmFkZChyZXF1ZXN0KTsKKyAgICAgICAgcmVxdWVzdGVkQmxvY2tzQ291bnQrKzsKKyAgICAgICAgbGFzdFJlcXVlc3RlZE9mZnNldCA9IHJlcXVlc3QuZ2V0TGVuZ3RoKCkgKyBsYXN0UmVxdWVzdGVkT2Zmc2V0OworICAgICAgfQorICAgICAgbXlSZXF1ZXN0ZWRQaWVjZXMucHV0KHBpZWNlLCByZXF1ZXN0ZWRCbG9ja3NDb3VudCk7CisgICAgICB0aGlzLmRvd25sb2FkaW5nID0gbXlSZXF1ZXN0ZWRQaWVjZXMuc2l6ZSgpID4gMDsKKyAgICB9CisgICAgZm9yIChQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZSByZXF1ZXN0TWVzc2FnZSA6IHRvU2VuZCkgeworICAgICAgdGhpcy5zZW5kKHJlcXVlc3RNZXNzYWdlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkaW5nKCkgeworICAgIHJldHVybiB0aGlzLmRvd25sb2FkaW5nOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZSB0aGUgUkVRVUVTVCBtZXNzYWdlIGZyb20gdGhlIHJlcXVlc3QgcGlwZWxpbmUgbWF0Y2hpbmcgdGhpcworICAgKiBQSUVDRSBtZXNzYWdlLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBVcG9uIHJlY2VwdGlvbiBvZiBhIHBpZWNlIGJsb2NrIHdpdGggYSBQSUVDRSBtZXNzYWdlLCByZW1vdmUgdGhlCisgICAqIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBmcm9tIHRoZSBwaXBlbGluZSB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXh0IGJsb2NrCisgICAqIHJlcXVlc3RzLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2Ugb2YgUElFQ0UgbWVzc2FnZSByZWNlaXZlZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCByZW1vdmVCbG9ja1JlcXVlc3QoZmluYWwgUGllY2UgcGllY2UpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMucmVxdWVzdHNMb2NrKSB7CisgICAgICBJbnRlZ2VyIHJlcXVlc3RlZEJsb2Nrc0NvdW50ID0gbXlSZXF1ZXN0ZWRQaWVjZXMuZ2V0KHBpZWNlKTsKKyAgICAgIGlmIChyZXF1ZXN0ZWRCbG9ja3NDb3VudCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChyZXF1ZXN0ZWRCbG9ja3NDb3VudCA8PSAxKSB7CisgICAgICAgIC8vaXQncyBsYXN0IGJsb2NrCisgICAgICAgIG15UmVxdWVzdGVkUGllY2VzLnJlbW92ZShwaWVjZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBteVJlcXVlc3RlZFBpZWNlcy5wdXQocGllY2UsIHJlcXVlc3RlZEJsb2Nrc0NvdW50IC0gMSk7CisgICAgICB9CisgICAgICB0aGlzLmRvd25sb2FkaW5nID0gbXlSZXF1ZXN0ZWRQaWVjZXMuc2l6ZSgpID4gMDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2FuY2VsIGFsbCBwZW5kaW5nIHJlcXVlc3RzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGlzIHF1ZXVlcyBDQU5DRUwgbWVzc2FnZXMgZm9yIGFsbCB0aGUgcmVxdWVzdHMgaW4gdGhlIHF1ZXVlLCBhbmQKKyAgICogcmV0dXJucyB0aGUgbGlzdCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgaW4gdGhlIHF1ZXVlLgorICAgKiA8L3A+CisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIElmIG5vIHJlcXVlc3QgcXVldWUgZXhpc3RlZCwgb3IgaWYgaXQgd2FzIGVtcHR5LCBhbiBlbXB0eSBzZXQgb2YgcmVxdWVzdAorICAgKiBtZXNzYWdlcyBpcyByZXR1cm5lZC4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZ1JlcXVlc3RzKCkgeworICAgIGNhbmNlbFBlbmRpbmdSZXF1ZXN0cyhudWxsKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNhbmNlbFBlbmRpbmdSZXF1ZXN0cyhATnVsbGFibGUgZmluYWwgUGllY2UgcGllY2UpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMucmVxdWVzdHNMb2NrKSB7CisgICAgICBpZiAocGllY2UgIT0gbnVsbCkgeworICAgICAgICBteVJlcXVlc3RlZFBpZWNlcy5yZW1vdmUocGllY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXlSZXF1ZXN0ZWRQaWVjZXMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBteVJlcXVlc3RlZFBpZWNlcy5zaXplKCkgPiAwOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nUmVxdWVzdGVkUGllY2VzKGZpbmFsIFBpZWNlIHBpZWNlKSB7CisgICAgc3luY2hyb25pemVkICh0aGlzLnJlcXVlc3RzTG9jaykgeworICAgICAgSW50ZWdlciByZXF1ZXN0ZWRCbG9ja3NDb3VudCA9IG15UmVxdWVzdGVkUGllY2VzLmdldChwaWVjZSk7CisgICAgICBpZiAocmVxdWVzdGVkQmxvY2tzQ291bnQgPT0gbnVsbCkgcmV0dXJuIDA7CisgICAgICByZXR1cm4gcmVxdWVzdGVkQmxvY2tzQ291bnQ7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhhbmRsZSBhbiBpbmNvbWluZyBtZXNzYWdlIGZyb20gdGhpcyBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gbXNnIFRoZSBpbmNvbWluZywgcGFyc2VkIG1lc3NhZ2UuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShQZWVyTWVzc2FnZSBtc2cpIHsKKy8vICAgIGxvZ2dlci50cmFjZSgiUmVjZWl2ZWQgbXNnIHt9IGZyb20ge30iLCBtc2cuZ2V0VHlwZSgpLCB0aGlzKTsKKyAgICBpZiAoaXNTdG9wcGVkLmdldCgpKQorICAgICAgcmV0dXJuOworICAgIGlmICghdG9ycmVudC5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgIHRvcnJlbnQuaW5pdElmTmVjZXNzYXJ5KHRoaXMpOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZy5nZXRUeXBlKCkpIHsKKyAgICAgIGNhc2UgS0VFUF9BTElWRToKKyAgICAgICAgLy8gTm90aGluZyB0byBkbywgd2UncmUga2VlcGluZyB0aGUgY29ubmVjdGlvbiBvcGVuIGFueXdheXMuCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDSE9LRToKKyAgICAgICAgdGhpcy5jaG9rZWQgPSB0cnVlOworICAgICAgICB0aGlzLmZpcmVQZWVyQ2hva2VkKCk7CisgICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVTkNIT0tFOgorICAgICAgICB0aGlzLmNob2tlZCA9IGZhbHNlOworICAgICAgICBsb2dnZXIudHJhY2UoIlBlZXIge30gaXMgbm93IGFjY2VwdGluZyByZXF1ZXN0cy4iLCB0aGlzKTsKKyAgICAgICAgdGhpcy5maXJlUGVlclJlYWR5KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJTlRFUkVTVEVEOgorICAgICAgICB0aGlzLmludGVyZXN0ZWQgPSB0cnVlOworICAgICAgICBpZiAodGhpcy5jaG9raW5nKSB7CisgICAgICAgICAgdW5jaG9rZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOT1RfSU5URVJFU1RFRDoKKyAgICAgICAgdGhpcy5pbnRlcmVzdGVkID0gZmFsc2U7CisgICAgICAgIGlmICghaW50ZXJlc3RpbmcpIHsKKyAgICAgICAgICB1bmJpbmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBVkU6CisgICAgICAgIC8vIFJlY29yZCB0aGlzIHBlZXIgaGFzIHRoZSBnaXZlbiBwaWVjZQorICAgICAgICBQZWVyTWVzc2FnZS5IYXZlTWVzc2FnZSBoYXZlID0gKFBlZXJNZXNzYWdlLkhhdmVNZXNzYWdlKSBtc2c7CisgICAgICAgIFBpZWNlIGhhdmVQaWVjZSA9IHRoaXMudG9ycmVudC5nZXRQaWVjZShoYXZlLmdldFBpZWNlSW5kZXgoKSk7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmF2YWlsYWJsZVBpZWNlc0xvY2spIHsKKyAgICAgICAgICB0aGlzLmF2YWlsYWJsZVBpZWNlcy5zZXQoaGF2ZVBpZWNlLmdldEluZGV4KCkpOworICAgICAgICAgIGxvZ2dlci50cmFjZSgiUGVlciB7fSBub3cgaGFzIHt9IFt7fS97fV0uIiwKKyAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVBpZWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZVBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcnJlbnQuZ2V0UGllY2VDb3VudCgpCisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlyZVBpZWNlQXZhaWxhYml0eShoYXZlUGllY2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQklURklFTEQ6CisgICAgICAgIC8vIEF1Z21lbnQgdGhlIGhhc1BpZWNlIGJpdCBmaWVsZCBmcm9tIHRoaXMgQklURklFTEQgbWVzc2FnZQorICAgICAgICBQZWVyTWVzc2FnZS5CaXRmaWVsZE1lc3NhZ2UgYml0ZmllbGQgPQorICAgICAgICAgICAgICAgIChQZWVyTWVzc2FnZS5CaXRmaWVsZE1lc3NhZ2UpIG1zZzsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXZhaWxhYmxlUGllY2VzTG9jaykgeworICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzLm9yKGJpdGZpZWxkLmdldEJpdGZpZWxkKCkpOworICAgICAgICAgIGxvZ2dlci50cmFjZSgiUmVjb3JkZWQgYml0ZmllbGQgZnJvbSB7fSB3aXRoIHt9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAicGllY2VzKHMpIFt7fS97fV0uIiwKKyAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0ZmllbGQuZ2V0Qml0ZmllbGQoKS5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZVBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcnJlbnQuZ2V0UGllY2VDb3VudCgpCisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlyZUJpdGZpZWxkQXZhaWxhYml0eSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVRVUVTVDoKKyAgICAgICAgUGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKFBlZXJNZXNzYWdlLlJlcXVlc3RNZXNzYWdlKSBtc2c7CisgICAgICAgIGxvZ2dlci50cmFjZSgiR290IHJlcXVlc3QgbWVzc2FnZSBmb3Ige30gKHt9IHt9QHt9KSBmcm9tIHt9IiwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhUb3JyZW50VXRpbHMuZ2V0VG9ycmVudEZpbGVOYW1lcyh0b3JyZW50KS50b0FycmF5KCkpLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGllY2UoKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldExlbmd0aCgpLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgdGhpcworICAgICAgICB9KTsKKyAgICAgICAgUGllY2UgcnAgPSB0aGlzLnRvcnJlbnQuZ2V0UGllY2UocmVxdWVzdC5nZXRQaWVjZSgpKTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgY2hva2luZyBmcm9tIHRoaXMgcGVlciBhbmQgaXQgc3RpbGwgc2VuZHMgdXMKKyAgICAgICAgLy8gcmVxdWVzdHMsIGl0IGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBCaXRUb3JyZW50IHByb3RvY29sLgorICAgICAgICAvLyBTaW1pbGFybHksIGlmIHRoZSBwZWVyIHJlcXVlc3RzIGEgcGllY2Ugd2UgZG9uJ3QgaGF2ZSwgaXQKKyAgICAgICAgLy8gaXMgYSB2aW9sYXRpb24gb2YgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wuIEluIHRoZXNlCisgICAgICAgIC8vIHNpdHVhdGlvbiwgdGVybWluYXRlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICBpZiAoIXJwLmlzVmFsaWQoKSkgeworICAgICAgICAgIGxvZ2dlci53YXJuKCJQZWVyIHt9IHZpb2xhdGVkIHByb3RvY29sLCB0ZXJtaW5hdGluZyBleGNoYW5nZTogIiArIHRoaXMuaXNDaG9raW5nKCkgKyAiICIgKyBycC5pc1ZhbGlkKCksIHRoaXMpOworICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TGVuZ3RoKCkgPgorICAgICAgICAgICAgICAgIFBlZXJNZXNzYWdlLlJlcXVlc3RNZXNzYWdlLk1BWF9SRVFVRVNUX1NJWkUpIHsKKyAgICAgICAgICBsb2dnZXIud2FybigiUGVlciB7fSByZXF1ZXN0ZWQgYSBibG9jayB0b28gYmlnLCB0ZXJtaW5hdGluZyBleGNoYW5nZS4iLCB0aGlzKTsKKyAgICAgICAgICB0aGlzLnVuYmluZCh0cnVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYWdyZWUgdG8gc2VuZCB0aGUgcmVxdWVzdGVkIHBpZWNlIGJsb2NrIHRvCisgICAgICAgIC8vIHRoZSByZW1vdGUgcGVlciwgc28gbGV0J3MgcXVldWUgYSBtZXNzYWdlIHdpdGggdGhhdCBibG9jaworICAgICAgICB0cnkgeworCisgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXJGb3JNZXNzYWdlID0gUGVlck1lc3NhZ2UuUGllY2VNZXNzYWdlLmNyZWF0ZUJ1ZmZlcldpdGhIZWFkZXJGb3JNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQaWVjZSgpLCByZXF1ZXN0LmdldE9mZnNldCgpLCByZXF1ZXN0LmdldExlbmd0aCgpKTsKKworICAgICAgICAgIHJwLnJlYWQocmVxdWVzdC5nZXRPZmZzZXQoKSwgcmVxdWVzdC5nZXRMZW5ndGgoKSwgYnVmZmVyRm9yTWVzc2FnZSk7CisKKyAgICAgICAgICB0aGlzLnNlbmQoUGVlck1lc3NhZ2UuUGllY2VNZXNzYWdlLmNyYWZ0KHJlcXVlc3QuZ2V0UGllY2UoKSwKKyAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0T2Zmc2V0KCksIGJ1ZmZlckZvck1lc3NhZ2UpKTsKKyAgICAgICAgICB0aGlzLnVwbG9hZC5hZGQocmVxdWVzdC5nZXRMZW5ndGgoKSk7CisKKyAgICAgICAgICBpZiAocmVxdWVzdC5nZXRPZmZzZXQoKSArIHJlcXVlc3QuZ2V0TGVuZ3RoKCkgPT0gcnAuc2l6ZSgpKSB7CisgICAgICAgICAgICB0aGlzLmZpcmVQaWVjZVNlbnQocnApOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJlcnJvciIsIGlvZSk7CisgICAgICAgICAgdGhpcy5maXJlSU9FeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHNlbmRpbmcgcGllY2UgYmxvY2sgcmVxdWVzdCEiLCBpb2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQSUVDRToKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBpbmNvbWluZyBwaWVjZSBibG9jay4KKworICAgICAgICAvLyBTaG91bGQgd2Uga2VlcCB0cmFjayBvZiB0aGUgcmVxdWVzdGVkIHBpZWNlcyBhbmQgYWN0IHdoZW4gd2UKKyAgICAgICAgLy8gZ2V0IGEgcGllY2Ugd2UgZGlkbid0IGFzayBmb3IsIG9yIHNob3VsZCB3ZSBqdXN0IHN0YXkKKyAgICAgICAgLy8gZ3JlZWR5PworICAgICAgICBQZWVyTWVzc2FnZS5QaWVjZU1lc3NhZ2UgcGllY2UgPSAoUGVlck1lc3NhZ2UuUGllY2VNZXNzYWdlKSBtc2c7CisgICAgICAgIFBpZWNlIHAgPSB0aGlzLnRvcnJlbnQuZ2V0UGllY2UocGllY2UuZ2V0UGllY2UoKSk7CisKKyAgICAgICAgbG9nZ2VyLnRyYWNlKCJHb3QgcGllY2UgKHt9IHt9QHt9KSBmcm9tIHt9IiwgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgIHAuZ2V0SW5kZXgoKSwKKyAgICAgICAgICAgICAgICBwLnNpemUoKSwKKyAgICAgICAgICAgICAgICBwaWVjZS5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICB0aGlzCisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuZG93bmxvYWQuYWRkKHBpZWNlLmdldEJsb2NrKCkuY2FwYWNpdHkoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBib29sZWFuIGlzUGllY2VEb3dubG9hZGVkID0gZmFsc2U7CisgICAgICAgICAgc3luY2hyb25pemVkIChwKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0IHF1ZXVlIHRvCisgICAgICAgICAgICAvLyAgbWFrZSByb29tIGZvciBuZXh0IGJsb2NrIHJlcXVlc3RzLgorICAgICAgICAgICAgdGhpcy5yZW1vdmVCbG9ja1JlcXVlc3QocCk7CisgICAgICAgICAgICBpZiAocC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgdGhpcy5jYW5jZWxQZW5kaW5nUmVxdWVzdHMocCk7CisgICAgICAgICAgICAgIHRoaXMuZmlyZVBlZXJSZWFkeSgpOworICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkRpc2NhcmRpbmcgYmxvY2sgZm9yIGFscmVhZHkgY29tcGxldGVkICIgKyBwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1RPRE8gYWRkIHByb3BlciBjYXRjaCBmb3IgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHAucmVjb3JkKHBpZWNlLmdldEJsb2NrKCksIHBpZWNlLmdldE9mZnNldCgpKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIG9mZnNldCBlcXVhbHMgdGhlIHBpZWNlIHNpemUgYW5kIHRoZSBibG9jaworICAgICAgICAgICAgLy8gbGVuZ3RoIGlzIDAsIGl0IG1lYW5zIHRoZSBwaWVjZSBoYXMgYmVlbiBlbnRpcmVseQorICAgICAgICAgICAgLy8gZG93bmxvYWRlZC4gSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIG5vdGhpbmcgdG8gc2F2ZSwgYnV0CisgICAgICAgICAgICAvLyB3ZSBzaG91bGQgdmFsaWRhdGUgdGhlIHBpZWNlLgorICAgICAgICAgICAgaWYgKGdldFJlbWFpbmluZ1JlcXVlc3RlZFBpZWNlcyhwKSA9PSAwKSB7CisgICAgICAgICAgICAgIHRoaXMuZmlyZVBpZWNlQ29tcGxldGVkKHApOworICAgICAgICAgICAgICBpc1BpZWNlRG93bmxvYWRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpc1BpZWNlRG93bmxvYWRlZCkgeworICAgICAgICAgICAgZmlyZVBlZXJSZWFkeSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgbG9nZ2VyLmVycm9yKGlvZS5nZXRNZXNzYWdlKCksIGlvZSk7CisgICAgICAgICAgdGhpcy5maXJlSU9FeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHN0b3JpbmcgcmVjZWl2ZWQgcGllY2UgYmxvY2shIiwgaW9lKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBTkNFTDoKKyAgICAgICAgLy8gTm8gbmVlZCB0byBzdXBwb3J0CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBwZWVyIGNob2tlZCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciB0aGF0IGNob2NrZWQuCisgICAqIDwvcD4KKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlUGVlckNob2tlZCgpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZVBlZXJDaG9rZWQodGhpcyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBlZXIgcmVhZHkgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgdGhhdCB1bmNob2tlZCBvciBiZWNhbWUgcmVhZHkuCisgICAqIDwvcD4KKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlUGVlclJlYWR5KCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGVlclJlYWR5KHRoaXMpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBwaWVjZSBhdmFpbGFiaWxpdHkgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgKHRoaXMpLCBhbmQgdGhlIHBpZWNlIHRoYXQgYmVjYW1lIGF2YWlsYWJsZS4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVQaWVjZUF2YWlsYWJpdHkoUGllY2UgcGllY2UpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZVBpZWNlQXZhaWxhYmlsaXR5KHRoaXMsIHBpZWNlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgYml0IGZpZWxkIGF2YWlsYWJpbGl0eSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSBwZWVyICh0aGlzKSwgYW5kIHRoZSBiaXQgZmllbGQgb2YgYXZhaWxhYmxlIHBpZWNlcworICAgKiBmcm9tIHRoaXMgcGVlci4KKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlQml0ZmllbGRBdmFpbGFiaXR5KCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlQml0ZmllbGRBdmFpbGFiaWxpdHkodGhpcywKKyAgICAgICAgICAgICAgdGhpcy5nZXRBdmFpbGFibGVQaWVjZXMoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBpZWNlIHNlbnQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgKHRoaXMpLCBhbmQgdGhlIHBpZWNlIG51bWJlciB0aGF0IHdhcworICAgKiBzZW50IHRvIHRoZSBwZWVyLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgY29tcGxldGVkIHBpZWNlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVQaWVjZVNlbnQoUGllY2UgcGllY2UpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZVBpZWNlU2VudCh0aGlzLCBwaWVjZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBpZWNlIGNvbXBsZXRpb24gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgKHRoaXMpLCBhbmQgdGhlIHBpZWNlIG51bWJlciB0aGF0IHdhcworICAgKiBjb21wbGV0ZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBpZWNlIFRoZSBjb21wbGV0ZWQgcGllY2UuCisgICAqLworICBwcml2YXRlIHZvaWQgZmlyZVBpZWNlQ29tcGxldGVkKFBpZWNlIHBpZWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGllY2VDb21wbGV0ZWQodGhpcywgcGllY2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBwZWVyIGRpc2Nvbm5lY3RlZCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciB0aGF0IGRpc2Nvbm5lY3RlZCAodGhpcykuCisgICAqIDwvcD4KKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlUGVlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZVBlZXJEaXNjb25uZWN0ZWQodGhpcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFmdGVyUGVlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmFmdGVyUGVlclJlbW92ZWQodGhpcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGZpcmVQZWVyQ29ubmVjdGVkKCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlTmV3UGVlckNvbm5lY3RlZCh0aGlzKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgSU9FeGNlcHRpb24gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIHByb2JsZW0sIGFuZCB0aGUKKyAgICogZXhjZXB0aW9uIG9iamVjdC4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVJT0V4Y2VwdGlvbihJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICBmb3IgKFBlZXJBY3Rpdml0eUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKKyAgICAgIGxpc3RlbmVyLmhhbmRsZUlPRXhjZXB0aW9uKHRoaXMsIGlvZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIFNoYXJlZFRvcnJlbnQgZ2V0VG9ycmVudCgpIHsKKyAgICByZXR1cm4gdGhpcy50b3JyZW50OworICB9CisKKyAgcHVibGljIGludCBnZXREb3dubG9hZGluZ1BpZWNlc0NvdW50KCkgeworICAgIHN5bmNocm9uaXplZCAocmVxdWVzdHNMb2NrKSB7CisgICAgICByZXR1cm4gbXlSZXF1ZXN0ZWRQaWVjZXMuc2l6ZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEb3dubG9hZCByYXRlIGNvbXBhcmF0b3IuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIENvbXBhcmVzIHNoYXJpbmcgcGVlcnMgYmFzZWQgb24gdGhlaXIgY3VycmVudCBkb3dubG9hZCByYXRlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBhdXRob3IgbXBldGF6em9uaQorICAgKiBAc2VlIFJhdGUuUmF0ZUNvbXBhcmF0b3IKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRExSYXRlQ29tcGFyYXRvcgorICAgICAgICAgIGltcGxlbWVudHMgQ29tcGFyYXRvcjxTaGFyaW5nUGVlcj4sIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NjMwNzIyOTk2NDczMEw7CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2hhcmluZ1BlZXIgYSwgU2hhcmluZ1BlZXIgYikgeworICAgICAgcmV0dXJuIFJhdGUuUkFURV9DT01QQVJBVE9SLmNvbXBhcmUoYS5nZXRETFJhdGUoKSwgYi5nZXRETFJhdGUoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvU2hhcmluZ1BlZXJJbmZvLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvU2hhcmluZ1BlZXJJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkMjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9TaGFyaW5nUGVlckluZm8uamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBAYXV0aG9yIFNlcmdleS5QYWsKKyAqIERhdGU6IDgvOS8xMworICogVGltZTogNjo0MCBQTQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNoYXJpbmdQZWVySW5mbyB7CisKKyAgU3RyaW5nIGdldElwKCk7CisKKyAgaW50IGdldFBvcnQoKTsKKworICBUb3JyZW50SGFzaCBnZXRUb3JyZW50SGFzaCgpOworCisgIEJ5dGVCdWZmZXIgZ2V0UGVlcklkKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9FbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9FbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzFhMzJjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0VtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworcHVibGljIGNsYXNzIEVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeSBpbXBsZW1lbnRzIFBpZWNlU3RvcmFnZUZhY3RvcnkgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeSgpOworCisgIHByaXZhdGUgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5KCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQaWVjZVN0b3JhZ2UgY3JlYXRlU3RvcmFnZShUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEsIFRvcnJlbnRCeXRlU3RvcmFnZSBieXRlU3RvcmFnZSkgeworICAgIHJldHVybiBuZXcgUGllY2VTdG9yYWdlSW1wbCgKKyAgICAgICAgICAgIGJ5dGVTdG9yYWdlLAorICAgICAgICAgICAgbmV3IEJpdFNldChtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpKSwKKyAgICAgICAgICAgIG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCksCisgICAgICAgICAgICBtZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpCisgICAgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcwMGJlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEZpbGU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworLyoqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgcmVhZCBhbGwgcGllY2VzIGZyb20gc3RvcmFnZSBhbmQgY29tcGFyZSBoYXNoZXMgb2YgcGllY2VzIHdpdGggcmVhbGx5IGhhc2hlZAorICogZnJvbSBtZXRhZGF0YQorICovCitwdWJsaWMgY2xhc3MgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkgaW1wbGVtZW50cyBQaWVjZVN0b3JhZ2VGYWN0b3J5IHsKKworICBwdWJsaWMgZmluYWwgc3RhdGljIEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5KCk7CisKKyAgcHJpdmF0ZSBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeSgpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGllY2VTdG9yYWdlIGNyZWF0ZVN0b3JhZ2UoVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhLCBUb3JyZW50Qnl0ZVN0b3JhZ2UgYnl0ZVN0b3JhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9uZyB0b3RhbFNpemUgPSAwOworICAgIGZvciAoVG9ycmVudEZpbGUgZmlsZSA6IG1ldGFkYXRhLmdldEZpbGVzKCkpIHsKKyAgICAgIHRvdGFsU2l6ZSArPSBmaWxlLnNpemU7CisgICAgfQorCisgICAgYnl0ZVN0b3JhZ2Uub3BlbihmYWxzZSk7CisgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IG5ldyBCaXRTZXQobWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSk7CisgICAgdHJ5IHsKKyAgICAgIGlmICghYnl0ZVN0b3JhZ2UuaXNCbGFuaygpKSB7CisgICAgICAgIGludCBwaWVjZUxlbmd0aCA9IG1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IChsb25nKSBpICogcGllY2VMZW5ndGg7CisgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICBpZiAodG90YWxTaXplIC0gcG9zaXRpb24gPiBwaWVjZUxlbmd0aCkgeworICAgICAgICAgICAgbGVuID0gcGllY2VMZW5ndGg7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9IChpbnQpICh0b3RhbFNpemUgLSBwb3NpdGlvbik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghYnl0ZVN0b3JhZ2UuaXNCbGFuayhwb3NpdGlvbiwgbGVuKSkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGxlbik7CisgICAgICAgICAgICBieXRlU3RvcmFnZS5yZWFkKGJ1ZmZlciwgcG9zaXRpb24pOworICAgICAgICAgICAgYnl0ZVtdIGV4cGVjdGVkSGFzaCA9IEFycmF5cy5jb3B5T2ZSYW5nZShtZXRhZGF0YS5nZXRQaWVjZXNIYXNoZXMoKSwgaSAqIENvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkUsIChpICsgMSkgKiBDb25zdGFudHMuUElFQ0VfSEFTSF9TSVpFKTsKKyAgICAgICAgICAgIGJ5dGVbXSBhY3R1YWxIYXNoID0gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKGJ1ZmZlci5hcnJheSgpKTsKKyAgICAgICAgICAgIGlmIChBcnJheXMuZXF1YWxzKGV4cGVjdGVkSGFzaCwgYWN0dWFsSGFzaCkpIHsKKyAgICAgICAgICAgICAgYXZhaWxhYmxlUGllY2VzLnNldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgYnl0ZVN0b3JhZ2UuY2xvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFBpZWNlU3RvcmFnZUltcGwoCisgICAgICAgICAgICBieXRlU3RvcmFnZSwKKyAgICAgICAgICAgIGF2YWlsYWJsZVBpZWNlcywKKyAgICAgICAgICAgIG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCksCisgICAgICAgICAgICBtZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpCisgICAgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVDb2xsZWN0aW9uU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVDb2xsZWN0aW9uU3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2UzZTQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZUNvbGxlY3Rpb25TdG9yYWdlLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEZpbGU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBNdWx0aS1maWxlIHRvcnJlbnQgYnl0ZSBzdG9yYWdlLgorICoKKyAqIDxwPgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdG9ycmVudCBieXRlIHN0b3JhZ2UgcHJvdmlkZXMgc3VwcG9ydCBmb3IKKyAqIG11bHRpLWZpbGUgdG9ycmVudHMgYW5kIGNvbXBsZXRlbHkgYWJzdHJhY3RzIHRoZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgZnJvbQorICogdGhlIG5vdGlvbiBvZiBkaWZmZXJlbnQgZmlsZXMuIFRoZSBieXRlIHN0b3JhZ2UgaXMgcmVwcmVzZW50ZWQgYXMgb25lCisgKiBjb250aW51b3VzIGJ5dGUgc3RvcmFnZSwgZGlyZWN0bHkgYWNjZXNzaWJsZSBieSBvZmZzZXQgcmVnYXJkbGVzcyBvZiB3aGljaAorICogZmlsZSB0aGlzIG9mZnNldCBsYW5kcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBhdXRob3IgZGdpZmZpbgorICovCitwdWJsaWMgY2xhc3MgRmlsZUNvbGxlY3Rpb25TdG9yYWdlIGltcGxlbWVudHMgVG9ycmVudEJ5dGVTdG9yYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmlsZUNvbGxlY3Rpb25TdG9yYWdlLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZVN0b3JhZ2U+IGZpbGVzOworICBwcml2YXRlIGZpbmFsIGxvbmcgc2l6ZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG15SXNPcGVuOworCisgIC8qKgorICAgKiBJbml0aWFsaXplIGEgbmV3IG11bHRpLWZpbGUgdG9ycmVudCBieXRlIHN0b3JhZ2UuCisgICAqCisgICAqIEBwYXJhbSBmaWxlcyBUaGUgbGlzdCBvZiBpbmRpdmlkdWFsIHtAbGluayBGaWxlU3RvcmFnZX0KKyAgICogICAgICAgICAgICAgIG9iamVjdHMgbWFraW5nIHVwIHRoZSB0b3JyZW50LgorICAgKiBAcGFyYW0gc2l6ZSAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHRvcnJlbnQgZGF0YSwgaW4gYnl0ZXMuCisgICAqLworICBwdWJsaWMgRmlsZUNvbGxlY3Rpb25TdG9yYWdlKExpc3Q8RmlsZVN0b3JhZ2U+IGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSkgeworICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKKyAgICB0aGlzLnNpemUgPSBzaXplOworCisgICAgbG9nZ2VyLmRlYnVnKCJJbml0aWFsaXplZCB0b3JyZW50IGJ5dGUgc3RvcmFnZSBvbiB7fSBmaWxlKHMpICIgKworICAgICAgICAgICAgIih7fSB0b3RhbCBieXRlKHMpKS4iLCBmaWxlcy5zaXplKCksIHNpemUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBGaWxlQ29sbGVjdGlvblN0b3JhZ2UgY3JlYXRlKFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSwgRmlsZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCFwYXJlbnQuaXNEaXJlY3RvcnkoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwYXJlbnQgZGlyZWN0b3J5ISIpOworICAgIH0KKyAgICBMaXN0PEZpbGVTdG9yYWdlPiBmaWxlcyA9IG5ldyBMaW5rZWRMaXN0PEZpbGVTdG9yYWdlPigpOworICAgIGxvbmcgb2Zmc2V0ID0gMEw7CisgICAgbG9uZyB0b3RhbFNpemUgPSAwOworICAgIGZvciAoVG9ycmVudEZpbGUgZmlsZSA6IG1ldGFkYXRhLmdldEZpbGVzKCkpIHsKKyAgICAgIEZpbGUgYWN0dWFsID0gbmV3IEZpbGUocGFyZW50LCBmaWxlLmdldFJlbGF0aXZlUGF0aEFzU3RyaW5nKCkpOworCisgICAgICBpZiAoIWFjdHVhbC5nZXRDYW5vbmljYWxQYXRoKCkuc3RhcnRzV2l0aChwYXJlbnQuZ2V0Q2Fub25pY2FsUGF0aCgpKSkgeworICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlRvcnJlbnQgZmlsZSBwYXRoIGF0dGVtcHRlZCAiICsKKyAgICAgICAgICAgICAgICAidG8gYnJlYWsgZGlyZWN0b3J5IGphaWwhIik7CisgICAgICB9CisKKyAgICAgIGlmICghYWN0dWFsLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSAmJiAhYWN0dWFsLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3JpZXMgIiArIGFjdHVhbC5nZXRQYXJlbnQoKSArICIgZm9yIHN0b3JpbmcgdG9ycmVudCBmaWxlICIgKyBhY3R1YWwuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGZpbGVzLmFkZChuZXcgRmlsZVN0b3JhZ2UoYWN0dWFsLCBvZmZzZXQsIGZpbGUuc2l6ZSkpOworICAgICAgb2Zmc2V0ICs9IGZpbGUuc2l6ZTsKKyAgICAgIHRvdGFsU2l6ZSArPSBmaWxlLnNpemU7CisgICAgfQorICAgIHJldHVybiBuZXcgRmlsZUNvbGxlY3Rpb25TdG9yYWdlKGZpbGVzLCB0b3RhbFNpemUpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oZmluYWwgYm9vbGVhbiBzZWVkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChGaWxlU3RvcmFnZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgIGlmICghZmlsZS5pc09wZW4oKSkKKyAgICAgICAgZmlsZS5vcGVuKHNlZWRlcik7CisgICAgfQorICAgIG15SXNPcGVuID0gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHJlcXVlc3RlZCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKyAgICBpbnQgYnl0ZXMgPSAwOworCisgICAgZm9yIChGaWxlT2Zmc2V0IGZvIDogdGhpcy5zZWxlY3QocG9zaXRpb24sIHJlcXVlc3RlZCkpIHsKKyAgICAgIC8vIFRPRE86IHJlbW92ZSBjYXN0IHRvIGludCB3aGVuIGxhcmdlIEJ5dGVCdWZmZXIgc3VwcG9ydCBpcworICAgICAgLy8gaW1wbGVtZW50ZWQgaW4gSmF2YS4KKyAgICAgIGJ1ZmZlci5saW1pdCgoaW50KSAoYnVmZmVyLnBvc2l0aW9uKCkgKyBmby5sZW5ndGgpKTsKKyAgICAgIGJ5dGVzICs9IGZvLmZpbGUucmVhZChidWZmZXIsIGZvLm9mZnNldCk7CisgICAgfQorCisgICAgaWYgKGJ5dGVzIDwgcmVxdWVzdGVkKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0b3JhZ2UgY29sbGVjdGlvbiByZWFkIHVuZGVycnVuISIpOworICAgIH0KKworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgYnVmZmVyLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCByZXF1ZXN0ZWQgPSBidWZmZXIucmVtYWluaW5nKCk7CisKKyAgICBpbnQgYnl0ZXMgPSAwOworCisgICAgZm9yIChGaWxlT2Zmc2V0IGZvIDogdGhpcy5zZWxlY3QocG9zaXRpb24sIHJlcXVlc3RlZCkpIHsKKyAgICAgIGJ1ZmZlci5saW1pdChieXRlcyArIChpbnQpIGZvLmxlbmd0aCk7CisgICAgICBieXRlcyArPSBmby5maWxlLndyaXRlKGJ1ZmZlciwgZm8ub2Zmc2V0KTsKKyAgICB9CisKKyAgICBpZiAoYnl0ZXMgPCByZXF1ZXN0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZSBjb2xsZWN0aW9uIHdyaXRlIHVuZGVycnVuISIpOworICAgIH0KKworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0JsYW5rKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgeworICAgIGZvciAoRmlsZU9mZnNldCBmbyA6IHRoaXMuc2VsZWN0KHBvc2l0aW9uLCBzaXplKSkgeworICAgICAgaWYgKCFmby5maWxlLmlzQmxhbmsoZm8ub2Zmc2V0LCBmby5sZW5ndGgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNCbGFuaygpIHsKKyAgICBmb3IgKEZpbGVTdG9yYWdlIGZpbGUgOiB0aGlzLmZpbGVzKSB7CisgICAgICBpZiAoIWZpbGUuaXNCbGFuaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKEZpbGVTdG9yYWdlIGZpbGUgOiB0aGlzLmZpbGVzKSB7CisgICAgICBmaWxlLmNsb3NlKCk7CisgICAgfQorICAgIG15SXNPcGVuID0gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChGaWxlU3RvcmFnZSBmaWxlIDogdGhpcy5maWxlcykgeworICAgICAgZmlsZS5maW5pc2goKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICBmb3IgKEZpbGVTdG9yYWdlIGZpbGUgOiB0aGlzLmZpbGVzKSB7CisgICAgICBpZiAoIWZpbGUuaXNGaW5pc2hlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoRmlsZVN0b3JhZ2UgZmlsZSA6IGZpbGVzKSB7CisgICAgICBmaWxlLmRlbGV0ZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaWxlIG9wZXJhdGlvbiBkZXRhaWxzIGhvbGRlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgc2ltcGxlIGlubmVyIGNsYXNzIGhvbGRzIHRoZSBkZXRhaWxzIGZvciBhIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uCisgICAqIG9uIG9uZSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgRmlsZVN0b3JhZ2V9cy4KKyAgICogPC9wPgorICAgKgorICAgKiBAYXV0aG9yIGRnaWZmaW4KKyAgICogQGF1dGhvciBtcGV0YXp6b25pCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlT2Zmc2V0IHsKKworICAgIHB1YmxpYyBmaW5hbCBGaWxlU3RvcmFnZSBmaWxlOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG9mZnNldDsKKyAgICBwdWJsaWMgZmluYWwgbG9uZyBsZW5ndGg7CisKKyAgICBGaWxlT2Zmc2V0KEZpbGVTdG9yYWdlIGZpbGUsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkgeworICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNlbGVjdCB0aGUgZ3JvdXAgb2YgZmlsZXMgaW1wYWN0ZWQgYnkgYW4gb3BlcmF0aW9uLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHdoaWNoIGZpbGVzIGFyZSBpbXBhY3RlZCBieSBhIHJlYWQgb3Igd3JpdGUKKyAgICogb3BlcmF0aW9uLCB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgcmVsYXRpdmUgb2Zmc2V0IGFuZCBjaHVuayBsZW5ndGguCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBvcGVyYXRpb24sIGluIGJ5dGVzLCByZWxhdGl2ZSB0byB0aGUKKyAgICogICAgICAgICAgICAgICBjb21wbGV0ZSBieXRlIHN0b3JhZ2UuCisgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIG9yIHdyaXRlLgorICAgKiBAcmV0dXJuIEEgbGlzdCBvZiB7QGxpbmsgRmlsZU9mZnNldH0gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHtAbGluaworICAgKiBGaWxlU3RvcmFnZX1zIGltcGFjdGVkIGJ5IHRoZSBvcGVyYXRpb24sIGJ1bmRsZWQgd2l0aCB0aGVpcgorICAgKiByZXNwZWN0aXZlIHJlbGF0aXZlIG9mZnNldCBhbmQgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgb3Igd3JpdGUuCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBnbyBvdmVyIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHN0b3JhZ2Ugc2l6ZS4KKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgSWYgdGhlIGZpbGVzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGJ5dGUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSBjYW4ndCBhY2NvbW1vZGF0ZSB0aGUgcmVxdWVzdCAoc2hvdWxkIG5vdCBoYXBwZW4sIHJlYWxseSkuCisgICAqLworICBwcml2YXRlIExpc3Q8RmlsZU9mZnNldD4gc2VsZWN0KGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkgeworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiB0aGlzLnNpemUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1ZmZlciBvdmVycnVuICgiICsKKyAgICAgICAgICAgICAgb2Zmc2V0ICsgIiArICIgKyBsZW5ndGggKyAiID4gIiArIHRoaXMuc2l6ZSArICIpICEiKTsKKyAgICB9CisKKyAgICBMaXN0PEZpbGVPZmZzZXQ+IHNlbGVjdGVkID0gbmV3IExpbmtlZExpc3Q8RmlsZU9mZnNldD4oKTsKKyAgICBsb25nIGJ5dGVzID0gMDsKKworICAgIGZvciAoRmlsZVN0b3JhZ2UgZmlsZSA6IHRoaXMuZmlsZXMpIHsKKyAgICAgIGlmIChmaWxlLm9mZnNldCgpID49IG9mZnNldCArIGxlbmd0aCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGZpbGUub2Zmc2V0KCkgKyBmaWxlLnNpemUoKSA8IG9mZnNldCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbG9uZyBwb3NpdGlvbiA9IG9mZnNldCAtIGZpbGUub2Zmc2V0KCk7CisgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID4gMCA/IHBvc2l0aW9uIDogMDsKKyAgICAgIGxvbmcgc2l6ZSA9IE1hdGgubWluKAorICAgICAgICAgICAgICBmaWxlLnNpemUoKSAtIHBvc2l0aW9uLAorICAgICAgICAgICAgICBsZW5ndGggLSBieXRlcyk7CisgICAgICBzZWxlY3RlZC5hZGQobmV3IEZpbGVPZmZzZXQoZmlsZSwgcG9zaXRpb24sIHNpemUpKTsKKyAgICAgIGJ5dGVzICs9IHNpemU7CisgICAgfQorCisgICAgaWYgKHNlbGVjdGVkLnNpemUoKSA9PSAwIHx8IGJ5dGVzIDwgbGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCdWZmZXIgdW5kZXJydW4gKG9ubHkgZ290ICIgKworICAgICAgICAgICAgICBieXRlcyArICIgb3V0IG9mICIgKyBsZW5ndGggKyAiIGJ5dGUocykgcmVxdWVzdGVkKSEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZWN0ZWQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwZGRkZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlU3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsMjYwIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKKworCisvKioKKyAqIFNpbmdsZS1maWxlIHRvcnJlbnQgYnl0ZSBkYXRhIHN0b3JhZ2UuCisgKgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIFRvcnJlbnRCeXRlU3RvcmFnZUZpbGUgcHJvdmlkZXMgYSB0b3JyZW50IGJ5dGUgZGF0YQorICogc3RvcmFnZSByZWx5aW5nIG9uIGEgc2luZ2xlIHVuZGVybHlpbmcgZmlsZSBhbmQgdXNlcyBhIFJhbmRvbUFjY2Vzc0ZpbGUKKyAqIEZpbGVDaGFubmVsIHRvIGV4cG9zZSB0aHJlYWQtc2FmZSByZWFkL3dyaXRlIG1ldGhvZHMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU3RvcmFnZSBpbXBsZW1lbnRzIFRvcnJlbnRCeXRlU3RvcmFnZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJQUxfRklMRV9OQU1FX1NVRkZJWCA9ICIucGFydCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbGVTdG9yYWdlLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIEZpbGUgdGFyZ2V0OworICBwcml2YXRlIEZpbGUgcGFydGlhbDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIG9mZnNldDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHNpemU7CisKKyAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIHJhZjsKKyAgcHJpdmF0ZSBGaWxlQ2hhbm5lbCBjaGFubmVsOworICBwcml2YXRlIEZpbGUgY3VycmVudDsKKyAgcHJpdmF0ZSBib29sZWFuIG15SXNPcGVuID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBpc0JsYW5rOworCisgIHByaXZhdGUgZmluYWwgUmVhZFdyaXRlTG9jayBteUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCisgIHB1YmxpYyBGaWxlU3RvcmFnZShGaWxlIGZpbGUsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpIHsKKyAgICB0aGlzLnRhcmdldCA9IGZpbGU7CisgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgdGhpcy5zaXplID0gc2l6ZTsKKworICB9CisKKyAgcHVibGljIHZvaWQgb3BlbihmaW5hbCBib29sZWFuIHNlZWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGlmIChzZWVkZXIpIHsKKyAgICAgICAgaWYgKCF0YXJnZXQuZXhpc3RzKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRhcmdldCBmaWxlICIgKyB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy50YXJnZXQ7CisgICAgICAgIHRoaXMucmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUodGhpcy5jdXJyZW50LCAiciIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5wYXJ0aWFsID0gbmV3IEZpbGUodGhpcy50YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkgKyBQQVJUSUFMX0ZJTEVfTkFNRV9TVUZGSVgpOworCisgICAgICAgIGlmICh0aGlzLnBhcnRpYWwuZXhpc3RzKCkpIHsKKyAgICAgICAgICBsb2dnZXIuZGVidWcoIlBhcnRpYWwgZG93bmxvYWQgZm91bmQgYXQge30uIENvbnRpbnVpbmcuLi4iLAorICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnBhcnRpYWw7CisgICAgICAgICAgdGhpcy5pc0JsYW5rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudGFyZ2V0LmV4aXN0cygpKSB7CisgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJEb3dubG9hZGluZyBuZXcgZmlsZSB0byB7fS4uLiIsCisgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpYWwuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFydGlhbDsKKyAgICAgICAgICB0aGlzLmlzQmxhbmsgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVXNpbmcgZXhpc3RpbmcgZmlsZSB7fS4iLAorICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMudGFyZ2V0OworICAgICAgICAgIHRoaXMuaXNCbGFuayA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRoaXMucmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUodGhpcy5jdXJyZW50LCAicnciKTsKKyAgICAgICAgdGhpcy5yYWYuc2V0TGVuZ3RoKHRoaXMuc2l6ZSk7CisgICAgICB9CisKKyAgICAgIC8vIFNldCB0aGUgZmlsZSBsZW5ndGggdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUsIGV2ZW50dWFsbHkgdHJ1bmNhdGluZworICAgICAgLy8gb3IgZXh0ZW5kaW5nIHRoZSBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgIG15SXNPcGVuID0gdHJ1ZTsKKyAgICAgIHRoaXMuY2hhbm5lbCA9IHJhZi5nZXRDaGFubmVsKCk7CisKKyAgICAgIGxvZ2dlci5kZWJ1ZygiT3BlbmVkIGJ5dGUgc3RvcmFnZSBmaWxlIGF0IHt9ICh7fSt7fSBieXRlKHMpKS4iLAorICAgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50LmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSwKKyAgICAgICAgICAgICAgfSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgbG9uZyBvZmZzZXQoKSB7CisgICAgcmV0dXJuIHRoaXMub2Zmc2V0OworICB9CisKKyAgcHVibGljIGxvbmcgc2l6ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5zaXplOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgaW50IHJlcXVlc3RlZCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKworICAgICAgaWYgKHBvc2l0aW9uICsgcmVxdWVzdGVkID4gdGhpcy5zaXplKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RvcmFnZSByZWFkIHJlcXVlc3QhIik7CisgICAgICB9CisKKyAgICAgIGludCBieXRlcyA9IHRoaXMuY2hhbm5lbC5yZWFkKGJ1ZmZlciwgcG9zaXRpb24pOworICAgICAgaWYgKGJ5dGVzIDwgcmVxdWVzdGVkKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZSB1bmRlcnJ1biEiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0gZmluYWxseSB7CisgICAgICBteUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGludCByZXF1ZXN0ZWQgPSBidWZmZXIucmVtYWluaW5nKCk7CisgICAgICB0aGlzLmlzQmxhbmsgPSBmYWxzZTsKKworICAgICAgaWYgKHBvc2l0aW9uICsgcmVxdWVzdGVkID4gdGhpcy5zaXplKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RvcmFnZSB3cml0ZSByZXF1ZXN0ISIpOworICAgICAgfQorCisgICAgICByZXR1cm4gdGhpcy5jaGFubmVsLndyaXRlKGJ1ZmZlciwgcG9zaXRpb24pOworICAgIH0gZmluYWxseSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGlmICghbXlJc09wZW4pIHJldHVybjsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQ2xvc2luZyBmaWxlIGNoYW5uZWwgdG8ge30uIENoYW5uZWwgb3Blbjoge30iLCBjdXJyZW50LmdldE5hbWUoKSwgY2hhbm5lbC5pc09wZW4oKSk7CisgICAgICBpZiAodGhpcy5jaGFubmVsLmlzT3BlbigpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGhpcy5jaGFubmVsLmZvcmNlKHRydWUpOworICAgICAgICB9IGNhdGNoIChDbG9zZWRCeUludGVycnVwdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMucmFmLmNsb3NlKCk7CisgICAgICBteUlzT3BlbiA9IGZhbHNlOworICAgIH0gZmluYWxseSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE1vdmUgdGhlIHBhcnRpYWwgZmlsZSB0byBpdHMgZmluYWwgbG9jYXRpb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQ2xvc2luZyBmaWxlIGNoYW5uZWwgdG8gIiArIHRoaXMuY3VycmVudC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAiIChkb3dubG9hZCBjb21wbGV0ZSkuIik7CisgICAgICBpZiAodGhpcy5jaGFubmVsLmlzT3BlbigpKSB7CisgICAgICAgIHRoaXMuY2hhbm5lbC5mb3JjZSh0cnVlKTsKKyAgICAgIH0KKworICAgICAgLy8gTm90aGluZyBtb3JlIHRvIGRvIGlmIHdlJ3JlIGFscmVhZHkgb24gdGhlIHRhcmdldCBmaWxlLgorICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVF1aWV0bHkodGhpcy50YXJnZXQpOworICAgICAgICB0aGlzLnJhZi5jbG9zZSgpOworICAgICAgICBGaWxlVXRpbHMubW92ZUZpbGUodGhpcy5jdXJyZW50LCB0aGlzLnRhcmdldCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBtb3ZpbmcgZmlsZSB0byBpdHMgZmluYWwgbG9jYXRpb24iLCBleCk7CisgICAgICAgIGlmICh0aGlzLnRhcmdldC5leGlzdHMoKSkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiV2FzIHVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgZmlsZSAiICsgdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpLCBleCk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKHRoaXMuY3VycmVudCwgdGhpcy50YXJnZXQpOworICAgICAgfQorCisgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnRhcmdldDsKKworICAgICAgRmlsZVV0aWxzLmRlbGV0ZVF1aWV0bHkodGhpcy5wYXJ0aWFsKTsKKyAgICAgIG15SXNPcGVuID0gZmFsc2U7CisgICAgICBsb2dnZXIuZGVidWcoIk1vdmVkIHRvcnJlbnQgZGF0YSBmcm9tIHt9IHRvIHt9LiIsCisgICAgICAgICAgICAgIHRoaXMucGFydGlhbC5nZXROYW1lKCksCisgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmdldE5hbWUoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIG15TG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIHJldHVybiBteUlzT3BlbjsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbXlMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKSB7CisgICAgICByZXR1cm4gaXNCbGFuaygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsoKSB7CisgICAgdHJ5IHsKKyAgICAgIG15TG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIHJldHVybiBpc0JsYW5rOworICAgIH0gZmluYWxseSB7CisgICAgICBteUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jdXJyZW50LmVxdWFscyh0aGlzLnRhcmdldCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjbG9zZSgpOworICAgIGZpbmFsIEZpbGUgbG9jYWwgPSB0aGlzLmN1cnJlbnQ7CisgICAgaWYgKGxvY2FsICE9IG51bGwpIGxvY2FsLmRlbGV0ZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NjNmYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK3B1YmxpYyBjbGFzcyBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkgaW1wbGVtZW50cyBQaWVjZVN0b3JhZ2VGYWN0b3J5IHsKKworICBwdWJsaWMgZmluYWwgc3RhdGljIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkoKTsKKworICBwcml2YXRlIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeSgpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGllY2VTdG9yYWdlIGNyZWF0ZVN0b3JhZ2UoVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhLCBUb3JyZW50Qnl0ZVN0b3JhZ2UgYnl0ZVN0b3JhZ2UpIHsKKworICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSBuZXcgQml0U2V0KG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkpOworICAgIGF2YWlsYWJsZVBpZWNlcy5zZXQoMCwgbWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSk7CisgICAgcmV0dXJuIG5ldyBQaWVjZVN0b3JhZ2VJbXBsKAorICAgICAgICAgICAgYnl0ZVN0b3JhZ2UsCisgICAgICAgICAgICBhdmFpbGFibGVQaWVjZXMsCisgICAgICAgICAgICBtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpLAorICAgICAgICAgICAgbWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKQorICAgICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjMxOGZkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGllY2VTdG9yYWdlIGV4dGVuZHMgQ2xvc2VhYmxlIHsKKworICB2b2lkIHNhdmVQaWVjZShpbnQgcGllY2VJbmRleCwgYnl0ZVtdIHBpZWNlRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIGJ5dGVbXSByZWFkUGllY2VQYXJ0KGludCBwaWVjZUluZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgQml0U2V0IGdldEF2YWlsYWJsZVBpZWNlcygpOworCisgIGJvb2xlYW4gaXNGaW5pc2hlZCgpOworCisgIHZvaWQgY2xvc2VGdWxseSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwZDQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFBpZWNlU3RvcmFnZUZhY3RvcnkgeworCisgIC8qKgorICAgKiBjcmVhdGUgbmV3IHtAbGluayBQaWVjZVN0b3JhZ2V9IGZvciBzcGVjaWZpZWQgdG9ycmVudCB3aXRoIHNwZWNpZmllZCBieXRlIHN0b3JhZ2UKKyAgICoKKyAgICogQHBhcmFtIG1ldGFkYXRhICAgIHNwZWNpZmllZCBtZXRhZGF0YQorICAgKiBAcGFyYW0gYnl0ZVN0b3JhZ2Ugc3BlY2lmaWVkIGJ5dGUgc3RvcmFnZSB3aGVyZSB3aWxsIGJlIHN0b3JlZCBwaWVjZXMKKyAgICogQHJldHVybiBuZXcge0BsaW5rIFBpZWNlU3RvcmFnZX0KKyAgICovCisgIFBpZWNlU3RvcmFnZSBjcmVhdGVTdG9yYWdlKFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSwgVG9ycmVudEJ5dGVTdG9yYWdlIGJ5dGVTdG9yYWdlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvUGllY2VTdG9yYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvUGllY2VTdG9yYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKKworcHVibGljIGNsYXNzIFBpZWNlU3RvcmFnZUltcGwgaW1wbGVtZW50cyBQaWVjZVN0b3JhZ2UgeworCisgIHByaXZhdGUgZmluYWwgVG9ycmVudEJ5dGVTdG9yYWdlIGZpbGVDb2xsZWN0aW9uU3RvcmFnZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIHJlYWRXcml0ZUxvY2s7CisKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb3BlblN0b3JhZ2VMb2NrID0gbmV3IE9iamVjdCgpOworCisgIEBOdWxsYWJsZQorICBwcml2YXRlIHZvbGF0aWxlIEJpdFNldCBhdmFpbGFibGVQaWVjZXM7CisgIHByaXZhdGUgZmluYWwgaW50IHBpZWNlc0NvdW50OworICBwcml2YXRlIGZpbmFsIGludCBwaWVjZVNpemU7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc09wZW47CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWRGdWxseSA9IGZhbHNlOworCisgIHB1YmxpYyBQaWVjZVN0b3JhZ2VJbXBsKFRvcnJlbnRCeXRlU3RvcmFnZSBmaWxlQ29sbGVjdGlvblN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWVjZXNDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZWNlU2l6ZSkgeworICAgIHRoaXMuZmlsZUNvbGxlY3Rpb25TdG9yYWdlID0gZmlsZUNvbGxlY3Rpb25TdG9yYWdlOworICAgIHRoaXMucmVhZFdyaXRlTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgdGhpcy5waWVjZXNDb3VudCA9IHBpZWNlc0NvdW50OworICAgIHRoaXMucGllY2VTaXplID0gcGllY2VTaXplOworICAgIEJpdFNldCBiaXRTZXQgPSBuZXcgQml0U2V0KHBpZWNlc0NvdW50KTsKKyAgICBiaXRTZXQub3IoYXZhaWxhYmxlUGllY2VzKTsKKyAgICBpZiAoYml0U2V0LmNhcmRpbmFsaXR5KCkgIT0gcGllY2VzQ291bnQpIHsKKyAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzID0gYml0U2V0OworICAgIH0KKyAgICBpc09wZW4gPSBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja1BpZWNlSW5kZXgoaW50IHBpZWNlSW5kZXgpIHsKKyAgICBpZiAocGllY2VJbmRleCA8IDAgfHwgcGllY2VJbmRleCA+PSBwaWVjZXNDb3VudCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb3JyZWN0IHBpZWNlIGluZGV4ICIgKyBwaWVjZUluZGV4ICsgIi4gUGllY2UgaW5kZXggbXVzdCBiZSBwb3NpdGl2ZSBsZXNzIHRoYW4iICsgcGllY2VzQ291bnQpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzYXZlUGllY2UoaW50IHBpZWNlSW5kZXgsIGJ5dGVbXSBwaWVjZURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2hlY2tQaWVjZUluZGV4KHBpZWNlSW5kZXgpOworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKworICAgICAgaWYgKGNsb3NlZEZ1bGx5KSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0b3JhZ2UgaXMgY2xvc2VkIik7CisKKyAgICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSB0aGlzLmF2YWlsYWJsZVBpZWNlczsKKworICAgICAgYm9vbGVhbiBpc0Z1bGx5RG93bmxvYWRlZCA9IGF2YWlsYWJsZVBpZWNlcyA9PSBudWxsOworCisgICAgICBpZiAoaXNGdWxseURvd25sb2FkZWQpIHJldHVybjsKKworICAgICAgaWYgKGF2YWlsYWJsZVBpZWNlcy5nZXQocGllY2VJbmRleCkpIHJldHVybjsKKworICAgICAgb3BlblN0b3JhZ2VJc05lY2Vzc2FyeShmYWxzZSk7CisKKyAgICAgIGxvbmcgcG9zID0gcGllY2VJbmRleDsKKyAgICAgIHBvcyA9IHBvcyAqIHBpZWNlU2l6ZTsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKHBpZWNlRGF0YSk7CisgICAgICBmaWxlQ29sbGVjdGlvblN0b3JhZ2Uud3JpdGUoYnVmZmVyLCBwb3MpOworCisgICAgICBhdmFpbGFibGVQaWVjZXMuc2V0KHBpZWNlSW5kZXgpOworICAgICAgYm9vbGVhbiBpc0Z1bGx5Tm93ID0gYXZhaWxhYmxlUGllY2VzLmNhcmRpbmFsaXR5KCkgPT0gcGllY2VzQ291bnQ7CisgICAgICBpZiAoaXNGdWxseU5vdykgeworICAgICAgICB0aGlzLmF2YWlsYWJsZVBpZWNlcyA9IG51bGw7CisgICAgICAgIGZpbGVDb2xsZWN0aW9uU3RvcmFnZS5maW5pc2goKTsKKyAgICAgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLmNsb3NlKCk7CisgICAgICAgIGZpbGVDb2xsZWN0aW9uU3RvcmFnZS5vcGVuKHRydWUpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBvcGVuU3RvcmFnZUlzTmVjZXNzYXJ5KGJvb2xlYW4gb25seVJlYWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4pIHsKKyAgICAgIGZpbGVDb2xsZWN0aW9uU3RvcmFnZS5vcGVuKG9ubHlSZWFkKTsKKyAgICAgIGlzT3BlbiA9IHRydWU7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gcmVhZFBpZWNlUGFydChpbnQgcGllY2VJbmRleCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjaGVja1BpZWNlSW5kZXgocGllY2VJbmRleCk7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisKKyAgICAgIGlmIChjbG9zZWRGdWxseSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdG9yYWdlIGlzIGNsb3NlZCIpOworCisgICAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gdGhpcy5hdmFpbGFibGVQaWVjZXM7CisgICAgICBpZiAoYXZhaWxhYmxlUGllY2VzICE9IG51bGwgJiYgIWF2YWlsYWJsZVBpZWNlcy5nZXQocGllY2VJbmRleCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidHJ5aW5nIHJlYWRpbmcgcGFydCBvZiBub3QgYXZhaWxhYmxlIHBpZWNlIik7CisgICAgICB9CisKKyAgICAgIHN5bmNocm9uaXplZCAob3BlblN0b3JhZ2VMb2NrKSB7CisgICAgICAgIG9wZW5TdG9yYWdlSXNOZWNlc3NhcnkoYXZhaWxhYmxlUGllY2VzID09IG51bGwpOworICAgICAgfQorCisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobGVuZ3RoKTsKKyAgICAgIGxvbmcgcG9zID0gcGllY2VJbmRleDsKKyAgICAgIHBvcyA9IHBvcyAqIHBpZWNlU2l6ZSArIG9mZnNldDsKKyAgICAgIGZpbGVDb2xsZWN0aW9uU3RvcmFnZS5yZWFkKGJ1ZmZlciwgcG9zKTsKKyAgICAgIHJldHVybiBidWZmZXIuYXJyYXkoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIGF2YWlsYWJsZVBpZWNlcyA9PSBudWxsOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlRnVsbHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGNsb3NlMCgpOworICAgICAgY2xvc2VkRnVsbHkgPSB0cnVlOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQml0U2V0IGdldEF2YWlsYWJsZVBpZWNlcygpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIEJpdFNldCByZXN1bHQgPSBuZXcgQml0U2V0KHBpZWNlc0NvdW50KTsKKworICAgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IHRoaXMuYXZhaWxhYmxlUGllY2VzOworICAgICAgYm9vbGVhbiBpc0Z1bGx5RG93bmxvYWRlZCA9IGF2YWlsYWJsZVBpZWNlcyA9PSBudWxsOworCisgICAgICBpZiAoaXNGdWxseURvd25sb2FkZWQpIHsKKyAgICAgICAgcmVzdWx0LnNldCgwLCBwaWVjZXNDb3VudCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICByZXN1bHQub3IoYXZhaWxhYmxlUGllY2VzKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGNsb3NlMCgpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjbG9zZTAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLmNsb3NlKCk7CisgICAgaXNPcGVuID0gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9Ub3JyZW50Qnl0ZVN0b3JhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9Ub3JyZW50Qnl0ZVN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJhOWJjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1RvcnJlbnRCeXRlU3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisKKy8qKgorICogQWJzdHJhY3QgdG9ycmVudCBieXRlIHN0b3JhZ2UuCisgKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIGZvciBhY2Nlc3NpbmcgYW4gYWJzdHJhY3RlZCB0b3JyZW50IGJ5dGUKKyAqIHN0b3JhZ2UuIEEgdG9ycmVudCwgZXNwZWNpYWxseSB3aGVuIGl0IGNvbnRhaW5zIG11bHRpcGxlIGZpbGVzLCBuZWVkcyB0byBiZQorICogc2VlbiBhcyBvbmUgc2luZ2xlIGNvbnRpbnVvdXMgc3RyZWFtIG9mIGJ5dGVzLiBUb3JyZW50IHBpZWNlcyB3aWxsIG1vc3QKKyAqIGxpa2VseSBzcGFuIGFjY3Jvc3MgZmlsZSBib3VuZGFyaWVzLiBUaGlzIGFic3RyYWN0ZWQgYnl0ZSBzdG9yYWdlIGFpbXMgYXQKKyAqIHByb3ZpZGluZyBhIHNpbXBsZSBpbnRlcmZhY2UgZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoZSB0b3JyZW50IGRhdGEsCisgKiByZWdhcmRsZXNzIG9mIGhvdyBpdCBpcyBjb21wb3NlZCB1bmRlcm5lYXRoIHRoZSBwaWVjZSBzdHJ1Y3R1cmUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKiBAYXV0aG9yIGRnaWZmaW4KKyAqLworcHVibGljIGludGVyZmFjZSBUb3JyZW50Qnl0ZVN0b3JhZ2UgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgIHZvaWQgb3Blbihib29sZWFuIHNlZWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZWFkIGZyb20gdGhlIGJ5dGUgc3RvcmFnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFJlYWQge0Bjb2RlIGxlbmd0aH0gYnl0ZXMgYXQgcG9zaXRpb24ge0Bjb2RlIHBvc2l0aW9ufSBmcm9tIHRoZSB1bmRlcmx5aW5nCisgICAqIGJ5dGUgc3RvcmFnZSBhbmQgcmV0dXJuIHRoZW0gaW4gYSB7QGxpbmsgQnl0ZUJ1ZmZlcn0uCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZmZlciAgIFRoZSBidWZmZXIgdG8gcmVhZCB0aGUgYnl0ZXMgaW50by4gVGhlIGJ1ZmZlcidzIGxpbWl0IHdpbGwKKyAgICogICAgICAgICAgICAgICAgIGNvbnRyb2wgaG93IG1hbnkgYnl0ZXMgYXJlIHJlYWQgZnJvbSB0aGUgc3RvcmFnZS4KKyAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiwgaW4gYnl0ZXMsIHRvIHJlYWQgZnJvbS4gVGhpcyBtdXN0IGJlIHdpdGhpbgorICAgKiAgICAgICAgICAgICAgICAgdGhlIHN0b3JhZ2UgYm91bmRhcnkuCisgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0b3JhZ2UuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgYnl0ZSBzdG9yYWdlLgorICAgKi8KKyAgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogV3JpdGUgYnl0ZXMgdG8gdGhlIGJ5dGUgc3RvcmFnZS4KKyAgICoKKyAgICogPHA+CisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGJsb2NrICAgIEEge0BsaW5rIEJ5dGVCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZQorICAgKiAgICAgICAgICAgICAgICAgc3RvcmFnZS4gVGhlIGJ1ZmZlciBsaW1pdCBpcyBleHBlY3RlZCB0byBiZSBzZXQgY29ycmVjdGx5OiBhbGwgYnl0ZXMKKyAgICogICAgICAgICAgICAgICAgIGZyb20gdGhlIGJ1ZmZlciB3aWxsIGJlIHVzZWQuCisgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBpbiB0aGUgdW5kZXJseWluZyBieXRlIHN0b3JhZ2UgdG8gd3JpdGUgdGhlIGJsb2NrCisgICAqICAgICAgICAgICAgICAgICBhdC4KKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHN0b3JhZ2UuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRvIHRoZSBieXRlCisgICAqICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS4KKyAgICovCisgIGludCB3cml0ZShCeXRlQnVmZmVyIGJsb2NrLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEZpbmFsaXplIHRoZSBieXRlIHN0b3JhZ2Ugd2hlbiB0aGUgZG93bmxvYWQgaXMgY29tcGxldGUuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGdpdmVzIHRoZSBieXRlIHN0b3JhZ2UgdGhlIG9wcG9ydHVuaXR5IHRvIHBlcmZvcm0gZmluYWxpemF0aW9uCisgICAqIG9wZXJhdGlvbnMgd2hlbiB0aGUgZG93bmxvYWQgY29tcGxldGVzLCBsaWtlIG1vdmluZyB0aGUgZmlsZXMgZnJvbSBhCisgICAqIHRlbXBvcmFyeSBsb2NhdGlvbiB0byB0aGVpciBkZXN0aW5hdGlvbi4KKyAgICogPC9wPgorICAgKgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBmaW5hbGl6YXRpb24gZmFpbGVkLgorICAgKi8KKyAgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBieXRlIHN0b3JhZ2UgaGFzIGJlZW4gZmluYWxpemVkLgorICAgKi8KKyAgYm9vbGVhbiBpc0ZpbmlzaGVkKCk7CisKKyAgLyoqCisgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBpbiB0aGUgdW5kZXJseWluZyBieXRlIHN0b3JhZ2UgdG8gd3JpdGUgdGhlIGJsb2NrIGF0LgorICAgKiBAcGFyYW0gc2l6ZSBTaXplIG9mIHJlZ2lvbiB0byBjaGVjay4KKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWdpb24gc3RhcnRpbmcgd2l0aCBwb3NpdGlvbnMgb25seSBjb250YWlucyB6ZXJvcworICAgKi8KKyAgYm9vbGVhbiBpc0JsYW5rKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSk7CisKKyAgLyoqCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW50ZXIgc3RvcmFnZSBvbmx5IGNvbnRhaW5zIHplcm9zCisgICAqLworICBib29sZWFuIGlzQmxhbmsoKTsKKworICAvKioKKyAgICogRGVsZXRlIGJ5dGUgc3RvcmFnZSBpbmZvcm1hdGlvbgorICAgKi8KKyAgdm9pZCBkZWxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L0VuZEdhbWVTdHJhdGVneS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9FbmRHYW1lU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFjODZkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9FbmRHYW1lU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIEVuZEdhbWVTdHJhdGVneSB7CisKKyAgUmVxdWVzdHNDb2xsZWN0aW9uIGNvbGxlY3RSZXF1ZXN0cyhQaWVjZVtdIGFsbFBpZWNlcywgTGlzdDxTaGFyaW5nUGVlcj4gY29ubmVjdGVkUGVlcnMpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L0VuZEdhbWVTdHJhdGVneUltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvRW5kR2FtZVN0cmF0ZWd5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzA1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L0VuZEdhbWVTdHJhdGVneUltcGwuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgRW5kR2FtZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIEVuZEdhbWVTdHJhdGVneSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKKworICBwcml2YXRlIGZpbmFsIGludCBwZWVyc1BlclBpZWNlOworCisgIHB1YmxpYyBFbmRHYW1lU3RyYXRlZ3lJbXBsKGludCBwZWVyc1BlclBpZWNlKSB7CisgICAgdGhpcy5wZWVyc1BlclBpZWNlID0gcGVlcnNQZXJQaWVjZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVxdWVzdHNDb2xsZWN0aW9uIGNvbGxlY3RSZXF1ZXN0cyhQaWVjZVtdIGFsbFBpZWNlcywgTGlzdDxTaGFyaW5nUGVlcj4gY29ubmVjdGVkUGVlcnMpIHsKKyAgICBMaXN0PFNoYXJpbmdQZWVyPiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PFNoYXJpbmdQZWVyPihjb25uZWN0ZWRQZWVycyk7CisgICAgTWFwPFBpZWNlLCBMaXN0PFNoYXJpbmdQZWVyPj4gc2VsZWN0ZWRQaWVjZXMgPSBuZXcgSGFzaE1hcDxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+KCk7CisgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIG5ldyBDb21wYXJhdG9yPFNoYXJpbmdQZWVyPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKFNoYXJpbmdQZWVyIG8xLCBTaGFyaW5nUGVlciBvMikgeworICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKG8xLmdldERvd25sb2FkZWRQaWVjZXNDb3VudCgpKS5jb21wYXJlVG8obzIuZ2V0RG93bmxvYWRlZFBpZWNlc0NvdW50KCkpOworICAgICAgfQorICAgIH0pOworICAgIGZvciAoUGllY2UgcGllY2UgOiBhbGxQaWVjZXMpIHsKKyAgICAgIGlmIChwaWVjZS5pc1ZhbGlkKCkpIGNvbnRpbnVlOworCisgICAgICAvL2lmIHdlIGRvbid0IGhhdmUgcGllY2UsIHRoZW4gcmVxdWVzdCB0aGlzIHBpZWNlIGZyb20gdHdvIHJhbmRvbSBwZWVycworICAgICAgLy8ocGVlcnMgYXJlIHNlbGVjdGVkIGJ5IHBlZXIgcmFuaywgcGVlciB3aXRoIGJldHRlciByYW5rIHdpbGwgYmUgc2VsZWN0ZWQgbW9yZSBvZnRlbiB0aGVuIHBlZXIgd2l0aCBiYWQgcmFuaworICAgICAgTGlzdDxTaGFyaW5nUGVlcj4gc2VsZWN0ZWRQZWVycyA9IHNlbGVjdEdvb2RQZWVycyhwaWVjZSwgcGVlcnNQZXJQaWVjZSwgc29ydGVkKTsKKyAgICAgIHNlbGVjdGVkUGllY2VzLnB1dChwaWVjZSwgc2VsZWN0ZWRQZWVycyk7CisgICAgfQorICAgIHJldHVybiBuZXcgUmVxdWVzdHNDb2xsZWN0aW9uSW1wbChzZWxlY3RlZFBpZWNlcyk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U2hhcmluZ1BlZXI+IHNlbGVjdEdvb2RQZWVycyhQaWVjZSBwaWVjZSwgaW50IGNvdW50LCBMaXN0PFNoYXJpbmdQZWVyPiBzb3J0ZWRQZWVycykgeworICAgIExpc3Q8U2hhcmluZ1BlZXI+IG5vdFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdDxTaGFyaW5nUGVlcj4oc29ydGVkUGVlcnMpOworICAgIEl0ZXJhdG9yPFNoYXJpbmdQZWVyPiBpdGVyYXRvciA9IG5vdFNlbGVjdGVkLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgU2hhcmluZ1BlZXIgcGVlciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIGJvb2xlYW4gcGVlckhhc0N1cnJlbnRQaWVjZSA9IHBlZXIuZ2V0QXZhaWxhYmxlUGllY2VzKCkuZ2V0KHBpZWNlLmdldEluZGV4KCkpOworICAgICAgYm9vbGVhbiBhbHJlYWR5UmVxdWVzdGVkID0gcGVlci5nZXRSZXF1ZXN0ZWRQaWVjZXMoKS5jb250YWlucyhwaWVjZSk7CisKKyAgICAgIGlmICghcGVlckhhc0N1cnJlbnRQaWVjZSB8fCBhbHJlYWR5UmVxdWVzdGVkKSBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICB9CisgICAgaWYgKG5vdFNlbGVjdGVkLnNpemUoKSA8PSBjb3VudCkgcmV0dXJuIG5vdFNlbGVjdGVkOworCisgICAgTGlzdDxTaGFyaW5nUGVlcj4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFNoYXJpbmdQZWVyPigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgPSBzZWxlY3RQZWVyKG5vdFNlbGVjdGVkKTsKKyAgICAgIGlmIChzaGFyaW5nUGVlciA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgIG5vdFNlbGVjdGVkLnJlbW92ZShzaGFyaW5nUGVlcik7CisgICAgICBzZWxlY3RlZC5hZGQoc2hhcmluZ1BlZXIpOworICAgIH0KKworICAgIHJldHVybiBzZWxlY3RlZDsKKyAgfQorCisgIHByaXZhdGUgU2hhcmluZ1BlZXIgc2VsZWN0UGVlcihMaXN0PFNoYXJpbmdQZWVyPiBub3RTZWxlY3RlZCkgeworICAgIGZvciAoU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgOiBub3RTZWxlY3RlZCkgeworICAgICAgaWYgKFJBTkRPTS5uZXh0RG91YmxlKCkgPCAwLjgpIHsKKyAgICAgICAgcmV0dXJuIHNoYXJpbmdQZWVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbm90U2VsZWN0ZWQuZ2V0KFJBTkRPTS5uZXh0SW50KG5vdFNlbGVjdGVkLnNpemUoKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzEzYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBhIHBpZWNlIHJlcXVlc3Qgc3RyYXRlZ3kgcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBjam1hbGxveQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RTdHJhdGVneSB7CisKKyAgLyoqCisgICAqIENob29zZSBhIHBpZWNlIGZyb20gdGhlIHJlbWFpbmluZyBwaWVjZXMuCisgICAqCisgICAqIEBwYXJhbSBpbnRlcmVzdGluZyBBIHNldCBvZiB0aGUgaW5kZXggb2YgYWxsIGludGVyZXN0aW5nIHBpZWNlcworICAgKiBAcGFyYW0gcGllY2VzICAgICAgVGhlIGNvbXBsZXRlIGFycmF5IG9mIHBpZWNlcworICAgKiBAcmV0dXJuIFRoZSBjaG9zZW4gcGllY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHBpZWNlIGlzIGludGVyZXN0aW5nCisgICAqLworICBQaWVjZSBjaG9vc2VQaWVjZShCaXRTZXQgaW50ZXJlc3RpbmcsIFBpZWNlW10gcGllY2VzKTsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYThhZTQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3RpbmcgaW1wbGVtZW50cyBSZXF1ZXN0U3RyYXRlZ3kgeworCisgIHByaXZhdGUgZmluYWwgUmFuZG9tIG15UmFuZG9tID0gbmV3IFJhbmRvbSgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGllY2UgY2hvb3NlUGllY2UoQml0U2V0IGludGVyZXN0aW5nLCBQaWVjZVtdIHBpZWNlcykgeworICAgIExpc3Q8UGllY2U+IG9ubHlJbnRlcmVzdGluZ1BpZWNlcyA9IG5ldyBBcnJheUxpc3Q8UGllY2U+KCk7CisgICAgZm9yIChQaWVjZSBwIDogcGllY2VzKSB7CisgICAgICBpZiAoaW50ZXJlc3RpbmcuZ2V0KHAuZ2V0SW5kZXgoKSkpIG9ubHlJbnRlcmVzdGluZ1BpZWNlcy5hZGQocCk7CisgICAgfQorICAgIGlmIChvbmx5SW50ZXJlc3RpbmdQaWVjZXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gb25seUludGVyZXN0aW5nUGllY2VzLmdldChteVJhbmRvbS5uZXh0SW50KG9ubHlJbnRlcmVzdGluZ1BpZWNlcy5zaXplKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3lJbXBsU2VxdWVudGlhbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3lJbXBsU2VxdWVudGlhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYmMyNGQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxTZXF1ZW50aWFsLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3k7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCisvKioKKyAqIEEgc2VxdWVudGlhbCByZXF1ZXN0IHN0cmF0ZWd5IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgY2ptYWxsb3kKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RTdHJhdGVneUltcGxTZXF1ZW50aWFsIGltcGxlbWVudHMgUmVxdWVzdFN0cmF0ZWd5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBpZWNlIGNob29zZVBpZWNlKEJpdFNldCBpbnRlcmVzdGluZywgUGllY2VbXSBwaWVjZXMpIHsKKworICAgIGZvciAoUGllY2UgcCA6IHBpZWNlcykgeworICAgICAgaWYgKGludGVyZXN0aW5nLmdldChwLmdldEluZGV4KCkpKSByZXR1cm4gcDsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdHNDb2xsZWN0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDE4NDkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RzQ29sbGVjdGlvbiB7CisKKyAgdm9pZCBzZW5kQWxsUmVxdWVzdHMoKTsKKworICBmaW5hbCBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIFJlcXVlc3RzQ29sbGVjdGlvbiB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEVtcHR5IElOU1RBTkNFID0gbmV3IEVtcHR5KCk7CisKKyAgICBwcml2YXRlIEVtcHR5KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRBbGxSZXF1ZXN0cygpIHsKKyAgICAgIC8vZG8gbm90aGluZworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0c0NvbGxlY3Rpb25JbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RzQ29sbGVjdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE4ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0c0NvbGxlY3Rpb25JbXBsLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3k7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUmVxdWVzdHNDb2xsZWN0aW9uSW1wbCBpbXBsZW1lbnRzIFJlcXVlc3RzQ29sbGVjdGlvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8UGllY2UsIExpc3Q8U2hhcmluZ1BlZXI+PiBzZWxlY3RlZFBpZWNlczsKKworICBwdWJsaWMgUmVxdWVzdHNDb2xsZWN0aW9uSW1wbChNYXA8UGllY2UsIExpc3Q8U2hhcmluZ1BlZXI+PiBzZWxlY3RlZFBpZWNlcykgeworICAgIHRoaXMuc2VsZWN0ZWRQaWVjZXMgPSBzZWxlY3RlZFBpZWNlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kQWxsUmVxdWVzdHMoKSB7CisgICAgZm9yIChNYXAuRW50cnk8UGllY2UsIExpc3Q8U2hhcmluZ1BlZXI+PiBlbnRyeSA6IHNlbGVjdGVkUGllY2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgIFBpZWNlIHBpZWNlID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBmb3IgKFNoYXJpbmdQZWVyIHNoYXJpbmdQZWVyIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICBzaGFyaW5nUGVlci5kb3dubG9hZFBpZWNlKHBpZWNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQnl0ZUFycmF5U3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9CeXRlQXJyYXlTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MzFmOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQnl0ZUFycmF5U3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuVG9ycmVudEJ5dGVTdG9yYWdlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgQnl0ZUFycmF5U3RvcmFnZSBpbXBsZW1lbnRzIFRvcnJlbnRCeXRlU3RvcmFnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyYXk7CisgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gaXNCbGFuazsKKworICBwdWJsaWMgQnl0ZUFycmF5U3RvcmFnZShpbnQgbWF4U2l6ZSkgeworICAgIGFycmF5ID0gbmV3IGJ5dGVbbWF4U2l6ZV07CisgICAgaXNCbGFuayA9IHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3Blbihib29sZWFuIHNlZWRlcikgeworICB9CisKKyAgcHJpdmF0ZSBpbnQgaW50UG9zaXRpb24obG9uZyBwb3NpdGlvbikgeworICAgIGlmIChwb3NpdGlvbiA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IHBvc2l0aW9uIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUG9zaXRpb24gaXMgdG9vIGxhcmdlIik7CisgICAgfQorICAgIHJldHVybiAoaW50KSBwb3NpdGlvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pIHsKKworICAgIGludCBwb3MgPSBpbnRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgaW50IGJ5dGVzQ291bnQgPSBidWZmZXIucmVtYWluaW5nKCk7CisgICAgYnVmZmVyLnB1dChBcnJheXMuY29weU9mUmFuZ2UoYXJyYXksIHBvcywgcG9zICsgYnl0ZXNDb3VudCkpOworICAgIHJldHVybiBieXRlc0NvdW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBibG9jaywgbG9uZyBwb3NpdGlvbikgeworICAgIGludCBwb3MgPSBpbnRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgaW50IGJ5dGVzQ291bnQgPSBibG9jay5yZW1haW5pbmcoKTsKKyAgICBieXRlW10gdG9Xcml0ZSA9IG5ldyBieXRlW2J5dGVzQ291bnRdOworICAgIGJsb2NrLmdldCh0b1dyaXRlKTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KHRvV3JpdGUsIDAsIGFycmF5LCBwb3MsIHRvV3JpdGUubGVuZ3RoKTsKKyAgICBpc0JsYW5rID0gZmFsc2U7CisgICAgcmV0dXJuIGJ5dGVzQ291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworICAgIHJldHVybiBmaW5pc2hlZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0JsYW5rKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgeworICAgIHJldHVybiBpc0JsYW5rOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsoKSB7CisgICAgcmV0dXJuIGlzQmxhbms7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZGVsZXRlKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0V2ZW50RGlzcGF0Y2hlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRXZlbnREaXNwYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGU4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0V2ZW50RGlzcGF0Y2hlclRlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitAVGVzdAorcHVibGljIGNsYXNzIEV2ZW50RGlzcGF0Y2hlclRlc3QgeworCisgIHByaXZhdGUgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcjsKKyAgcHJpdmF0ZSBQZWVySW5mb3JtYXRpb24gcGVlckluZm87CisgIHByaXZhdGUgUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm87CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICBldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7CisKKyAgICBwZWVySW5mbyA9IG1vY2soUGVlckluZm9ybWF0aW9uLmNsYXNzKTsKKyAgICBwaWVjZUluZm8gPSBtb2NrKFBpZWNlSW5mb3JtYXRpb24uY2xhc3MpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdpdGhvdXRMaXN0ZW5lcnMoKSB7CisKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5kb3dubG9hZEZhaWxlZChuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5wZWVyQ29ubmVjdGVkKHBlZXJJbmZvKTsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS52YWxpZGF0aW9uQ29tcGxldGUoMSwgNCk7CisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkucGllY2VEb3dubG9hZGVkKHBpZWNlSW5mbywgcGVlckluZm8pOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLmRvd25sb2FkQ29tcGxldGUoKTsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5waWVjZVJlY2VpdmVkKHBpZWNlSW5mbywgcGVlckluZm8pOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBlZXJEaXNjb25uZWN0ZWQocGVlckluZm8pOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEludm9jYXRpb24oKSB7CisKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGludm9jYXRpb25Db3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgaW50IGNvdW50ID0gNTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGV2ZW50RGlzcGF0Y2hlci5hZGRMaXN0ZW5lcihuZXcgVG9ycmVudExpc3RlbmVyV3JhcHBlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisgICAgICAgICAgaW52b2NhdGlvbkNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5wZWVyQ29ubmVjdGVkKHBlZXJJbmZvKTsKKworICAgIGFzc2VydEVxdWFscyhpbnZvY2F0aW9uQ291bnQuZ2V0KCksIDApOworCisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkuZG93bmxvYWRDb21wbGV0ZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKGludm9jYXRpb25Db3VudC5nZXQoKSwgY291bnQpOworCisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlcnNTdG9yYWdlVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NWU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGVlcnNTdG9yYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuUGVlckFjdGl2aXR5TGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXJVSUQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE51bGw7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgUGVlcnNTdG9yYWdlVGVzdCB7CisKKyAgcHJpdmF0ZSBQZWVyc1N0b3JhZ2UgbXlQZWVyc1N0b3JhZ2U7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG15UGVlcnNTdG9yYWdlID0gbmV3IFBlZXJzU3RvcmFnZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgZ2V0U2V0U2VsZlRlc3QoKSB7CisKKyAgICBhc3NlcnROdWxsKG15UGVlcnNTdG9yYWdlLmdldFNlbGYoKSk7CisgICAgUGVlciBzZWxmID0gbmV3IFBlZXIoIiIsIDEpOworICAgIG15UGVlcnNTdG9yYWdlLnNldFNlbGYoc2VsZik7CisgICAgYXNzZXJ0RXF1YWxzKG15UGVlcnNTdG9yYWdlLmdldFNlbGYoKSwgc2VsZik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdFBlZXJzU3RvcmFnZVJldHVybk5ld0NvbGxlY3Rpb24oKSB7CisgICAgU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgPSBnZXRNb2NrU2hhcmluZ1BlZXIoKTsKKyAgICBteVBlZXJzU3RvcmFnZS5wdXRJZkFic2VudChuZXcgUGVlclVJRChuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDY4ODEpLCAiIiksIHNoYXJpbmdQZWVyKTsKKyAgICBDb2xsZWN0aW9uPFNoYXJpbmdQZWVyPiBzaGFyaW5nUGVlcnMgPSBteVBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKTsKKworICAgIGFzc2VydEVxdWFscygxLCBteVBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygxLCBzaGFyaW5nUGVlcnMuc2l6ZSgpKTsKKworICAgIHNoYXJpbmdQZWVycy5hZGQoc2hhcmluZ1BlZXIpOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIG15UGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHNoYXJpbmdQZWVycy5zaXplKCkpOworICB9CisKKyAgcHJpdmF0ZSBTaGFyaW5nUGVlciBnZXRNb2NrU2hhcmluZ1BlZXIoKSB7CisgICAgcmV0dXJuIG5ldyBTaGFyaW5nUGVlcigiMSIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgIG1vY2soU2hhcmVkVG9ycmVudC5jbGFzcyksCisgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgbW9jayhQZWVyQWN0aXZpdHlMaXN0ZW5lci5jbGFzcyksCisgICAgICAgICAgICBtb2NrKEJ5dGVDaGFubmVsLmNsYXNzKSwgIlRPIiwgMTIzNCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBnZXRBbmRSZW1vdmVTaGFyaW5nUGVlcnNUZXN0KCkgeworICAgIFNoYXJpbmdQZWVyIHNoYXJpbmdQZWVyID0gZ2V0TW9ja1NoYXJpbmdQZWVyKCk7CisgICAgUGVlclVJRCBwZWVyVWlkID0gbmV3IFBlZXJVSUQobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCA2ODgxKSwgIiIpOworICAgIFNoYXJpbmdQZWVyIG9sZFBlZXIgPSBteVBlZXJzU3RvcmFnZS5wdXRJZkFic2VudChwZWVyVWlkLCBzaGFyaW5nUGVlcik7CisKKyAgICBhc3NlcnROdWxsKG9sZFBlZXIpOworICAgIGFzc2VydEVxdWFscyhteVBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcihwZWVyVWlkKSwgc2hhcmluZ1BlZXIpOworCisgICAgYXNzZXJ0RXF1YWxzKG15UGVlcnNTdG9yYWdlLnJlbW92ZVNoYXJpbmdQZWVyKHBlZXJVaWQpLCBzaGFyaW5nUGVlcik7CisgICAgYXNzZXJ0TnVsbChteVBlZXJzU3RvcmFnZS5yZW1vdmVTaGFyaW5nUGVlcihwZWVyVWlkKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9IYW5kc2hha2VSZWNlaXZlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9IYW5kc2hha2VSZWNlaXZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM4NDlhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVJlY2VpdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVGVtcEZpbGVzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LlV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC4qOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlBlZXJBY3Rpdml0eUxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZpbGVDb2xsZWN0aW9uU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudENyZWF0b3I7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFNlcmlhbGl6ZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5QaXBlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUludDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0Lio7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgSGFuZHNoYWtlUmVjZWl2ZXJUZXN0IHsKKworICBwcml2YXRlIEhhbmRzaGFrZVJlY2VpdmVyIG15SGFuZHNoYWtlUmVjZWl2ZXI7CisgIHByaXZhdGUgYnl0ZVtdIG15U2VsZklkOworICBwcml2YXRlIENvbnRleHQgbXlDb250ZXh0OworICBwcml2YXRlIFRlbXBGaWxlcyBteVRlbXBGaWxlczsKKworICBwdWJsaWMgSGFuZHNoYWtlUmVjZWl2ZXJUZXN0KCkgeworICAgIGlmIChMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLmdldEFsbEFwcGVuZGVycygpLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgcmV0dXJuOworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKG5ldyBQYXR0ZXJuTGF5b3V0KCJbJWR7TU1kZCBISDptbTpzcyxTU1N9ICV0XSAlNnAgLSAlMjAuMjBjIC0gJW0gJW4iKSkpOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG15VGVtcEZpbGVzID0gbmV3IFRlbXBGaWxlcygpOworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoVXRpbHMuZ2V0TG9nTGV2ZWwoKSk7CisgICAgbXlTZWxmSWQgPSAic2VsZklkMXNlbGZJZDJzZWxmSWQiLmdldEJ5dGVzKCk7CisgICAgQnl0ZUJ1ZmZlciBzZWxmSWQgPSBCeXRlQnVmZmVyLndyYXAobXlTZWxmSWQpOworICAgIG15Q29udGV4dCA9IG1vY2soQ29udGV4dC5jbGFzcyk7CisgICAgUGVlcnNTdG9yYWdlIHBlZXJzU3RvcmFnZSA9IG5ldyBQZWVyc1N0b3JhZ2UoKTsKKyAgICBUb3JyZW50c1N0b3JhZ2UgdG9ycmVudHNTdG9yYWdlID0gbmV3IFRvcnJlbnRzU3RvcmFnZSgpOworICAgIHdoZW4obXlDb250ZXh0LmdldFBlZXJzU3RvcmFnZSgpKS50aGVuUmV0dXJuKHBlZXJzU3RvcmFnZSk7CisgICAgd2hlbihteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkpLnRoZW5SZXR1cm4odG9ycmVudHNTdG9yYWdlKTsKKyAgICBwZWVyc1N0b3JhZ2Uuc2V0U2VsZihuZXcgUGVlcigiMTI3LjAuMC4xIiwgNTQ2NDUsIHNlbGZJZCkpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gbW9jayhDb21tdW5pY2F0aW9uTWFuYWdlci5jbGFzcyk7CisgICAgd2hlbihjb21tdW5pY2F0aW9uTWFuYWdlci5nZXRDb25uZWN0aW9uTWFuYWdlcigpKS50aGVuUmV0dXJuKG1vY2soQ29ubmVjdGlvbk1hbmFnZXIuY2xhc3MpKTsKKyAgICBteUhhbmRzaGFrZVJlY2VpdmVyID0gbmV3IEhhbmRzaGFrZVJlY2VpdmVyKAorICAgICAgICAgICAgbXlDb250ZXh0LAorICAgICAgICAgICAgIjEyNy4wLjAuMSIsCisgICAgICAgICAgICA0NTY2NCwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIG15VGVtcEZpbGVzLmNsZWFudXAoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlSGFuZHNoYWtlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUGlwZSBwMSA9IFBpcGUub3BlbigpOworICAgIFBpcGUgcDIgPSBQaXBlLm9wZW4oKTsKKyAgICBCeXRlQ2hhbm5lbCBjbGllbnQgPSBuZXcgQnl0ZVNvdXJjZUNoYW5uZWwocDEuc291cmNlKCksIHAyLnNpbmsoKSk7CisgICAgQnl0ZUNoYW5uZWwgc2VydmVyID0gbmV3IEJ5dGVTb3VyY2VDaGFubmVsKHAyLnNvdXJjZSgpLCBwMS5zaW5rKCkpOworICAgIFN0cmluZyBwZWVySWRTdHIgPSAicGVlcklkcGVlcklkcGVlcklkMjIiOworICAgIFN0cmluZyB0b3JyZW50SGFzaFN0ciA9ICJ0b3JyZW50dG9ycmVudHRvcnJlbiI7CisgICAgYnl0ZVtdIHBlZXJJZCA9IHBlZXJJZFN0ci5nZXRCeXRlcygpOworICAgIGJ5dGVbXSB0b3JyZW50SGFzaCA9IHRvcnJlbnRIYXNoU3RyLmdldEJ5dGVzKCk7CisgICAgSGFuZHNoYWtlIGhzID0gSGFuZHNoYWtlLmNyYWZ0KHRvcnJlbnRIYXNoLCBwZWVySWQpOworCisgICAgaWYgKGhzID09IG51bGwpIHsKKyAgICAgIGZhaWwoIkhhbmRzaGFrZSBpbnN0YW5jZSBpcyBudWxsIik7CisgICAgfQorCisgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gaHMuZ2V0RGF0YSgpOworICAgIGNsaWVudC53cml0ZShieXRlQnVmZmVyKTsKKworICAgIGZpbmFsIEZpbGUgdGVtcEZpbGUgPSBteVRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDI0ICogMTAyNCk7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIFVSSS5jcmVhdGUoIiIpLCAidGVzdCIpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBteVRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG9ycmVudEZpbGUpOworICAgIGZvcy53cml0ZShuZXcgVG9ycmVudFNlcmlhbGl6ZXIoKS5zZXJpYWxpemUodG9ycmVudCkpOworICAgIGZvcy5jbG9zZSgpOworCisgICAgZmluYWwgTG9hZGVkVG9ycmVudCBsb2FkZWRUb3JyZW50ID0gbW9jayhMb2FkZWRUb3JyZW50LmNsYXNzKTsKKyAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHNoYXJlZFRvcnJlbnQgPQorICAgICAgICAgICAgU2hhcmVkVG9ycmVudC5mcm9tRmlsZSh0b3JyZW50RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZSh0b3JyZW50LCBGaWxlQ29sbGVjdGlvblN0b3JhZ2UuY3JlYXRlKHRvcnJlbnQsIHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSkpLAorICAgICAgICAgICAgICAgICAgICBsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRTdGF0aXN0aWMoKSk7CisKKyAgICBUb3JyZW50TG9hZGVyIHRvcnJlbnRzTG9hZGVyID0gbW9jayhUb3JyZW50TG9hZGVyLmNsYXNzKTsKKyAgICB3aGVuKHRvcnJlbnRzTG9hZGVyLmxvYWRUb3JyZW50KGxvYWRlZFRvcnJlbnQpKS50aGVuUmV0dXJuKHNoYXJlZFRvcnJlbnQpOworICAgIHdoZW4obXlDb250ZXh0LmdldFRvcnJlbnRMb2FkZXIoKSkudGhlblJldHVybih0b3JyZW50c0xvYWRlcik7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisgICAgd2hlbihteUNvbnRleHQuZ2V0RXhlY3V0b3IoKSkudGhlblJldHVybihleGVjdXRvclNlcnZpY2UpOworICAgIG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hZGRUb3JyZW50KGhzLmdldEhleEluZm9IYXNoKCksIGxvYWRlZFRvcnJlbnQpOworCisgICAgZmluYWwgQXRvbWljQm9vbGVhbiBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZEludm9rZXIgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICB3aGVuKG15Q29udGV4dC5jcmVhdGVTaGFyaW5nUGVlcihhbnkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgIGFueUludCgpLAorICAgICAgICAgICAgYW55KEJ5dGVCdWZmZXIuY2xhc3MpLAorICAgICAgICAgICAgYW55KFNoYXJlZFRvcnJlbnQuY2xhc3MpLAorICAgICAgICAgICAgYW55KEJ5dGVDaGFubmVsLmNsYXNzKSwKKyAgICAgICAgICAgIGFueShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgYW55SW50KCkpKQorICAgICAgICAgICAgLnRoZW5SZXR1cm4obmV3IFNoYXJpbmdQZWVyKCIxMjcuMC4wLjEiLCA2ODgxLCBCeXRlQnVmZmVyLndyYXAocGVlcklkKSwgc2hhcmVkVG9ycmVudCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbW9jayhQZWVyQWN0aXZpdHlMaXN0ZW5lci5jbGFzcyksIHNlcnZlciwgIlRPIiwgMTIzNCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKSB7CisgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXN0YWJsaXNoZWRJbnZva2VyLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgIFBlZXJzU3RvcmFnZSBwZWVyc1N0b3JhZ2UgPSBteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKS5zaXplKCksIDApOworICAgIG15SGFuZHNoYWtlUmVjZWl2ZXIucHJvY2Vzc0FuZEdldE5leHQoc2VydmVyKTsKKyAgICBhc3NlcnRFcXVhbHMocGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKSwgMSk7CisgICAgQnl0ZUJ1ZmZlciBhbnN3ZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ5dGVCdWZmZXIuY2FwYWNpdHkoKSk7CisgICAgY2xpZW50LnJlYWQoYW5zd2VyKTsKKyAgICBhbnN3ZXIucmV3aW5kKCk7CisgICAgSGFuZHNoYWtlIGFuc3dlckhzID0gSGFuZHNoYWtlLnBhcnNlKGFuc3dlcik7CisgICAgYXNzZXJ0RXF1YWxzKGFuc3dlckhzLmdldFBlZXJJZCgpLCBteVNlbGZJZCk7CisgICAgc2VtYXBob3JlLnRyeUFjcXVpcmUoMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgYXNzZXJ0VHJ1ZShvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZEludm9rZXIuZ2V0KCkpOworICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICB9CisKKyAgLy8gVE9ETzogMTEvMTUvMTcgYmFkIHRlc3RzIChlLmcuIGluY29ycmVjdCB0b3JyZW50SUQsIGluY29ycmVjdCBoYW5kc2hha2UsIGV0YworCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ5dGVTb3VyY2VDaGFubmVsIGltcGxlbWVudHMgQnl0ZUNoYW5uZWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQaXBlLlNvdXJjZUNoYW5uZWwgcmVhZENoYW5uZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBQaXBlLlNpbmtDaGFubmVsIHdyaXRlQ2hhbm5lbDsKKworICAgIHB1YmxpYyBCeXRlU291cmNlQ2hhbm5lbChQaXBlLlNvdXJjZUNoYW5uZWwgcmVhZENoYW5uZWwsIFBpcGUuU2lua0NoYW5uZWwgd3JpdGVDaGFubmVsKSB7CisgICAgICB0aGlzLnJlYWRDaGFubmVsID0gcmVhZENoYW5uZWw7CisgICAgICB0aGlzLndyaXRlQ2hhbm5lbCA9IHdyaXRlQ2hhbm5lbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gcmVhZENoYW5uZWwucmVhZChkc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdGhpcy53cml0ZUNoYW5uZWwud3JpdGUoc3JjKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmVhZENoYW5uZWwuY2xvc2UoKTsKKyAgICAgIHdyaXRlQ2hhbm5lbC5jbG9zZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5VGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEZpbGU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnlUZXN0IHsKKworICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpbmdTdG9yYWdlRm9yTGFyZ2VGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKworICAgIGludCBwaWVjZUxlbmd0aCA9IDEwMjQgKiAxMDI0OworICAgIGludCBwaWVjZUNvdW50ID0gMzAwMDsKKworICAgIC8vbGFzdCBwaWVjZSBjYW4gaGF2ZSBub3QgZnVsbHkgc2l6ZQorICAgIGZpbmFsIGludCBsYXN0UGllY2VMZW5ndGggPSBwaWVjZUxlbmd0aCAvIDI7CisgICAgbG9uZyB0b3RhbFNpemUgPSAobG9uZykgKHBpZWNlQ291bnQgLSAxKSAqIHBpZWNlTGVuZ3RoICsgbGFzdFBpZWNlTGVuZ3RoOworCisgICAgVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhID0gbW9jayhUb3JyZW50TWV0YWRhdGEuY2xhc3MpOworICAgIHdoZW4obWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKSkudGhlblJldHVybihwaWVjZUxlbmd0aCk7CisgICAgd2hlbihtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpKS50aGVuUmV0dXJuKHBpZWNlQ291bnQpOworICAgIHdoZW4obWV0YWRhdGEuZ2V0RmlsZXMoKSkudGhlblJldHVybihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBUb3JyZW50RmlsZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJ0ZXN0LmF2aSIpLCB0b3RhbFNpemUsICIiKSkpOworICAgIHdoZW4obWV0YWRhdGEuZ2V0UGllY2VzSGFzaGVzKCkpLnRoZW5SZXR1cm4obmV3IGJ5dGVbcGllY2VDb3VudCAqIDIwXSk7CisKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIGlzUmVhZEludm9rZWRGb3JMYXN0UGllY2UgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgVG9ycmVudEJ5dGVTdG9yYWdlIHN0b3JhZ2UgPSBuZXcgVG9ycmVudEJ5dGVTdG9yYWdlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvcGVuKGJvb2xlYW4gc2VlZGVyKSB7CisKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpID09IGxhc3RQaWVjZUxlbmd0aCkgeworICAgICAgICAgIGlzUmVhZEludm9rZWRGb3JMYXN0UGllY2Uuc2V0KHRydWUpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5wdXRJbnQoMSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBibG9jaywgbG9uZyBwb3NpdGlvbikgeworICAgICAgICB0aHJvdyBub3RJbXBsZW1lbnRlZCgpOworICAgICAgfQorCisgICAgICBATm90TnVsbAorICAgICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIG5vdEltcGxlbWVudGVkKCkgeworICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm5vdEltcGxlbWVudGVkIik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICB0aHJvdyBub3RJbXBsZW1lbnRlZCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgICAgIHRocm93IG5vdEltcGxlbWVudGVkKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gaXNCbGFuayhsb25nIHBvc2l0aW9uLCBsb25nIHNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgICAgICAgIHRocm93IG5vdEltcGxlbWVudGVkKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisKKyAgICAgIH0KKyAgICB9OworCisgICAgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZSA9IEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVN0b3JhZ2UobWV0YWRhdGEsIHN0b3JhZ2UpOworCisgICAgYXNzZXJ0VHJ1ZShpc1JlYWRJbnZva2VkRm9yTGFzdFBpZWNlLmdldCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCkpOworICAgIGFzc2VydEZhbHNlKHBpZWNlU3RvcmFnZS5pc0ZpbmlzaGVkKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlQ29sbGVjdGlvblN0b3JhZ2VUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZUNvbGxlY3Rpb25TdG9yYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGI3MTgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZUNvbGxlY3Rpb25TdG9yYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5UZW1wRmlsZXM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFVzZXI6IGxveWQKKyAqIERhdGU6IDExLzI0LzEzCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlQ29sbGVjdGlvblN0b3JhZ2VUZXN0IHsKKworICBwcml2YXRlIFRlbXBGaWxlcyB0ZW1wRmlsZXM7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICB0ZW1wRmlsZXMgPSBuZXcgVGVtcEZpbGVzKCk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgdGVtcEZpbGVzLmNsZWFudXAoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlIGZpbGUxID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgZmluYWwgRmlsZSBmaWxlMiA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworCisgICAgZmluYWwgTGlzdDxGaWxlU3RvcmFnZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGVTdG9yYWdlPigpOworICAgIGZpbGVzLmFkZChuZXcgRmlsZVN0b3JhZ2UoZmlsZTEsIDAsIDIpKTsKKyAgICBmaWxlcy5hZGQobmV3IEZpbGVTdG9yYWdlKGZpbGUyLCAyLCAyKSk7CisgICAgZmluYWwgRmlsZUNvbGxlY3Rpb25TdG9yYWdlIHN0b3JhZ2UgPSBuZXcgRmlsZUNvbGxlY3Rpb25TdG9yYWdlKGZpbGVzLCA0KTsKKworICAgIHN0b3JhZ2Uub3BlbihmYWxzZSk7CisgICAgdHJ5IHsKKyAgICAgIC8vIHNpbmNlIGFsbCBvZiB0aGVzZSBmaWxlcyBhbHJlYWR5IGV4aXN0LCB3ZSBhcmUgY29uc2lkZXJlZCBmaW5pc2hlZAorICAgICAgYXNzZXJ0VHJ1ZShzdG9yYWdlLmlzRmluaXNoZWQoKSk7CisKKyAgICAgIC8vIHdyaXRlIHRvIGZpcnN0IGZpbGUgd29ya3MKKyAgICAgIHdyaXRlKG5ldyBieXRlW117MSwgMn0sIDAsIHN0b3JhZ2UpOworICAgICAgY2hlY2sobmV3IGJ5dGVbXXsxLCAyfSwgZmlsZTEpOworCisgICAgICAvLyB3cml0ZSB0byBzZWNvbmQgZmlsZSB3b3JrcworICAgICAgd3JpdGUobmV3IGJ5dGVbXXs1LCA2fSwgMiwgc3RvcmFnZSk7CisgICAgICBjaGVjayhuZXcgYnl0ZVtdezUsIDZ9LCBmaWxlMik7CisKKyAgICAgIC8vIHdyaXRlIHRvIHR3byBmaWxlcyB3b3JrcworICAgICAgd3JpdGUobmV3IGJ5dGVbXXs4LCA5LCAxMCwgMTF9LCAwLCBzdG9yYWdlKTsKKyAgICAgIGNoZWNrKG5ldyBieXRlW117OCwgOX0sIGZpbGUxKTsKKyAgICAgIGNoZWNrKG5ldyBieXRlW117MTAsIDExfSwgZmlsZTIpOworCisgICAgICAvLyBtYWtlIHN1cmUgcGFydGlhbCB3cml0ZSBpbnRvIG5leHQgZmlsZSB3b3JrcworICAgICAgd3JpdGUobmV3IGJ5dGVbXXsxMDAsIDEwMSwgMTAyfSwgMCwgc3RvcmFnZSk7CisgICAgICBjaGVjayhuZXcgYnl0ZVtdezEwMiwgMTF9LCBmaWxlMik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHN0b3JhZ2UuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGUoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBGaWxlQ29sbGVjdGlvblN0b3JhZ2Ugc3RvcmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzdG9yYWdlLndyaXRlKEJ5dGVCdWZmZXIud3JhcChieXRlcyksIG9mZnNldCk7CisgICAgc3RvcmFnZS5maW5pc2goKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVjayhieXRlW10gYnl0ZXMsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBieXRlW10gdGVtcCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aF07CisgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7CisgICAgZmluYWwgaW50IHRvdGFsUmVhZDsKKyAgICB0cnkgeworICAgICAgdG90YWxSZWFkID0gZmlsZUlucHV0U3RyZWFtLnJlYWQodGVtcCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZpbGVJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHModG90YWxSZWFkLCB0ZW1wLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKHRlbXAsIGJ5dGVzKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VJbXBsVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUltcGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhYzc3MAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQnl0ZUFycmF5U3RvcmFnZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFBpZWNlU3RvcmFnZUltcGxUZXN0IHsKKworICBwcml2YXRlIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2U7CisgIHByaXZhdGUgaW50IHBpZWNlU2l6ZTsKKyAgcHJpdmF0ZSBpbnQgcGllY2VDb3VudDsKKyAgcHJpdmF0ZSBieXRlW10gYWxsUGllY2VzOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgcGllY2VTaXplID0gMTI7CisgICAgcGllY2VDb3VudCA9IDg7CisgICAgQnl0ZUFycmF5U3RvcmFnZSBzdG9yYWdlID0gbmV3IEJ5dGVBcnJheVN0b3JhZ2UocGllY2VTaXplICogcGllY2VDb3VudCk7CisgICAgcGllY2VTdG9yYWdlID0gbmV3IFBpZWNlU3RvcmFnZUltcGwoc3RvcmFnZSwgbmV3IEJpdFNldCgpLCBwaWVjZUNvdW50LCBwaWVjZVNpemUpOworICAgIGFsbFBpZWNlcyA9IG5ldyBieXRlW3BpZWNlQ291bnQgKiBwaWVjZVNpemVdOworICAgIGZvciAoYnl0ZSBpID0gMDsgaSA8IGFsbFBpZWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgYWxsUGllY2VzW2ldID0gaTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBhc3NlcnRFcXVhbHMocGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksIDApOworICAgIGJ5dGVbXSBmaXJzdFBpZWNlRGF0YSA9IEFycmF5cy5jb3B5T2ZSYW5nZShhbGxQaWVjZXMsIHBpZWNlU2l6ZSwgMiAqIHBpZWNlU2l6ZSk7CisgICAgcGllY2VTdG9yYWdlLnNhdmVQaWVjZSgxLCBmaXJzdFBpZWNlRGF0YSk7CisgICAgYnl0ZVtdIHRoaXJkUGllY2VEYXRhID0gQXJyYXlzLmNvcHlPZlJhbmdlKGFsbFBpZWNlcywgMyAqIHBpZWNlU2l6ZSwgNCAqIHBpZWNlU2l6ZSk7CisgICAgcGllY2VTdG9yYWdlLnNhdmVQaWVjZSgzLCB0aGlyZFBpZWNlRGF0YSk7CisKKyAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpOworICAgIGFzc2VydEVxdWFscyhhdmFpbGFibGVQaWVjZXMuY2FyZGluYWxpdHkoKSwgMik7CisgICAgYXNzZXJ0VHJ1ZShhdmFpbGFibGVQaWVjZXMuZ2V0KDEpKTsKKyAgICBhc3NlcnRUcnVlKGF2YWlsYWJsZVBpZWNlcy5nZXQoMykpOworCisgICAgYnl0ZVtdIGFjdHVhbEZpcnN0UGllY2VEYXRhID0gcGllY2VTdG9yYWdlLnJlYWRQaWVjZVBhcnQoMSwgMCwgcGllY2VTaXplKTsKKyAgICBieXRlW10gYWN0dWFsVGhpcmRQaWVjZURhdGEgPSBwaWVjZVN0b3JhZ2UucmVhZFBpZWNlUGFydCgzLCAwLCBwaWVjZVNpemUpOworICAgIGFzc2VydEVxdWFscyhhY3R1YWxGaXJzdFBpZWNlRGF0YSwgZmlyc3RQaWVjZURhdGEpOworICAgIGFzc2VydEVxdWFscyhhY3R1YWxUaGlyZFBpZWNlRGF0YSwgdGhpcmRQaWVjZURhdGEpOworCisgICAgLy9jaGVjayB0aGF0IHJlYWRpbmcgYnkgcGFydHMgd29ya3MgY29ycmVjdGx5CisgICAgYnl0ZVtdIGZpcnN0UGllY2VQYXJ0ID0gcGllY2VTdG9yYWdlLnJlYWRQaWVjZVBhcnQoMSwgMCwgcGllY2VTaXplIC8gMik7CisgICAgYnl0ZVtdIHNlY29uZFBpZWNlUGFydCA9IHBpZWNlU3RvcmFnZS5yZWFkUGllY2VQYXJ0KDEsIHBpZWNlU2l6ZSAvIDIsIHBpZWNlU2l6ZSAvIDIpOworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgb3V0cHV0U3RyZWFtLndyaXRlKGZpcnN0UGllY2VQYXJ0KTsKKyAgICBvdXRwdXRTdHJlYW0ud3JpdGUoc2Vjb25kUGllY2VQYXJ0KTsKKyAgICBhc3NlcnRFcXVhbHMoZmlyc3RQaWVjZURhdGEsIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEZ1bGxTdG9yYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMocGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksIDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGllY2VDb3VudDsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMocGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCksIGkpOworICAgICAgcGllY2VTdG9yYWdlLnNhdmVQaWVjZShpLCBBcnJheXMuY29weU9mUmFuZ2UoYWxsUGllY2VzLCBpICogcGllY2VTaXplLCAoaSArIDEpICogcGllY2VTaXplKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwgcGllY2VDb3VudCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkVW5hdmFpbGFibGVQaWVjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcGllY2VTdG9yYWdlLnJlYWRQaWVjZVBhcnQoNDUsIDAsIHBpZWNlU2l6ZSk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHBpZWNlU3RvcmFnZS5jbG9zZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZ1Rlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDU3YjcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKK2ltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworcHVibGljIGNsYXNzIFJlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZ1Rlc3QgeworCisgIHByaXZhdGUgZmluYWwgU29ydGVkU2V0PFBpZWNlPiBteVJhcmVzdCA9IG51bGw7Ly9teVJhcmVzdCBkb24ndCBuZWVkIGZvciBpdCBzdHJhdGVneQorICBwcml2YXRlIGZpbmFsIGludCBteVBpZWNlc1RvdGFsID0gMTA7CisgIHByaXZhdGUgZmluYWwgUGllY2VbXSBteVBpZWNlcyA9IG5ldyBQaWVjZVtteVBpZWNlc1RvdGFsXTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U3RyYXRlZ3kgbXlSZXF1ZXN0U3RyYXRlZ3kgPSBuZXcgUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nKCk7CisKKyAgQEJlZm9yZUNsYXNzCisgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteVBpZWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgbXlQaWVjZXNbaV0gPSBuZXcgUGllY2UobnVsbCwgaSwgMCwgbmV3IGJ5dGVbMF0pOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNob29zZVBpZWNlTm9JbnRlcmVzdGluZ1Rlc3QoKSB7CisgICAgUGllY2UgYWN0dWFsID0gbXlSZXF1ZXN0U3RyYXRlZ3kuY2hvb3NlUGllY2UobmV3IEJpdFNldCgpLCBteVBpZWNlcyk7CisgICAgQXNzZXJ0LmFzc2VydE51bGwoYWN0dWFsKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNob29zZVBpZWNlT25lSW50ZXJlc3RpbmdUZXN0KCkgeworICAgIEJpdFNldCBpbnRlcmVzdGluZyA9IG5ldyBCaXRTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG15UGllY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpbnRlcmVzdGluZy5jbGVhcigpOworICAgICAgaW50ZXJlc3Rpbmcuc2V0KGkpOworICAgICAgUGllY2UgZXhwZWN0ZWQgPSBteVBpZWNlc1tpXTsKKyAgICAgIFBpZWNlIGFjdHVhbCA9IG15UmVxdWVzdFN0cmF0ZWd5LmNob29zZVBpZWNlKGludGVyZXN0aW5nLCBteVBpZWNlcyk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNob29zZVBpZWNlVGVzdCgpIHsKKyAgICBCaXRTZXQgaW50ZXJlc3RpbmcgPSBuZXcgQml0U2V0KCk7CisgICAgaW50IGludGVyZXN0aW5nRnJvbSA9IDE7CisgICAgaW50IGludGVyZXN0aW5nVG8gPSA1OworICAgIGludGVyZXN0aW5nLnNldChpbnRlcmVzdGluZ0Zyb20sIGludGVyZXN0aW5nVG8pOworICAgIFBpZWNlIGFjdHVhbCA9IG15UmVxdWVzdFN0cmF0ZWd5LmNob29zZVBpZWNlKGludGVyZXN0aW5nLCBteVBpZWNlcyk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUoYWN0dWFsLmdldEluZGV4KCkgPj0gaW50ZXJlc3RpbmdGcm9tICYmIGFjdHVhbC5nZXRJbmRleCgpIDw9IGludGVyZXN0aW5nVG8pOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjFiZWIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9wb20ueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxuYW1lPnR0b3JyZW50L3RyYWNrZXI8L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1iZW5jb2Rpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC10ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvQWRkcmVzc0NoZWNrZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9BZGRyZXNzQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjQxZWEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvQWRkcmVzc0NoZWNrZXIuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgQWRkcmVzc0NoZWNrZXIgeworCisgIC8qKgorICAgKiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiB0cnVlIGlmIGlzIGluY29ycmVjdCBpcCBhbmQgb3RoZXIgcGVlcnMgY2FuIG5vdCBjb25uZWN0IHRvIHRoaXMgcGVlci4gSWYgdGhpcyBtZXRob2QgcmV0dXJuIHRydWUKKyAgICogdHJhY2tlciBkb2Vzbid0IHJlZ2lzdGVyIHRoZSBwZWVyIGZvciBjdXJyZW50IHRvcnJlbnQKKyAgICoKKyAgICog5qOA6aqM5Lyg5YWl55qEcGVlciBpcOaYr+WQpuaYr+ato+ehrueahAorICAgKiBAcGFyYW0gaXAgc3BlY2lmaWVkIGFkZHJlc3MKKyAgICovCisgIGJvb2xlYW4gaXNCYWRBZGRyZXNzKFN0cmluZyBpcCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9NdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL011bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9NdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cC5IVFRQVHJhY2tlckVycm9yTWVzc2FnZTsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuU3RhdHVzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworcHVibGljIGNsYXNzIE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yIHsKKworICBwcml2YXRlIGZpbmFsIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIG15VHJhY2tlclJlcXVlc3RQcm9jZXNzb3I7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yLmNsYXNzKTsKKworICBwdWJsaWMgTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IoVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgdHJhY2tlclJlcXVlc3RQcm9jZXNzb3IpIHsKKyAgICBteVRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yID0gdHJhY2tlclJlcXVlc3RQcm9jZXNzb3I7CisgIH0KKworICBwdWJsaWMgdm9pZCBwcm9jZXNzKGZpbmFsIFN0cmluZyBib2R5LCBmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBTdHJpbmcgaG9zdEFkZHJlc3MsIGZpbmFsIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLlJlcXVlc3RIYW5kbGVyIHJlcXVlc3RIYW5kbGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgZmluYWwgTGlzdDxCRVZhbHVlPiByZXNwb25zZU1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNBbnlTdWNjZXNzID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIGZvciAoU3RyaW5nIHMgOiBib2R5LnNwbGl0KCJcbiIpKSB7CisgICAgICBteVRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLnByb2Nlc3MocywgaG9zdEFkZHJlc3MsIG5ldyBUcmFja2VyUmVxdWVzdFByb2Nlc3Nvci5SZXF1ZXN0SGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlUmVzcG9uc2UoaW50IGNvZGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQnl0ZUJ1ZmZlciByZXNwb25zZURhdGEpIHsKKyAgICAgICAgICBpc0FueVN1Y2Nlc3Muc2V0KGlzQW55U3VjY2Vzcy5nZXQoKSB8fCAoY29kZSA9PSBTdGF0dXMuT0suZ2V0Q29kZSgpKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZXMuYWRkKEJEZWNvZGVyLmJkZWNvZGUocmVzcG9uc2VEYXRhKSk7CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNhbm5vdCBkZWNvZGUgbWVzc2FnZSBmcm9tIGJ5dGUgYnVmZmVyIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgICAgaWYgKHJlc3BvbnNlTWVzc2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICBCeXRlQnVmZmVyIHJlczsKKyAgICAgIFN0YXR1cyBzdGF0dXM7CisgICAgICByZXMgPSBIVFRQVHJhY2tlckVycm9yTWVzc2FnZS5jcmFmdCgiIikuZ2V0RGF0YSgpOworICAgICAgc3RhdHVzID0gU3RhdHVzLkJBRF9SRVFVRVNUOworICAgICAgcmVxdWVzdEhhbmRsZXIuc2VydmVSZXNwb25zZShzdGF0dXMuZ2V0Q29kZSgpLCAiIiwgcmVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBCRW5jb2Rlci5iZW5jb2RlKHJlc3BvbnNlTWVzc2FnZXMsIG91dCk7CisgICAgcmVxdWVzdEhhbmRsZXIuc2VydmVSZXNwb25zZShpc0FueVN1Y2Nlc3MuZ2V0KCkgPyBTdGF0dXMuT0suZ2V0Q29kZSgpIDogU3RhdHVzLkJBRF9SRVFVRVNULmdldENvZGUoKSwgIiIsIEJ5dGVCdWZmZXIud3JhcChvdXQudG9CeXRlQXJyYXkoKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvUGVlckNvbGxlY3RvclRocmVhZC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1BlZXJDb2xsZWN0b3JUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJkMGUyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1BlZXJDb2xsZWN0b3JUaHJlYWQuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKKy8qKgorICogVGhlIHVuZnJlc2ggcGVlciBjb2xsZWN0b3IgdGhyZWFkLgorICogPHA+CisgKiA8cD4KKyAqIEV2ZXJ5IFBFRVJfQ09MTEVDVElPTl9GUkVRVUVOQ1lfU0VDT05EUywgdGhpcyB0aHJlYWQgd2lsbCBjb2xsZWN0CisgKiB1bmZyZXNoIHBlZXJzIGZyb20gYWxsIGFubm91bmNlZCB0b3JyZW50cy4KKyAqIDwvcD4KKyAqLworCisvLyDlkajmnJ/mgKflnLDmuIXnkIbkuI3lho3mtLvot4PnmoQgcGVlcnMKK3B1YmxpYyBjbGFzcyBQZWVyQ29sbGVjdG9yVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xMRUNUSU9OX0ZSRVFVRU5DWSA9IDEwOworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRzUmVwb3NpdG9yeSBteVRvcnJlbnRzUmVwb3NpdG9yeTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbXlUb3JyZW50RXhwaXJlVGltZW91dFNlYyA9IDIwICogNjA7CisKKyAgcHVibGljIFBlZXJDb2xsZWN0b3JUaHJlYWQoVG9ycmVudHNSZXBvc2l0b3J5IHRvcnJlbnRzUmVwb3NpdG9yeSkgeworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5ID0gdG9ycmVudHNSZXBvc2l0b3J5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VG9ycmVudEV4cGlyZVRpbWVvdXRTZWMoaW50IHRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjKSB7CisgICAgbXlUb3JyZW50RXhwaXJlVGltZW91dFNlYyA9IHRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICB3aGlsZSAoIWlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkuY2xlYW51cChteVRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjKTsKKyAgICAgIHRyeSB7CisgICAgICAgIFRocmVhZC5zbGVlcChDT0xMRUNUSU9OX0ZSRVFVRU5DWSAqIDEwMDApOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVG9ycmVudHNSZXBvc2l0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVG9ycmVudHNSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhZTg5MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9Ub3JyZW50c1JlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOworCisvLyDnrqHnkIblkozlrZjlgqggdG9ycmVudHPvvIjnp43lrZDmlofku7bvvInkv6Hmga/nmoTku5PlupPvvIzlroPlrp7njrDkuoblr7kgdG9ycmVudHMg55qE5aKe44CB5p+l44CB5pu05paw44CB5riF55CG562J5pON5L2c44CCCisvLyDov5nkuKrnsbvnmoTlrp7njrDkuLvopoHnlKjkuo7kuIDkuKogVHJhY2tlciDmnI3liqHlmajvvIzotJ/otKPnrqHnkIYgdG9ycmVudCDkv6Hmga/lubblr7nlj4LkuI7kuIvovb3lkozkuIrkvKDnmoQgcGVlciDov5vooYzot5/ouKrjgIIKKworLy90b3JyZW505a2Y5YKo5LuT5bqT77yM6IO95qC55o2uaW5mb2hhc2jnmoTlgLzvvIzojrflj5bllK/kuIDnmoR0b3JyZW5077yM6IO95a6e546w5LiK5LygCisvLyB0b3JyZW50IOebuOWFs+S/oeaBr++8muaVtOS4qiBCVCDnp43lrZDmlofku7blrp7pmYXkuIrlsLHmmK/kuIDkuKogYmVuY29kaW5nIOe8lueggeeahCBEaWN0aW9uYXJ5LCDlroPmnInkuKTkuKogS2V5LCDliIbliKvmmK8gYW5ub3VuY2Ug5ZKMIGluZm8KKy8vIGFubm91bmNl5pivYnRUcmFja2Vy55qEdXJsCisvLyBpbmZv5piv5a2X5YW477yM5a+55bqU6LWE5rqQ55u45YWz5L+h5oGv77yMbmFtZe+8jHBpZWNlIGxlbmd0aO+8iOWIhueJh+mVv+W6pu+8iQorLy8gICAgICBwaWVjZe+8iOWkhOeQhuWwhuaVsOaNruWIhueJh++8iQorLy8gICAgICBsZW5ndGggLyBmaWxlc++8iOi/meS4pOS4qumUruS4jeiDveWQjOaXtuWtmOWcqCwg5pyJ5LiU5LuF5pyJ5YW25Lit5LiA5Liq77yM5Y+q5piv5LiA5Liq5paH5Lu25pivbGVuZ3Ro77yM5paH5Lu25aS55pivZmlsZXPvvIkKKworcHVibGljIGNsYXNzIFRvcnJlbnRzUmVwb3NpdG9yeSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2tbXSBteUxvY2tzOworICAgIC8vICBDb25jdXJyZW50TWFw5LiA56eN57q/56iL5a6J5YWo55qEbWFw5pig5bCE77yM6ZSu5YC85a+55bqU77yMdG9ycmVudCDnmoTlk4jluIzlgLwtLVRyYWNrZWRUb3JyZW50CisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgVHJhY2tlZFRvcnJlbnQ+IG15VG9ycmVudHM7CisKKyAgICAvLyDmnoTpgKDlh73mlbAKKyAgICBwdWJsaWMgVG9ycmVudHNSZXBvc2l0b3J5KGludCBsb2Nrc0NvdW50KSB7CisKKyAgICAgICAgaWYgKGxvY2tzQ291bnQgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9jayBjb3VudCBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgIH0KKworICAgICAgICBteUxvY2tzID0gbmV3IFJlZW50cmFudExvY2tbbG9ja3NDb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXlMb2Nrcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbXlMb2Nrc1tpXSA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgbXlUb3JyZW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFRyYWNrZWRUb3JyZW50PigpOworICAgIH0KKworICAgIC8vICDmoLnmja7kvKDlhaXnmoTnp43lrZDnmoTlk4jluIzlgLxoZXhJbmZvSGFzaO+8jOiOt+WPllRyYWNrZWRUb3JyZW505a+56LGhCisgICAgcHVibGljIFRyYWNrZWRUb3JyZW50IGdldFRvcnJlbnQoU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgICAgIHJldHVybiBteVRvcnJlbnRzLmdldChoZXhJbmZvSGFzaCk7CisgICAgfQorCisgICAgLy8gdG9ycmVudOS4jeWtmOWcqO+8jOi/m+ihjOa3u+WKoOaTjeS9nAorICAgIHB1YmxpYyB2b2lkIHB1dElmQWJzZW50KFN0cmluZyBoZXhJbmZvSGFzaCwgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCkgeworICAgICAgICBteVRvcnJlbnRzLnB1dElmQWJzZW50KGhleEluZm9IYXNoLCB0b3JyZW50KTsKKyAgICAgICAgLy/osIPnlKhteVRvcnJlbnRz57G75Z6LQ29uY3VycmVudE1hcOS4i+eahOa3u+WKoOWHveaVsAorICAgIH0KKyAgICAvLyDmm7TmlrB0b3JyZW505pWw5o2uCisgICAgcHVibGljIFRyYWNrZWRUb3JyZW50IHB1dElmQWJzZW50QW5kVXBkYXRlKFN0cmluZyBoZXhJbmZvSGFzaCwgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsIEJ5dGVCdWZmZXIgcGVlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGV4UGVlcklkLCBTdHJpbmcgaXAsIGludCBwb3J0LCBsb25nIHVwbG9hZGVkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVmdCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBUcmFja2VkVG9ycmVudCBhY3R1YWxUb3JyZW50OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9ja0ZvcihoZXhJbmZvSGFzaCkubG9jaygpOworICAgICAgICAgICAgVHJhY2tlZFRvcnJlbnQgb2xkVG9ycmVudCA9IG15VG9ycmVudHMucHV0SWZBYnNlbnQoaGV4SW5mb0hhc2gsIHRvcnJlbnQpOworICAgICAgICAgICAgYWN0dWFsVG9ycmVudCA9IG9sZFRvcnJlbnQgPT0gbnVsbCA/IHRvcnJlbnQgOiBvbGRUb3JyZW50OworICAgICAgICAgICAgYWN0dWFsVG9ycmVudC51cGRhdGUoZXZlbnQsIHBlZXJJZCwgaGV4UGVlcklkLCBpcCwgcG9ydCwgdXBsb2FkZWQsIGRvd25sb2FkZWQsIGxlZnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9ja0ZvcihoZXhJbmZvSGFzaCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdHVhbFRvcnJlbnQ7CisgICAgfQorCisgICAgLy8g6ZSB77yM6YG/5YWN6Zi75aGe5YW25LuWdG9ycmVudOaTjeS9nAorICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBsb2NrRm9yKFN0cmluZyB0b3JyZW50SGFzaCkgeworICAgICAgICByZXR1cm4gbXlMb2Nrc1tNYXRoLmFicyh0b3JyZW50SGFzaC5oYXNoQ29kZSgpKSAlIG15TG9ja3MubGVuZ3RoXTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbXlUb3JyZW50cy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoaW50IHRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjKSB7CisgICAgICAgIGZvciAoVHJhY2tlZFRvcnJlbnQgdHJhY2tlZFRvcnJlbnQgOiBteVRvcnJlbnRzLnZhbHVlcygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2tGb3IodHJhY2tlZFRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSkubG9jaygpOworICAgICAgICAgICAgICAgIHRyYWNrZWRUb3JyZW50LmNvbGxlY3RVbmZyZXNoUGVlcnModG9ycmVudEV4cGlyZVRpbWVvdXRTZWMpOworICAgICAgICAgICAgICAgIGlmICh0cmFja2VkVG9ycmVudC5nZXRQZWVycygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG15VG9ycmVudHMucmVtb3ZlKHRyYWNrZWRUb3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbG9ja0Zvcih0cmFja2VkVG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKS51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFRyYWNrZWRUb3JyZW50PiBnZXRUb3JyZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgVHJhY2tlZFRvcnJlbnQ+KG15VG9ycmVudHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZWRQZWVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFBlZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA1N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZWRQZWVyLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uKjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEEgQml0VG9ycmVudCB0cmFja2VyIHBlZXIuCisgKiA8cD4KKyAqIDxwPgorICogUmVwcmVzZW50cyBhIHBlZXIgZXhjaGFuZ2luZyBvbiBhIGdpdmVuIHRvcnJlbnQuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sCisgKiB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBwZWVycyBhbmQgaG93IG11Y2ggdGhleQorICogaGF2ZSBkb3dubG9hZGVkIC8gZXhjaGFuZ2VkIGJlY2F1c2Ugd2UgYXJlIG5vdCBhIHRvcnJlbnQgZXhjaGFuZ2UgYW5kCisgKiBkb24ndCBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBwZWVycyBhcmUgZG9pbmcgd2hpbGUgdGhleSdyZQorICogZG93bmxvYWRpbmcuIFdlIG9ubHkgY2FyZSBhYm91dCB3aGVuIHRoZXkgc3RhcnQsIGFuZCB3aGVuIHRoZXkgYXJlIGRvbmUuCisgKiA8L3A+CisgKiA8cD4KKyAqIDxwPgorICogV2UgYWxzbyBuZXZlciBleHBpcmUgcGVlcnMgYXV0b21hdGljYWxseS4gVW5sZXNzIHBlZXJzIHNlbmQgYSBTVE9QUEVECisgKiBhbm5vdW5jZSByZXF1ZXN0LCB0aGV5IHJlbWFpbiBhcyBsb25nIGFzIHRoZSB0b3JyZW50IG9iamVjdCB0aGV5IGFyZSBhCisgKiBwYXJ0IG9mLgorICogPC9wPgorICovCisKKy8vIOi3n+i4qnBlZXLvvIjlr7nnrYnnu5PngrnvvIznm7jlvZPkuo7kvb/nlKjor6V0cmFja2Vy55qE55So5oi377yJCisvKiDnrqHnkIbkuIDkuKpUcmFja2VkVG9ycmVudOenjeWtkOeahOebuOWFs+eahOeUqOaIt+Wvueixoe+8jOiDveW4ruWKqeWcqOS4i+i9veaXtuWAmeaJvuWIsOWvueixoeOAggorKiDmlrDkuIvovb3nlKjmiLflrozmiJDkuIvovb3lkI7ooqvmoIforrDkuLrlrozmiJDvvIzlj6/ku6Xmt7vliqAKKyogKi8KKy8vIOeuoeeQhueUqOaIt+eZu+W9leaXtumXtAorcHVibGljIGNsYXNzIFRyYWNrZWRQZWVyIGV4dGVuZHMgUGVlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNrZWRQZWVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFRpbWVTZXJ2aWNlIG15VGltZVNlcnZpY2U7CisgIHByaXZhdGUgbG9uZyB1cGxvYWRlZDsKKyAgcHJpdmF0ZSBsb25nIGRvd25sb2FkZWQ7CisgIHByaXZhdGUgbG9uZyBsZWZ0OworICBwcml2YXRlIFRyYWNrZWRUb3JyZW50IHRvcnJlbnQ7Ly/kuLrku4DkuYjljIXlkKvov5nkuKrlrp7kvovvvJ/vvJ8KKworICAvKioKKyAgICogUmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYSBwZWVyIGV4Y2hhbmdpbmcgb24gdGhpcyB0b3JyZW50LgorICAgKiDlsZXnpLrnlKjmiLflkoznp43lrZDpl7TnmoTnirbmgIHlhbPns7sKKyAgICogPHA+CisgICAqIDxwPgorICAgKiBQZWVycyBjYW4gYmUgaW4gdGhlIFNUQVJURUQgc3RhdGUsIG1lYW5pbmcgdGhleSBoYXZlIGFubm91bmNlZAorICAgKiB0aGVtc2VsdmVzIHRvIHVzIGFuZCBhcmUgZXZlbnR1YWxseSBleGNoYW5naW5nIGRhdGEgd2l0aCBvdGhlciBwZWVycy4KKyAgICogTm90ZSB0aGF0IGEgcGVlciBzdGFydGluZyB3aXRoIGEgY29tcGxldGVkIGZpbGUgd2lsbCBhbHNvIGJlIGluIHRoZQorICAgKiBzdGFydGVkIHN0YXRlIGFuZCB3aWxsIG5ldmVyIG5vdGlmeSBhcyBiZWluZyBpbiB0aGUgY29tcGxldGVkIHN0YXRlLgorICAgKiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIHBlZXIgcmVwb3J0cyAwCisgICAqIGJ5dGVzIGxlZnQgdG8gZG93bmxvYWQuCisgICAqIDwvcD4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiBQZWVycyBlbnRlciB0aGUgQ09NUExFVEVEIHN0YXRlIHdoZW4gdGhleSBhbm5vdW5jZSB0aGV5IGhhdmUgZW50aXJlbHkKKyAgICogZG93bmxvYWRlZCB0aGUgZmlsZS4gQXMgc3RhdGVkIGFib3ZlLCB3ZSBtYXkgYWxzbyBlbGVjdCB0aGVtIGZvciB0aGlzCisgICAqIHN0YXRlIGlmIHRoZXkgcmVwb3J0IDAgYnl0ZXMgbGVmdCB0byBkb3dubG9hZC4KKyAgICogPC9wPgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIFBlZXJzIGVudGVyIHRoZSBTVE9QUEVEIHN0YXRlIHZlcnkgYnJpZWZseSBiZWZvcmUgYmVpbmcgcmVtb3ZlZC4gV2UKKyAgICogc3RpbGwgcGFzcyB0aGVtIHRvIHRoZSBTVE9QUEVEIHN0YXRlIGluIGNhc2Ugc29tZW9uZSBlbHNlIGtlcHQgYQorICAgKiByZWZlcmVuY2Ugb24gdGhlbS4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIGVudW0gUGVlclN0YXRlIHsKKyAgICBVTktOT1dOLAorICAgIFNUQVJURUQsCisgICAgQ09NUExFVEVELAorICAgIFNUT1BQRUQKKyAgfQorCisgIHByaXZhdGUgUGVlclN0YXRlIHN0YXRlOworICBwcml2YXRlIGxvbmcgbGFzdEFubm91bmNlOyAvL+eZu+W9leaXtumXtOiusOW9lQorCisgIC8qKgorICAgKiBJbnN0YW50aWF0ZSBhIG5ldyB0cmFja2VkIHBlZXIgZm9yIHRoZSBnaXZlbiB0b3JyZW50LgorICAgKiDkuLrnu5nlrprnmoQgdG9ycmVudCDlrp7kvovljJbkuIDkuKrmlrDnmoTot5/ouKrlr7nnrYnngrnjgIIKKyAgICoKKyAgICogQHBhcmFtIHRvcnJlbnQgVGhlIHRvcnJlbnQgdGhpcyBwZWVyIGV4Y2hhbmdlcyBvbi4KKyAgICogQHBhcmFtIGlwICAgICAgVGhlIHBlZXIncyBJUCBhZGRyZXNzLgorICAgKiBAcGFyYW0gcG9ydCAgICBUaGUgcGVlcidzIHBvcnQuCisgICAqIEBwYXJhbSBwZWVySWQgIFRoZSBieXRlLWVuY29kZWQgcGVlciBJRC4KKyAgICovCisgIHB1YmxpYyBUcmFja2VkUGVlcihUcmFja2VkVG9ycmVudCB0b3JyZW50LCBTdHJpbmcgaXAsIGludCBwb3J0LCBCeXRlQnVmZmVyIHBlZXJJZCkgeworICAgIHRoaXModG9ycmVudCwgaXAsIHBvcnQsIHBlZXJJZCwgbmV3IFN5c3RlbVRpbWVTZXJ2aWNlKCkpOworICB9CisKKyAgVHJhY2tlZFBlZXIoVHJhY2tlZFRvcnJlbnQgdG9ycmVudCwgU3RyaW5nIGlwLCBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQsIFRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlKSB7CisgICAgc3VwZXIoaXAsIHBvcnQsIHBlZXJJZCk7CisgICAgbXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICAgIHRoaXMudG9ycmVudCA9IHRvcnJlbnQ7CisKKyAgICAvLyBJbnN0YW50aWF0ZWQgcGVlcnMgc3RhcnQgaW4gdGhlIFVOS05PV04gc3RhdGUuCisgICAgdGhpcy5zdGF0ZSA9IFBlZXJTdGF0ZS5VTktOT1dOOworICAgIHRoaXMubGFzdEFubm91bmNlID0gbXlUaW1lU2VydmljZS5ub3coKTsKKworICAgIHRoaXMudXBsb2FkZWQgPSAwOworICAgIHRoaXMuZG93bmxvYWRlZCA9IDA7CisgICAgdGhpcy5sZWZ0ID0gMDsKKyAgfQorCisgIC8qKgorICAgKiBVcGRhdGUgdGhpcyBwZWVyJ3Mgc3RhdGUgYW5kIGluZm9ybWF0aW9uLgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIDxiPk5vdGU6PC9iPiBpZiB0aGUgcGVlciByZXBvcnRzIDAgYnl0ZXMgbGVmdCB0byBkb3dubG9hZCwgaXRzIHN0YXRlIHdpbGwKKyAgICogYmUgYXV0b21hdGljYWxseSBiZSBzZXQgdG8gQ09NUExFVEVELgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBzdGF0ZSAgICAgIFRoZSBwZWVyJ3Mgc3RhdGUuCisgICAqIEBwYXJhbSB1cGxvYWRlZCAgIFVwbG9hZGVkIGJ5dGUgY291bnQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBwZWVyLgorICAgKiBAcGFyYW0gZG93bmxvYWRlZCBEb3dubG9hZGVkIGJ5dGUgY291bnQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBwZWVyLgorICAgKiBAcGFyYW0gbGVmdCAgICAgICBMZWZ0LXRvLWRvd25sb2FkIGJ5dGUgY291bnQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBwZWVyLgorICAgKi8KKyAgcHVibGljIHZvaWQgdXBkYXRlKFBlZXJTdGF0ZSBzdGF0ZSwgbG9uZyB1cGxvYWRlZCwgbG9uZyBkb3dubG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZWZ0KSB7CisKKyAgICAvLyDoh6rliqjmo4DmtYvkuIvovb3lrozmiJAKKyAgICBpZiAoUGVlclN0YXRlLlNUQVJURUQuZXF1YWxzKHN0YXRlKSAmJiBsZWZ0ID09IDApIHsKKyAgICAgIHN0YXRlID0gUGVlclN0YXRlLkNPTVBMRVRFRDsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLmVxdWFscyh0aGlzLnN0YXRlKSkgeworICAgICAgbG9nZ2VyLnRyYWNlKCJQZWVyIHt9IHt9IGRvd25sb2FkIG9mIHt9LiIsCisgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm5hbWUoKS50b0xvd2VyQ2FzZSgpLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9ycmVudCwKKyAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIHRoaXMubGFzdEFubm91bmNlID0gbXlUaW1lU2VydmljZS5ub3coKTsKKyAgICB0aGlzLnVwbG9hZGVkID0gdXBsb2FkZWQ7CisgICAgdGhpcy5kb3dubG9hZGVkID0gZG93bmxvYWRlZDsKKyAgICB0aGlzLmxlZnQgPSBsZWZ0OworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBwZWVyIGhhcyBjb21wbGV0ZWQgaXRzIGRvd25sb2FkIGFuZCBjYW4gdGh1cyBiZQorICAgKiBjb25zaWRlcmVkIGEgc2VlZGVyLgorICAgKiDlkYrnn6Xov5nkuKpwZWVy5piv5ZCm5a6M5oiQ5LiK5Lyg77yM6IO95ZCm5L2c5Li65LiA5Liqc2VlZGVy56eN5a2Q5oyB5pyJ6ICFCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlZCgpIHsKKyAgICByZXR1cm4gUGVlclN0YXRlLkNPTVBMRVRFRC5lcXVhbHModGhpcy5zdGF0ZSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBob3cgbWFueSBieXRlcyB0aGUgcGVlciByZXBvcnRlZCBpdCBoYXMgdXBsb2FkZWQgc28gZmFyLgorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMudXBsb2FkZWQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBob3cgbWFueSBieXRlcyB0aGUgcGVlciByZXBvcnRlZCBpdCBoYXMgZG93bmxvYWRlZCBzbyBmYXIuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXREb3dubG9hZGVkKCkgeworICAgIHJldHVybiB0aGlzLmRvd25sb2FkZWQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBob3cgbWFueSBieXRlcyB0aGUgcGVlciByZXBvcnRlZCBpdCBuZWVkcyB0byByZXRyaWV2ZSBiZWZvcmUKKyAgICogaXRzIGRvd25sb2FkIGlzIGNvbXBsZXRlLgorICAgKiDnm67liY3ov5jliankvZnlpJrlsJHlhoXlrrnmsqHmnInkuIvovb0KKyAgICovCisgIHB1YmxpYyBsb25nIGdldExlZnQoKSB7CisgICAgcmV0dXJuIHRoaXMubGVmdDsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGVlciBoYXMgY2hlY2tlZCBpbiB3aXRoIHRoZSB0cmFja2VyIHJlY2VudGx5LgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIE5vbi1mcmVzaCBwZWVycyBhcmUgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGFuZCBjb2xsZWN0ZWQgYnkgdGhlCisgICAqIFRyYWNrZXIuCisgICAqIOeUqOaIt+aYr+WQpua0u+i3gworICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0ZyZXNoKGludCBleHBpcmVUaW1lb3V0U2VjKSB7CisgICAgcmV0dXJuIHRoaXMubGFzdEFubm91bmNlICsgZXhwaXJlVGltZW91dFNlYyAqIDEwMDAgPiBteVRpbWVTZXJ2aWNlLm5vdygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBCRVZhbHVlIHJlcHJlc2VudGluZyB0aGlzIHBlZXIgZm9yIGluY2x1c2lvbiBpbiBhbgorICAgKiBhbm5vdW5jZSByZXBseSBmcm9tIHRoZSB0cmFja2VyLgorICAgKiA8cD4KKyAgICogVGhlIHJldHVybmVkIEJFVmFsdWUgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHBlZXIgSUQgKGluIGl0cworICAgKiBvcmlnaW5hbCBieXRlLWVuY29kZWQgZm9ybSksIHRoZSBwZWVyJ3MgSVAgYW5kIHRoZSBwZWVyJ3MgcG9ydC4KKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIHRvQkVWYWx1ZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwZWVyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIGlmICh0aGlzLmhhc1BlZXJJZCgpKSB7CisgICAgICBwZWVyLnB1dCgicGVlciBpZCIsIG5ldyBCRVZhbHVlKHRoaXMuZ2V0UGVlcklkQXJyYXkoKSkpOworICAgIH0KKyAgICBwZWVyLnB1dCgiaXAiLCBuZXcgQkVWYWx1ZSh0aGlzLmdldElwKCksIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgcGVlci5wdXQoInBvcnQiLCBuZXcgQkVWYWx1ZSh0aGlzLmdldFBvcnQoKSkpOworICAgIHJldHVybiBuZXcgQkVWYWx1ZShwZWVyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZWRUb3JyZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFRvcnJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ4OTcyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZWRUb3JyZW50LmphdmEKQEAgLTAsMCArMSwzMDMgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKKworLyoqCisgKiBUcmFja2VkIHRvcnJlbnRzIGFyZSB0b3JyZW50IGZvciB3aGljaCB3ZSBkb24ndCBleHBlY3QgdG8gaGF2ZSBkYXRhIGZpbGVzCisgKiBmb3IuCisgKiA8cD4KKyAqIDxwPgorICoge0BsaW5rIFRyYWNrZWRUb3JyZW50fSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBCaXRUb3JyZW50IHRyYWNrZXIgdG8KKyAqIHJlcHJlc2VudCBhIHRvcnJlbnQgdGhhdCBpcyBhbm5vdW5jZWQgYnkgdGhlIHRyYWNrZXIuIEFzIHN1Y2gsIGl0IGlzIG5vdAorICogZXhwZWN0ZWQgdG8gcG9pbnQgdG8gYW55IHZhbGlkIGxvY2FsIGRhdGEgbGlrZS4gSXQgYWxzbyBjb250YWlucyBzb21lCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIHRyYWNrZXIgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBwZWVycworICogZXhjaGFuZ2Ugb24gaXQsIGV0Yy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworCisvL+ihqOekuuS4gOS4quiiqyBCaXRUb3JyZW50IOi3n+i4quWZqO+8iHRyYWNrZXLvvInot5/ouKrnmoTnp43lrZDvvIh0b3JyZW5077yJ44CCCisvLyDov5nkuKrnsbvlubbkuI3mtonlj4rlrp7pmYXnmoTmlbDmja7mlofku7bvvIzogIzmmK/nlKjkuo7nrqHnkIbkuI7or6Xnp43lrZDnm7jlhbPnmoTov57mjqXvvIhwZWVyc++8ieS7peWPiui3n+i4quenjeWtkOeKtuaAgeeahOS/oeaBr+OAggorLy8g5a6e546w55So5oi36I635Y+W5LiA5Liq56eN5a2Q55qEcGVlcuWAvO+8jOaWueS+v+i/m+ihjOWIhueJh+S4i+i9vQorCitwdWJsaWMgY2xhc3MgVHJhY2tlZFRvcnJlbnQgaW1wbGVtZW50cyBUb3JyZW50SGFzaCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNrZWRUb3JyZW50LmNsYXNzKTsKKworICAvKioKKyAgICogTWluaW11bSBhbm5vdW5jZSBpbnRlcnZhbCByZXF1ZXN0ZWQgZnJvbSBwZWVycywgaW4gc2Vjb25kcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9BTk5PVU5DRV9JTlRFUlZBTF9TRUNPTkRTID0gNTsKKworICAvKioKKyAgICogRGVmYXVsdCBudW1iZXIgb2YgcGVlcnMgaW5jbHVkZWQgaW4gYSB0cmFja2VyIHJlc3BvbnNlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQU5TV0VSX05VTV9QRUVSUyA9IDMwOworCisgIC8qKgorICAgKiBEZWZhdWx0IGFubm91bmNlIGludGVydmFsIHJlcXVlc3RlZCBmcm9tIHBlZXJzLCBpbiBzZWNvbmRzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQU5OT1VOQ0VfSU5URVJWQUxfU0VDT05EUyA9IDEwOworCisgIHByaXZhdGUgaW50IGFuc3dlclBlZXJzOworICBwcml2YXRlIGludCBhbm5vdW5jZUludGVydmFsOworCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGluZm9faGFzaDsKKyAgLy/ooajnpLrnp43lrZDnmoTlk4jluIzlgLzvvIjpgJrov4fnp43lrZDmlofku7bnmoTlhYPmlbDmja7lvpfliLDvvInjgIIKKyAgLy8gaW5mbyDplK7lr7nlupTnmoTlgLznlJ/miJDnmoQgU0hBMSDlk4jluIwsIOivpeWTiOW4jOWAvOWPr+S9nOS4uuaJgOimgeivt+axgueahOi1hOa6kOeahOagh+ivhuespgorCisgIC8qKgorICAgKiBQZWVycyBjdXJyZW50bHkgZXhjaGFuZ2luZyBvbiB0aGlzIHRvcnJlbnQuCisgICAqIOebruWJjeacjeWKoeWZqOS4reWtmOWcqOeahOeUqOaItworICAgKi8KKyAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPiBwZWVyczsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHRyYWNrZWQgdG9ycmVudCBmcm9tIG1ldGEtaW5mbyBiaW5hcnkgZGF0YS4KKyAgICog5Yib5bu656m6VHJhY2tlZFRvcnJlbnQKKyAgICoKKyAgICogQHBhcmFtIGluZm9faGFzaCBUaGUgbWV0YS1pbmZvIGJ5dGUgZGF0YS4KKyAgICogICAgICAgICAgICAgICAgICBlbmNvZGVkIGFuZCBoYXNoZWQgYmFjayB0byBjcmVhdGUgdGhlIHRvcnJlbnQncyBTSEEtMSBoYXNoLgorICAgKiAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4KKyAgICovCisgIHB1YmxpYyBUcmFja2VkVG9ycmVudChieXRlW10gaW5mb19oYXNoKSB7CisgICAgdGhpcy5pbmZvX2hhc2ggPSBpbmZvX2hhc2g7CisKKyAgICB0aGlzLnBlZXJzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPigpOworICAgIHRoaXMuYW5zd2VyUGVlcnMgPSBUcmFja2VkVG9ycmVudC5ERUZBVUxUX0FOU1dFUl9OVU1fUEVFUlM7CisgICAgdGhpcy5hbm5vdW5jZUludGVydmFsID0gVHJhY2tlZFRvcnJlbnQuREVGQVVMVF9BTk5PVU5DRV9JTlRFUlZBTF9TRUNPTkRTOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1hcCBvZiBhbGwgcGVlcnMgY3VycmVudGx5IGV4Y2hhbmdpbmcgb24gdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIE1hcDxQZWVyVUlELCBUcmFja2VkUGVlcj4gZ2V0UGVlcnMoKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcnM7CisgIH0KKworICAvKioKKyAgICogQWRkIGEgcGVlciBleGNoYW5naW5nIG9uIHRoaXMgdG9ycmVudC4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIG5ldyBQZWVyIGludm9sdmVkIHdpdGggdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkUGVlcihUcmFja2VkUGVlciBwZWVyKSB7CisgICAgdGhpcy5wZWVycy5wdXQobmV3IFBlZXJVSUQocGVlci5nZXRBZGRyZXNzKCksIHRoaXMuZ2V0SGV4SW5mb0hhc2goKSksIHBlZXIpOworICB9CisKKyAgcHVibGljIFRyYWNrZWRQZWVyIGdldFBlZXIoUGVlclVJRCBwZWVyVUlEKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcnMuZ2V0KHBlZXJVSUQpOworICB9CisKKyAgcHVibGljIFRyYWNrZWRQZWVyIHJlbW92ZVBlZXIoUGVlclVJRCBwZWVyVUlEKSB7CisgICAgcmV0dXJuIHRoaXMucGVlcnMucmVtb3ZlKHBlZXJVSUQpOworICB9CisKKyAgLyoqCisgICAqIENvdW50IHRoZSBudW1iZXIgb2Ygc2VlZGVycyAocGVlcnMgaW4gdGhlIENPTVBMRVRFRCBzdGF0ZSkgb24gdGhpcworICAgKiB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIGludCBzZWVkZXJzKCkgeworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChUcmFja2VkUGVlciBwZWVyIDogdGhpcy5wZWVycy52YWx1ZXMoKSkgeworICAgICAgaWYgKHBlZXIuaXNDb21wbGV0ZWQoKSkgeworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7CisgIH0KKworICAvKioKKyAgICogQ291bnQgdGhlIG51bWJlciBvZiBsZWVjaGVycyAobm9uLUNPTVBMRVRFRCBwZWVycykgb24gdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIGludCBsZWVjaGVycygpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoVHJhY2tlZFBlZXIgcGVlciA6IHRoaXMucGVlcnMudmFsdWVzKCkpIHsKKyAgICAgIGlmICghcGVlci5pc0NvbXBsZXRlZCgpKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmUgdW5mcmVzaCBwZWVycyBmcm9tIHRoaXMgdG9ycmVudC4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiBDb2xsZWN0IGFuZCByZW1vdmUgYWxsIG5vbi1mcmVzaCBwZWVycyBmcm9tIHRoaXMgdG9ycmVudC4gVGhpcyBpcworICAgKiB1c3VhbGx5IGNhbGxlZCBieSB0aGUgcGVyaW9kaWMgcGVlciBjb2xsZWN0b3Igb2YgdGhlIEJpdFRvcnJlbnQgdHJhY2tlci4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgY29sbGVjdFVuZnJlc2hQZWVycyhpbnQgZXhwaXJlVGltZW91dFNlYykgeworICAgIGZvciAoVHJhY2tlZFBlZXIgcGVlciA6IHRoaXMucGVlcnMudmFsdWVzKCkpIHsKKyAgICAgIGlmICghcGVlci5pc0ZyZXNoKGV4cGlyZVRpbWVvdXRTZWMpKSB7CisgICAgICAgIHRoaXMucGVlcnMucmVtb3ZlKG5ldyBQZWVyVUlEKHBlZXIuZ2V0QWRkcmVzcygpLCB0aGlzLmdldEhleEluZm9IYXNoKCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBhbm5vdW5jZSBpbnRlcnZhbCBmb3IgdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIGludCBnZXRBbm5vdW5jZUludGVydmFsKCkgeworICAgIHJldHVybiB0aGlzLmFubm91bmNlSW50ZXJ2YWw7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBhbm5vdW5jZSBpbnRlcnZhbCBmb3IgdGhpcyB0b3JyZW50LgorICAgKgorICAgKiBAcGFyYW0gaW50ZXJ2YWwgTmV3IGFubm91bmNlIGludGVydmFsLCBpbiBzZWNvbmRzLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QW5ub3VuY2VJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICBpZiAoaW50ZXJ2YWwgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbm5vdW5jZSBpbnRlcnZhbCIpOworICAgIH0KKworICAgIHRoaXMuYW5ub3VuY2VJbnRlcnZhbCA9IGludGVydmFsOworICB9CisKKyAgLyoqCisgICAqIFVwZGF0ZSB0aGlzIHRvcnJlbnQncyBzd2FybSBmcm9tIGFuIGFubm91bmNlIGV2ZW50LgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIG5ldyBwZWVyIG9uIGEgJ3N0YXJ0ZWQnIGFubm91bmNlIGV2ZW50LAorICAgKiBhbmQgcmVtb3ZlIHRoZSBwZWVyIG9uIGEgJ3N0b3BwZWQnIGFubm91bmNlIGV2ZW50LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBldmVudCAgICAgIFRoZSByZXBvcnRlZCBldmVudC4gSWYgPGVtPm51bGw8L2VtPiwgbWVhbnMgYSByZWd1bGFyCisgICAqICAgICAgICAgICAgICAgICAgIGludGVydmFsIGFubm91bmNlIGV2ZW50LCBhcyBkZWZpbmVkIGluIHRoZSBCaXRUb3JyZW50IHNwZWNpZmljYXRpb24uCisgICAqIEBwYXJhbSBwZWVySWQgICAgIFRoZSBieXRlLWVuY29kZWQgcGVlciBJRC4KKyAgICogQHBhcmFtIGhleFBlZXJJZCAgVGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwZWVyJ3MgSUQuCisgICAqIEBwYXJhbSBpcCAgICAgICAgIFRoZSBwZWVyJ3MgSVAgYWRkcmVzcy4KKyAgICogQHBhcmFtIHBvcnQgICAgICAgVGhlIHBlZXIncyBpbmJvdW5kIHBvcnQuCisgICAqIEBwYXJhbSB1cGxvYWRlZCAgIFRoZSBwZWVyJ3MgcmVwb3J0ZWQgdXBsb2FkZWQgYnl0ZSBjb3VudC4KKyAgICogQHBhcmFtIGRvd25sb2FkZWQgVGhlIHBlZXIncyByZXBvcnRlZCBkb3dubG9hZGVkIGJ5dGUgY291bnQuCisgICAqIEBwYXJhbSBsZWZ0ICAgICAgIFRoZSBwZWVyJ3MgcmVwb3J0ZWQgbGVmdCB0byBkb3dubG9hZCBieXRlIGNvdW50LgorICAgKiBAcmV0dXJuIFRoZSBwZWVyIHRoYXQgc2VudCB1cyB0aGUgYW5ub3VuY2UgcmVxdWVzdC4KKyAgICovCisgIHB1YmxpYyBUcmFja2VkUGVlciB1cGRhdGUoUmVxdWVzdEV2ZW50IGV2ZW50LCBCeXRlQnVmZmVyIHBlZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGV4UGVlcklkLCBTdHJpbmcgaXAsIGludCBwb3J0LCBsb25nIHVwbG9hZGVkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZWZ0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgbG9nZ2VyLnRyYWNlKCJldmVudCB7fSwgUGVlcjoge306e30iLCBuZXcgT2JqZWN0W117ZXZlbnQuZ2V0RXZlbnROYW1lKCksIGlwLCBwb3J0fSk7CisgICAgVHJhY2tlZFBlZXIgcGVlciA9IG51bGw7CisgICAgVHJhY2tlZFBlZXIuUGVlclN0YXRlIHN0YXRlID0gVHJhY2tlZFBlZXIuUGVlclN0YXRlLlVOS05PV047CisKKyAgICBQZWVyVUlEIHBlZXJVSUQgPSBuZXcgUGVlclVJRChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaXAsIHBvcnQpLCBnZXRIZXhJbmZvSGFzaCgpKTsKKyAgICBpZiAoUmVxdWVzdEV2ZW50LlNUQVJURUQuZXF1YWxzKGV2ZW50KSkgeworICAgICAgc3RhdGUgPSBUcmFja2VkUGVlci5QZWVyU3RhdGUuU1RBUlRFRDsKKyAgICB9IGVsc2UgaWYgKFJlcXVlc3RFdmVudC5TVE9QUEVELmVxdWFscyhldmVudCkpIHsKKyAgICAgIHBlZXIgPSB0aGlzLnJlbW92ZVBlZXIocGVlclVJRCk7CisgICAgICBzdGF0ZSA9IFRyYWNrZWRQZWVyLlBlZXJTdGF0ZS5TVE9QUEVEOworICAgIH0gZWxzZSBpZiAoUmVxdWVzdEV2ZW50LkNPTVBMRVRFRC5lcXVhbHMoZXZlbnQpKSB7CisgICAgICBwZWVyID0gdGhpcy5nZXRQZWVyKHBlZXJVSUQpOworICAgICAgc3RhdGUgPSBUcmFja2VkUGVlci5QZWVyU3RhdGUuQ09NUExFVEVEOworICAgIH0gZWxzZSBpZiAoUmVxdWVzdEV2ZW50Lk5PTkUuZXF1YWxzKGV2ZW50KSkgeworICAgICAgcGVlciA9IHRoaXMuZ2V0UGVlcihwZWVyVUlEKTsKKyAgICAgIHN0YXRlID0gVHJhY2tlZFBlZXIuUGVlclN0YXRlLlNUQVJURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYW5ub3VuY2UgZXZlbnQgdHlwZSEiKTsKKyAgICB9CisKKyAgICBpZiAocGVlciA9PSBudWxsKSB7CisgICAgICBwZWVyID0gbmV3IFRyYWNrZWRQZWVyKHRoaXMsIGlwLCBwb3J0LCBwZWVySWQpOworICAgICAgdGhpcy5hZGRQZWVyKHBlZXIpOworICAgIH0KKyAgICBwZWVyLnVwZGF0ZShzdGF0ZSwgdXBsb2FkZWQsIGRvd25sb2FkZWQsIGxlZnQpOworICAgIHJldHVybiBwZWVyOworICB9CisKKyAgLyoqCisgICAqIEdldCBhIGxpc3Qgb2YgcGVlcnMgd2UgY2FuIHJldHVybiBpbiBhbiBhbm5vdW5jZSByZXNwb25zZSBmb3IgdGhpcworICAgKiB0b3JyZW50LgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciBtYWtpbmcgdGhlIHJlcXVlc3QsIHNvIHdlIGNhbiBleGNsdWRlIGl0IGZyb20gdGhlCisgICAqICAgICAgICAgICAgIGxpc3Qgb2YgcmV0dXJuZWQgcGVlcnMuCisgICAqIEByZXR1cm4gQSBsaXN0IG9mIHBlZXJzIHdlIGNhbiBpbmNsdWRlIGluIGFuIGFubm91bmNlIHJlc3BvbnNlLgorICAgKi8KKyAgcHVibGljIExpc3Q8UGVlcj4gZ2V0U29tZVBlZXJzKFBlZXIgcGVlcikgeworICAgIExpc3Q8UGVlcj4gcGVlcnMgPSBuZXcgTGlua2VkTGlzdDxQZWVyPigpOworCisgICAgLy8gRXh0cmFjdCBhbnN3ZXJQZWVycyByYW5kb20gcGVlcnMKKyAgICBMaXN0PFRyYWNrZWRQZWVyPiBjYW5kaWRhdGVzID0gbmV3IExpbmtlZExpc3Q8VHJhY2tlZFBlZXI+KHRoaXMucGVlcnMudmFsdWVzKCkpOworICAgIENvbGxlY3Rpb25zLnNodWZmbGUoY2FuZGlkYXRlcyk7CisKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoVHJhY2tlZFBlZXIgY2FuZGlkYXRlIDogY2FuZGlkYXRlcykgeworICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgcmVxdWVzdGluZyBwZWVyIGluIHRoZSBhbnN3ZXIuCisgICAgICBpZiAocGVlciAhPSBudWxsICYmIHBlZXIubG9va3NMaWtlKGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE9ubHkgc2VydmUgYXQgbW9zdCBBTlNXRVJfTlVNX1BFRVJTIHBlZXJzCisgICAgICBpZiAoY291bnQrKyA+IHRoaXMuYW5zd2VyUGVlcnMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBlZXJzLmFkZChjYW5kaWRhdGUpOworICAgIH0KKworICAgIHJldHVybiBwZWVyczsKKyAgfQorCisgIC8qKgorICAgKiBMb2FkIGEgdHJhY2tlZCB0b3JyZW50IGZyb20gdGhlIGdpdmVuIHRvcnJlbnQgZmlsZS4KKyAgICoKKyAgICogQHBhcmFtIHRvcnJlbnQgVGhlIGFic3RyYWN0IHtAbGluayBGaWxlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICA8dHQ+LnRvcnJlbnQ8L3R0PiBmaWxlIHRvIGxvYWQuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIFdoZW4gdGhlIHRvcnJlbnQgZmlsZSBjYW5ub3QgYmUgcmVhZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVHJhY2tlZFRvcnJlbnQgbG9hZChGaWxlIHRvcnJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKHRvcnJlbnQpOworICAgIHJldHVybiBuZXcgVHJhY2tlZFRvcnJlbnQodG9ycmVudE1ldGFkYXRhLmdldEluZm9IYXNoKCkpOworICB9CisKKworICAvLyDov5Tlm57np43lrZDlk4jluIzlgLwKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIHRoaXMuaW5mb19oYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyh0aGlzLmluZm9faGFzaCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIlRyYWNrZWRUb3JyZW50eyIgKworICAgICAgICAgICAgImluZm9faGFzaD0iICsgZ2V0SGV4SW5mb0hhc2goKSArCisgICAgICAgICAgICAnfSc7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTc4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqIDxwPgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cD4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIHRyYWNrZXLlrqLmiLfnq68KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuY29yZS5Db250YWluZXJTZXJ2ZXI7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay50cmFuc3BvcnQuY29ubmVjdC5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsudHJhbnNwb3J0LmNvbm5lY3QuU29ja2V0Q29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJpdFRvcnJlbnQgdHJhY2tlci4KKyAqIDxwPgorICogPHA+CisgKiBUaGUgdHJhY2tlciB1c3VhbGx5IGxpc3RlbnMgb24gcG9ydCA2OTY5ICh0aGUgc3RhbmRhcmQgQml0VG9ycmVudCB0cmFja2VyCisgKiBwb3J0KS4gVG9ycmVudHMgbXVzdCBiZSByZWdpc3RlcmVkIGRpcmVjdGx5IHRvIHRoaXMgdHJhY2tlciB3aXRoIHRoZQorICoge0BsaW5rICNhbm5vdW5jZShUcmFja2VkVG9ycmVudCB0b3JyZW50KX08L2NvZGU+IG1ldGhvZC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworCisvLyDnv7vor5HvvJp0cmFja2VyIOebkeWQrDY5Njnnq6/lj6PvvIznp43lrZDooqtUcmFja2VkVG9ycmVudOexu+ihqOekugorcHVibGljIGNsYXNzIFRyYWNrZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlci5jbGFzcyk7Ly8g5pel5b+X6K6w5b2VCisKKyAgLyoqCisgICAqIFJlcXVlc3QgcGF0aCBoYW5kbGVkIGJ5IHRoZSB0cmFja2VyIGFubm91bmNlIHJlcXVlc3QgaGFuZGxlci4KKyAgICog55Sx6Lef6Liq5Zmo5YWs5ZGK6K+35rGC5aSE55CG56iL5bqP5aSE55CG55qE6K+35rGC6Lev5b6EICDkv53lrZjot6/lvoTnq6/lj6NpcAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1VOQ0VfVVJMID0gIi9hbm5vdW5jZSI7CisKKyAgLyoqCisgICAqIERlZmF1bHQgdHJhY2tlciBsaXN0ZW5pbmcgcG9ydCAoQml0VG9ycmVudCdzIGRlZmF1bHQgaXMgNjk2OSkuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RSQUNLRVJfUE9SVCA9IDY5Njk7CisKKyAgLyoqCisgICAqIERlZmF1bHQgc2VydmVyIG5hbWUgYW5kIHZlcnNpb24gYW5ub3VuY2VkIGJ5IHRoZSB0cmFja2VyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WRVJTSU9OX1NUUklORyA9ICJCaXRUb3JyZW50IFRyYWNrZXIgKHR0b3JyZW50KSI7CisKKyAgcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247CisKKyAgLyoqCisgICAqIFRoZSBpbi1tZW1vcnkgcmVwb3NpdG9yeSBvZiB0b3JyZW50cyB0cmFja2VkLgorICAgKi8KKyAgLy8g56eN5a2Q5LuT5bqT566h55CGCisgIHByaXZhdGUgZmluYWwgVG9ycmVudHNSZXBvc2l0b3J5IG15VG9ycmVudHNSZXBvc2l0b3J5OworCisgIHByaXZhdGUgUGVlckNvbGxlY3RvclRocmVhZCBteVBlZXJDb2xsZWN0b3JUaHJlYWQ7CisgIHByaXZhdGUgYm9vbGVhbiBzdG9wOworICBwcml2YXRlIFN0cmluZyBteUFubm91bmNlVXJsOworICBwcml2YXRlIGZpbmFsIGludCBteVBvcnQ7CisgIHByaXZhdGUgU29ja2V0QWRkcmVzcyBteUJvdW5kQWRkcmVzcyA9IG51bGw7CisKKyAgcHJpdmF0ZSBmaW5hbCBUcmFja2VyU2VydmljZUNvbnRhaW5lciBteVRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgQml0VG9ycmVudCB0cmFja2VyIGxpc3RlbmluZyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAgICoKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd3MgYW4gPGVtPklPRXhjZXB0aW9uPC9lbT4gaWYgdGhlIHRyYWNrZXIKKyAgICogICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCisgICAqLworICAvL+aWsOW7unRyYWNrZXLnmoTlo7DmmI4gcG9ydOaYr+i/kOihjOerr+WPoworICBwdWJsaWMgVHJhY2tlcihpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzKHBvcnQsCisgICAgICAgICAgICBnZXREZWZhdWx0QW5ub3VuY2VVcmwobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBwb3J0KSkudG9TdHJpbmcoKQorICAgICk7CisgICAgLy/osIPnlKjkuIvkuIDkuKrlo7DmmI4g5b6I5aSa5pWw5o2u5piv6Ieq5Yqo55Sf5oiQ55qE77yM5Yib5bu6dHJhY2tlcueahOaXtuWAmeWPquimgeWjsOaYjum7mOiupOerr+WPoworICB9CisKKyAgcHVibGljIFRyYWNrZXIoaW50IHBvcnQsIFN0cmluZyBhbm5vdW5jZVVSTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBteVBvcnQgPSBwb3J0OworICAgIG15QW5ub3VuY2VVcmwgPSBhbm5vdW5jZVVSTDsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeSA9IG5ldyBUb3JyZW50c1JlcG9zaXRvcnkoMTApOworICAgIGZpbmFsIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIHJlcXVlc3RQcm9jZXNzb3IgPSBuZXcgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IobXlUb3JyZW50c1JlcG9zaXRvcnkpOworICAgIG15VHJhY2tlclNlcnZpY2VDb250YWluZXIgPSBuZXcgVHJhY2tlclNlcnZpY2VDb250YWluZXIocmVxdWVzdFByb2Nlc3NvciwKKyAgICAgICAgICAgIG5ldyBNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvcihyZXF1ZXN0UHJvY2Vzc29yKSk7CisgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkID0gbmV3IFBlZXJDb2xsZWN0b3JUaHJlYWQobXlUb3JyZW50c1JlcG9zaXRvcnkpOworICB9CisKKyAgcHVibGljIFRyYWNrZXIoaW50IHBvcnQsIFN0cmluZyBhbm5vdW5jZVVSTCwgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgcmVxdWVzdFByb2Nlc3NvciwgVG9ycmVudHNSZXBvc2l0b3J5IHRvcnJlbnRzUmVwb3NpdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBteVBvcnQgPSBwb3J0OworICAgIG15QW5ub3VuY2VVcmwgPSBhbm5vdW5jZVVSTDsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeSA9IHRvcnJlbnRzUmVwb3NpdG9yeTsKKyAgICBteVRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyID0gbmV3IFRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyKHJlcXVlc3RQcm9jZXNzb3IsIG5ldyBNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvcihyZXF1ZXN0UHJvY2Vzc29yKSk7CisgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkID0gbmV3IFBlZXJDb2xsZWN0b3JUaHJlYWQobXlUb3JyZW50c1JlcG9zaXRvcnkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGZ1bGwgYW5ub3VuY2UgVVJMIHNlcnZlZCBieSB0aGlzIHRyYWNrZXIuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogVGhpcyBoYXMgdGhlIGZvcm0gaHR0cDovL2hvc3Q6cG9ydC9hbm5vdW5jZS4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgVVJMIGdldERlZmF1bHRBbm5vdW5jZVVybChJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgVVJMKCJodHRwIiwKKyAgICAgICAgICAgICAgYWRkcmVzcy5nZXRBZGRyZXNzKCkuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKSwKKyAgICAgICAgICAgICAgYWRkcmVzcy5nZXRQb3J0KCksCisgICAgICAgICAgICAgIEFOTk9VTkNFX1VSTCk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJDb3VsZCBub3QgYnVpbGQgdHJhY2tlciBVUkw6IHt9ISIsIG11ZSwgbXVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3VuY2VVcmwoKSB7CisgICAgcmV0dXJuIG15QW5ub3VuY2VVcmw7CisgIH0KKworICBwdWJsaWMgVVJJIGdldEFubm91bmNlVVJJKCkgeworICAgIHRyeSB7CisgICAgICBVUkwgYW5ub3VuY2VVUkwgPSBuZXcgVVJMKGdldEFubm91bmNlVXJsKCkpOworICAgICAgaWYgKGFubm91bmNlVVJMICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGFubm91bmNlVVJMLnRvVVJJKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGNvbnZlcnQgYW5ub3VuY2UgVVJMIHRvIFVSSSIsIGUpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBjcmVhdGUgVVJMIGZyb20gYW5ub3VuY2VVUkwiLCBlKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogU3RhcnQgdGhlIHRyYWNrZXIgdGhyZWFkLgorICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgYm9vbGVhbiBzdGFydFBlZXJDbGVhbmluZ1RocmVhZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgQml0VG9ycmVudCB0cmFja2VyIG9uIHt9Li4uIiwKKyAgICAgICAgICAgIGdldEFubm91bmNlVXJsKCkpOworICAgIGNvbm5lY3Rpb24gPSBuZXcgU29ja2V0Q29ubmVjdGlvbihuZXcgQ29udGFpbmVyU2VydmVyKG15VHJhY2tlclNlcnZpY2VDb250YWluZXIpKTsKKworICAgIExpc3Q8U29ja2V0QWRkcmVzcz4gdHJpZXMgPSBuZXcgQXJyYXlMaXN0PFNvY2tldEFkZHJlc3M+KCkge3sKKyAgICAgIHRyeSB7CisgICAgICAgIGFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKG5ldyBieXRlWzRdKSwgbXlQb3J0KSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIG15UG9ydCkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBhZGQobmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShuZXcgVVJMKGdldEFubm91bmNlVXJsKCkpLmdldEhvc3QoKSksIG15UG9ydCkpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICB9CisgICAgfX07CisKKyAgICBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKFNvY2tldEFkZHJlc3MgYWRkcmVzcyA6IHRyaWVzKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoKG15Qm91bmRBZGRyZXNzID0gY29ubmVjdGlvbi5jb25uZWN0KGFkZHJlc3MpKSAhPSBudWxsKSB7CisgICAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0ZWQgdG9ycmVudCB0cmFja2VyIG9uIHt9IiwgYWRkcmVzcyk7CisgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBsb2dnZXIuaW5mbygiQ2FuJ3Qgc3RhcnQgdGhlIHRyYWNrZXIgdXNpbmcgYWRkcmVzc3t9IDogIiwgYWRkcmVzcy50b1N0cmluZygpLCBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdGFydGVkKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBzdGFydCB0cmFja2VyIG9uIHBvcnQge30uIFN0b3BwaW5nIG5vdy4uLiIsIG15UG9ydCk7CisgICAgICBzdG9wKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzdGFydFBlZXJDbGVhbmluZ1RocmVhZCkgeworICAgICAgaWYgKG15UGVlckNvbGxlY3RvclRocmVhZCA9PSBudWxsIHx8ICFteVBlZXJDb2xsZWN0b3JUaHJlYWQuaXNBbGl2ZSgpIHx8IG15UGVlckNvbGxlY3RvclRocmVhZC5nZXRTdGF0ZSgpICE9IFRocmVhZC5TdGF0ZS5ORVcpIHsKKyAgICAgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkID0gbmV3IFBlZXJDb2xsZWN0b3JUaHJlYWQobXlUb3JyZW50c1JlcG9zaXRvcnkpOworICAgICAgfQorCisgICAgICBteVBlZXJDb2xsZWN0b3JUaHJlYWQuc2V0TmFtZSgicGVlci1wZWVyQ29sbGVjdG9yVGhyZWFkOiIgKyBteVBvcnQpOworICAgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0b3AgdGhlIHRyYWNrZXIuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogVGhpcyBlZmZlY3RpdmVseSBjbG9zZXMgdGhlIGxpc3RlbmluZyBIVFRQIGNvbm5lY3Rpb24gdG8gdGVybWluYXRlCisgICAqIHRoZSBzZXJ2aWNlLCBhbmQgaW50ZXJydXB0cyB0aGUgcGVlciBteVBlZXJDb2xsZWN0b3JUaHJlYWQgdGhyZWFkIGFzIHdlbGwuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgdGhpcy5zdG9wID0gdHJ1ZTsKKworICAgIHRyeSB7CisgICAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgIGxvZ2dlci5pbmZvKCJCaXRUb3JyZW50IHRyYWNrZXIgY2xvc2VkLiIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJDb3VsZCBub3Qgc3RvcCB0aGUgdHJhY2tlcjoge30hIiwgaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgaWYgKG15UGVlckNvbGxlY3RvclRocmVhZCAhPSBudWxsICYmIG15UGVlckNvbGxlY3RvclRocmVhZC5pc0FsaXZlKCkpIHsKKyAgICAgIG15UGVlckNvbGxlY3RvclRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIG15UGVlckNvbGxlY3RvclRocmVhZC5qb2luKCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vCisgICAgICB9CisgICAgICBsb2dnZXIuaW5mbygiUGVlciBjb2xsZWN0aW9uIHRlcm1pbmF0ZWQuIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFubm91bmNlIGEgbmV3IHRvcnJlbnQgb24gdGhpcyB0cmFja2VyLgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIFRoZSBmYWN0IHRoYXQgdG9ycmVudHMgbXVzdCBiZSBhbm5vdW5jZWQgaGVyZSBmaXJzdCBtYWtlcyB0aGlzIHRyYWNrZXIgYQorICAgKiBjbG9zZWQgQml0VG9ycmVudCB0cmFja2VyOiBpdCB3aWxsIG9ubHkgYWNjZXB0IGNsaWVudHMgZm9yIHRvcnJlbnRzIGl0CisgICAqIGtub3dzIGFib3V0LCBhbmQgdGhpcyBsaXN0IG9mIHRvcnJlbnRzIGlzIG1hbmFnZWQgYnkgdGhlIHByb2dyYW0KKyAgICogaW5zdHJ1bWVudGluZyB0aGlzIFRyYWNrZXIgY2xhc3MuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHRvcnJlbnQgVGhlIFRvcnJlbnQgb2JqZWN0IHRvIHN0YXJ0IHRyYWNraW5nLgorICAgKiBAcmV0dXJuIFRoZSB0b3JyZW50IG9iamVjdCBmb3IgdGhpcyB0b3JyZW50IG9uIHRoaXMgdHJhY2tlci4gVGhpcyBtYXkgYmUKKyAgICogZGlmZmVyZW50IGZyb20gdGhlIHN1cHBsaWVkIFRvcnJlbnQgb2JqZWN0IGlmIHRoZSB0cmFja2VyIGFscmVhZHkKKyAgICogY29udGFpbmVkIGEgdG9ycmVudCB3aXRoIHRoZSBzYW1lIGhhc2guCisgICAqLworCisgIC8vc3luY2hyb25pemVkIOehruS/neWkmue6v+eoi+iuv+mXruWFseS6q+i1hOa6kOS4jeS8muWHuumUmQorICBwdWJsaWMgc3luY2hyb25pemVkIFRyYWNrZWRUb3JyZW50IGFubm91bmNlKFRyYWNrZWRUb3JyZW50IHRvcnJlbnQpIHsKKyAgICBUcmFja2VkVG9ycmVudCBleGlzdGluZyA9IG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKTsKKworICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CisgICAgICBsb2dnZXIud2FybigiVHJhY2tlciBhbHJlYWR5IGFubm91bmNlZCB0b3JyZW50IHdpdGggaGFzaCB7fS4iLCBleGlzdGluZy5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIHJldHVybiBleGlzdGluZzsKKyAgICB9CisKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCksIHRvcnJlbnQpOworICAgIGxvZ2dlci5pbmZvKCJSZWdpc3RlcmVkIG5ldyB0b3JyZW50IHdpdGggaGFzaCB7fS4iLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgIHJldHVybiB0b3JyZW50OworICB9CisKKyAgLyoqCisgICAqIFNldCB0byB0cnVlIHRvIGFsbG93IHRoaXMgdHJhY2tlciB0byB0cmFjayBleHRlcm5hbCB0b3JyZW50cyAoaS5lLiB0aG9zZSB0aGF0IHdlcmUgbm90IGV4cGxpY2l0bHkgYW5ub3VuY2VkIGhlcmUpLgorICAgKgorICAgKiBAcGFyYW0gYWNjZXB0Rm9yZWlnblRvcnJlbnRzIHRydWUgdG8gYWNjZXB0IGZvcmVpZ24gdG9ycmVudHMgKGZhbHNlIG90aGVyd2lzZSkKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyhib29sZWFuIGFjY2VwdEZvcmVpZ25Ub3JyZW50cykgeworICAgIG15VHJhY2tlclNlcnZpY2VDb250YWluZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKGFjY2VwdEZvcmVpZ25Ub3JyZW50cyk7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbGwgdHJhY2tlZCB0b3JyZW50cy4KKyAgICovCisgIHB1YmxpYyBDb2xsZWN0aW9uPFRyYWNrZWRUb3JyZW50PiBnZXRUcmFja2VkVG9ycmVudHMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS52YWx1ZXMoKSk7CisgIH0KKworICBwdWJsaWMgVHJhY2tlZFRvcnJlbnQgZ2V0VHJhY2tlZFRvcnJlbnQoU3RyaW5nIGhhc2gpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudChoYXNoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFubm91bmNlSW50ZXJ2YWwoaW50IGFubm91bmNlSW50ZXJ2YWwpIHsKKyAgICBteVRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyLnNldEFubm91bmNlSW50ZXJ2YWwoYW5ub3VuY2VJbnRlcnZhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQZWVyQ29sbGVjdG9yRXhwaXJlVGltZW91dChpbnQgZXhwaXJlVGltZW91dCkgeworICAgIG15UGVlckNvbGxlY3RvclRocmVhZC5zZXRUb3JyZW50RXhwaXJlVGltZW91dFNlYyhleHBpcmVUaW1lb3V0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI1MWZiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwzMzAgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZS5FcnJvck1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLk1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cC5IVFRQVHJhY2tlckVycm9yTWVzc2FnZTsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuU3RhdHVzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBUcmFja2VyIHNlcnZpY2UgdG8gc2VydmUgdGhlIHRyYWNrZXIncyBhbm5vdW5jZSByZXF1ZXN0cy4KKyAqIGFubm91bmNlIOWuouaIt+err+WSjHRyYWNrZXLmnI3liqHlmajov5vooYzpgJrkv6EKKyAqIDxwPgorICogPHA+CisgKiBJdCBvbmx5IHNlcnZlcyBhbm5vdW5jZSByZXF1ZXN0cyBvbiAvYW5ub3VuY2UsIGFuZCBvbmx5IHNlcnZlcyB0b3JyZW50cyB0aGUKKyAqIHtAbGluayBUcmFja2VyfSBpdCBzZXJ2ZXMga25vd3MgYWJvdXQuCisgKiA8L3A+CisgKiA8cD4KKyAqIDxwPgorICogVGhlIGxpc3Qgb2YgdG9ycmVudHMge0BzZWUgI3JlcXVlc3RIYW5kbGVyLmdldFRvcnJlbnRzTWFwKCl9IGlzIGEgbWFwIG9mIHRvcnJlbnQgaGFzaGVzIHRvIHRoZWlyCisgKiBjb3JyZXNwb25kaW5nIFRvcnJlbnQgb2JqZWN0cywgYW5kIGlzIG1haW50YWluZWQgYnkgdGhlIHtAbGluayBUcmFja2VyfSB0aGlzCisgKiBzZXJ2aWNlIGlzIHBhcnQgb2YuIFRoZSBUcmFja2VyUmVxdWVzdFByb2Nlc3NvciBvbmx5IGhhcyBhIHJlZmVyZW5jZSB0byB0aGlzIG1hcCwgYW5kCisgKiBkb2VzIG5vdCBtb2RpZnkgaXQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93aWtpLnRoZW9yeS5vcmcvQml0VG9ycmVudFNwZWNpZmljYXRpb24iPkJpdFRvcnJlbnQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuY2xhc3MpOworCisgIC8qKgorICAgKiBUaGUgbGlzdCBvZiBhbm5vdW5jZSByZXF1ZXN0IFVSTCBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGludGVycHJldGVkIGFzCisgICAqIG51bWVyaWMgYW5kIHRodXMgY29udmVydGVkIGFzIHN1Y2ggaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSBwYXJzaW5nLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTlVNRVJJQ19SRVFVRVNUX0ZJRUxEUyA9CisgICAgICAgICAgbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICAgInBvcnQiLCAidXBsb2FkZWQiLCAiZG93bmxvYWRlZCIsICJsZWZ0IiwKKyAgICAgICAgICAgICAgICAgICJjb21wYWN0IiwgIm5vX3BlZXJfaWQiLCAibnVtd2FudCIKKyAgICAgICAgICB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFREVSX0FOTk9VTkNFX0lOVEVSVkFMID0gMTUwOworICAvLyAgc2VlZGVy6YCa55+l6Ze06ZqUCisKKyAgcHJpdmF0ZSBib29sZWFuIG15QWNjZXB0Rm9yZWlnblRvcnJlbnRzID0gdHJ1ZTsgLy9kZWZhdWx0IHRvIHRydWUKKyAgcHJpdmF0ZSBpbnQgbXlBbm5vdW5jZUludGVydmFsID0gNjA7IC8vZGVmYXVsdCB2YWx1ZQorICBwcml2YXRlIGZpbmFsIEFkZHJlc3NDaGVja2VyIG15QWRkcmVzc0NoZWNrZXI7IC8vaXDlnLDlnYDmo4Dmn6XlmagKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50c1JlcG9zaXRvcnkgbXlUb3JyZW50c1JlcG9zaXRvcnk7CisKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIHNlcnZpbmcgdGhlIGdpdmVuIHRvcnJlbnRzLgorICAgKiDmmK/kuIDkuKrlr7nnp43lrZDku5PlupPov5vooYznrqHnkIbnmoTnsbsKKyAgICovCisgIHB1YmxpYyBUcmFja2VyUmVxdWVzdFByb2Nlc3NvcihUb3JyZW50c1JlcG9zaXRvcnkgdG9ycmVudHNSZXBvc2l0b3J5KSB7CisgICAgdGhpcyh0b3JyZW50c1JlcG9zaXRvcnksIG5ldyBBZGRyZXNzQ2hlY2tlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gaXNCYWRBZGRyZXNzKFN0cmluZyBpcCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IoVG9ycmVudHNSZXBvc2l0b3J5IHRvcnJlbnRzUmVwb3NpdG9yeSwgQWRkcmVzc0NoZWNrZXIgYWRkcmVzc0NoZWNrZXIpIHsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeSA9IHRvcnJlbnRzUmVwb3NpdG9yeTsKKyAgICBteUFkZHJlc3NDaGVja2VyID0gYWRkcmVzc0NoZWNrZXI7CisgIH0KKworICAvKioKKyAgICogUHJvY2VzcyB0aGUgYW5ub3VuY2UgcmVxdWVzdC4KKyAgICog5aSE55CG6K+35rGCCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogVGhpcyBtZXRob2QgYXR0ZW1wcyB0byByZWFkIGFuZCBwYXJzZSB0aGUgaW5jb21pbmcgYW5ub3VuY2UgcmVxdWVzdCBpbnRvCisgICAqIGFuIGFubm91bmNlIHJlcXVlc3QgbWVzc2FnZSwgdGhlbiBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBhbm5vdW5jZQorICAgKiByZXNwb25zZSBtZXNzYWdlIGFuZCBzZW5kcyBpdCBiYWNrIHRvIHRoZSBjbGllbnQuCisgICAqIDwvcD4KKyAgICovCisgIC8v5Lyg5YWl5pWw5o2udXJpPXJlcXVlc3QuZ2V0QWRkcmVzcygpLnRvU3RyaW5nKCksIOaYr+WPkeWHuuivt+axgueahOWuouaIt+err+WcsOWdgOWMheWQq+mhuuS+v+S8oOWFpeeahOWPguaVsO+8jOesrOS6jOS4quWPguaVsOaYr+S4u+acuuWcsOWdgAorICAvL+ivpeWHveaVsOeahOebrueahOaYr+WkhOeQhuenjeWtkOaWh+S7tueahOivt+axgu+8iOS+i+Wmgu+8jOeUqOaIt+S4iuS8oOaIluS4i+i9veenjeWtkOaWh+S7tuaXtuWPkemAgeeahOWFrOWRiuivt+axgu+8iQorICBwdWJsaWMgdm9pZCBwcm9jZXNzKGZpbmFsIFN0cmluZyB1cmksIGZpbmFsIFN0cmluZyBob3N0QWRkcmVzcywgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBoZWFkZXJzLgorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgaW50byBhbiBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBXZSBuZWVkIHRvIHJlbHkgb24gb3VyIG93biBxdWVyeSBwYXJzaW5nIGZ1bmN0aW9uIGJlY2F1c2UKKyAgICAgKiBTaW1wbGVIVFRQJ3MgUXVlcnkgbWFwIHdpbGwgY29udGFpbiBVVEYtOCBkZWNvZGVkIHBhcmFtZXRlcnMsIHdoaWNoCisgICAgICogZG9lc24ndCB3b3JrIHdlbGwgZm9yIHRoZSBieXRlLWVuY29kZWQgc3RyaW5ncyB3ZSBleHBlY3QuCisgICAgICovCisgICAgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgYW5ub3VuY2VSZXF1ZXN0OyAvL+WMheWQq+WQhOenjeW3peWFt+aTjeS9nAorICAgIHRyeSB7CisgICAgICBhbm5vdW5jZVJlcXVlc3QgPSB0aGlzLnBhcnNlUXVlcnkodXJpLCBob3N0QWRkcmVzcyk7CisgICAgfSBjYXRjaCAoTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24gbXZlKSB7CisgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgIlVuYWJsZSB0byBwYXJzZSByZXF1ZXN0IG1lc3NhZ2UuIFJlcXVlc3QgdXJsIGlzIHt9IiwgdXJpLCBtdmUpOworICAgICAgc2VydmVFcnJvcihTdGF0dXMuQkFEX1JFUVVFU1QsIG12ZS5nZXRNZXNzYWdlKCksIHJlcXVlc3RIYW5kbGVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCA9IGFubm91bmNlUmVxdWVzdC5nZXRFdmVudCgpOy8v6I635Y+W5b2T5YmN54q25oCB77yM5q+U5aaC5a6M5oiQ5oiW6ICF5byA5aeL77yM5YGc5q2iCisKKyAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgZXZlbnQgPSBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5OT05FOworICAgIH0KKyAgICBUcmFja2VkVG9ycmVudCB0b3JyZW50ID0gbXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudChhbm5vdW5jZVJlcXVlc3QuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICAvLyBUaGUgcmVxdWVzdGVkIHRvcnJlbnQgbXVzdCBiZSBhbm5vdW5jZWQgYnkgdGhlIHRyYWNrZXIgaWYgYW5kIG9ubHkgaWYgbXlBY2NlcHRGb3JlaWduVG9ycmVudHMgaXMgZmFsc2UKKyAgICBpZiAoIW15QWNjZXB0Rm9yZWlnblRvcnJlbnRzICYmIHRvcnJlbnQgPT0gbnVsbCkgeworICAgICAgbG9nZ2VyLndhcm4oIlJlcXVlc3RlZCB0b3JyZW50IGhhc2ggd2FzOiB7fSIsIGFubm91bmNlUmVxdWVzdC5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIHNlcnZlRXJyb3IoU3RhdHVzLkJBRF9SRVFVRVNULCBFcnJvck1lc3NhZ2UuRmFpbHVyZVJlYXNvbi5VTktOT1dOX1RPUlJFTlQsIHJlcXVlc3RIYW5kbGVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmaW5hbCBib29sZWFuIGlzU2VlZGVyID0gKGV2ZW50ID09IEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50LkNPTVBMRVRFRCkKKyAgICAgICAgICAgIHx8IChhbm5vdW5jZVJlcXVlc3QuZ2V0TGVmdCgpID09IDApOy8v5Yik5pat5piv5YGa5Lit6L+Y5piv5LiL6L29CisKKyAgICBpZiAobXlBZGRyZXNzQ2hlY2tlci5pc0JhZEFkZHJlc3MoYW5ub3VuY2VSZXF1ZXN0LmdldElwKCkpKSB7Ly/pu5HlkI3ljZXnlKjmiLcKKyAgICAgIGlmICh0b3JyZW50ID09IG51bGwpIHsKKyAgICAgICAgd3JpdGVFbXB0eVJlc3BvbnNlKGFubm91bmNlUmVxdWVzdCwgcmVxdWVzdEhhbmRsZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVBbm5vdW5jZVJlc3BvbnNlKHRvcnJlbnQsIG51bGwsIGlzU2VlZGVyLCByZXF1ZXN0SGFuZGxlcik7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmluYWwgUGVlciBwZWVyID0gbmV3IFBlZXIoYW5ub3VuY2VSZXF1ZXN0LmdldElwKCksIGFubm91bmNlUmVxdWVzdC5nZXRQb3J0KCkpOworCisgICAgdHJ5IHsKKyAgICAgIHRvcnJlbnQgPSBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudEFuZFVwZGF0ZShhbm5vdW5jZVJlcXVlc3QuZ2V0SGV4SW5mb0hhc2goKSwKKyAgICAgICAgICAgICAgbmV3IFRyYWNrZWRUb3JyZW50KGFubm91bmNlUmVxdWVzdC5nZXRJbmZvSGFzaCgpKSwKKyAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgIEJ5dGVCdWZmZXIud3JhcChhbm5vdW5jZVJlcXVlc3QuZ2V0UGVlcklkKCkpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0SGV4UGVlcklkKCksCisgICAgICAgICAgICAgIGFubm91bmNlUmVxdWVzdC5nZXRJcCgpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0VXBsb2FkZWQoKSwKKyAgICAgICAgICAgICAgYW5ub3VuY2VSZXF1ZXN0LmdldERvd25sb2FkZWQoKSwKKyAgICAgICAgICAgICAgYW5ub3VuY2VSZXF1ZXN0LmdldExlZnQoKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJVbmFibGUgdG8gdXBkYXRlIHBlZXIgdG9ycmVudC4gUmVxdWVzdCB1cmwgaXMge30iLCB1cmksIGlhZSk7CisgICAgICBzZXJ2ZUVycm9yKFN0YXR1cy5CQURfUkVRVUVTVCwgRXJyb3JNZXNzYWdlLkZhaWx1cmVSZWFzb24uSU5WQUxJRF9FVkVOVCwgcmVxdWVzdEhhbmRsZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENyYWZ0IGFuZCBvdXRwdXQgdGhlIGFuc3dlcgorICAgIHdyaXRlQW5ub3VuY2VSZXNwb25zZSh0b3JyZW50LCBwZWVyLCBpc1NlZWRlciwgcmVxdWVzdEhhbmRsZXIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlRW1wdHlSZXNwb25zZShIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBhbm5vdW5jZVJlcXVlc3QsIFJlcXVlc3RIYW5kbGVyIHJlcXVlc3RIYW5kbGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBhbm5vdW5jZVJlc3BvbnNlOworICAgIHRyeSB7CisgICAgICBhbm5vdW5jZVJlc3BvbnNlID0gSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmNyYWZ0KAorICAgICAgICAgICAgICBteUFubm91bmNlSW50ZXJ2YWwsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxQZWVyPmVtcHR5TGlzdCgpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICByZXF1ZXN0SGFuZGxlci5zZXJ2ZVJlc3BvbnNlKFN0YXR1cy5PSy5nZXRDb2RlKCksIFN0YXR1cy5PSy5nZXREZXNjcmlwdGlvbigpLCBhbm5vdW5jZVJlc3BvbnNlLmdldERhdGEoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHNlcnZlRXJyb3IoU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgZS5nZXRNZXNzYWdlKCksIHJlcXVlc3RIYW5kbGVyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbm5vdW5jZUludGVydmFsKGludCBhbm5vdW5jZUludGVydmFsKSB7CisgICAgbXlBbm5vdW5jZUludGVydmFsID0gYW5ub3VuY2VJbnRlcnZhbDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0QW5ub3VuY2VJbnRlcnZhbCgpIHsKKyAgICByZXR1cm4gbXlBbm5vdW5jZUludGVydmFsOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlQW5ub3VuY2VSZXNwb25zZShUcmFja2VkVG9ycmVudCB0b3JyZW50LCBQZWVyIHBlZXIsIGJvb2xlYW4gaXNTZWVkZXIsIFJlcXVlc3RIYW5kbGVyIHJlcXVlc3RIYW5kbGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBhbm5vdW5jZVJlc3BvbnNlOworICAgIHRyeSB7CisgICAgICBhbm5vdW5jZVJlc3BvbnNlID0gSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlLmNyYWZ0KAorICAgICAgICAgICAgICBpc1NlZWRlciA/IFNFRURFUl9BTk5PVU5DRV9JTlRFUlZBTCA6IG15QW5ub3VuY2VJbnRlcnZhbCwKKyAgICAgICAgICAgICAgdG9ycmVudC5zZWVkZXJzKCksCisgICAgICAgICAgICAgIHRvcnJlbnQubGVlY2hlcnMoKSwKKyAgICAgICAgICAgICAgaXNTZWVkZXIgPyBDb2xsZWN0aW9ucy48UGVlcj5lbXB0eUxpc3QoKSA6IHRvcnJlbnQuZ2V0U29tZVBlZXJzKHBlZXIpLAorICAgICAgICAgICAgICB0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgcmVxdWVzdEhhbmRsZXIuc2VydmVSZXNwb25zZShTdGF0dXMuT0suZ2V0Q29kZSgpLCBTdGF0dXMuT0suZ2V0RGVzY3JpcHRpb24oKSwgYW5ub3VuY2VSZXNwb25zZS5nZXREYXRhKCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzZXJ2ZUVycm9yKFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCByZXF1ZXN0SGFuZGxlcik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzaW5nIG91ciBkZWZpbmVkIEJZVEVfRU5DT0RJTkcuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogQmVjYXVzZSB3ZSdyZSBleHBlY3RpbmcgYnl0ZS1lbmNvZGVkIHN0cmluZ3MgYXMgcXVlcnkgcGFyYW1ldGVycywgd2UKKyAgICogY2FuJ3QgcmVseSBvbiBTaW1wbGVIVFRQJ3MgUXVlcnlQYXJzZXIgd2hpY2ggdXNlcyB0aGUgd3JvbmcgZW5jb2RpbmcgZm9yCisgICAqIHRoZSBqb2IgYW5kIHJldHVybnMgdXMgdW5wYXJzYWJsZSBieXRlIGRhdGEuIFdlIHRodXMgaGF2ZSB0byBpbXBsZW1lbnQKKyAgICogb3VyIG93biBsaXR0bGUgcGFyc2luZyBtZXRob2QgdGhhdCB1c2VzIEJZVEVfRU5DT0RJTkcgdG8gZGVjb2RlCisgICAqIHBhcmFtZXRlcnMgZnJvbSB0aGUgVVJJLgorICAgKiA8L3A+CisgICAqIDxwPgorICAgKiA8cD4KKyAgICogPGI+Tm90ZTo8L2I+IGFycmF5IHBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIElmIGEga2V5IGlzIHByZXNlbnQKKyAgICogbXVsdGlwbGUgdGltZXMgaW4gdGhlIFVSSSwgdGhlIGxhdGVzdCB2YWx1ZSBwcmV2YWlscy4gV2UgZG9uJ3QgcmVhbGx5CisgICAqIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBhcyB0aGlzIG5ldmVyIGhhcHBlbnMgaW4gdGhlCisgICAqIFRyYWNrZXIgSFRUUCBwcm90b2NvbC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gdXJpCisgICAqIEBwYXJhbSBob3N0QWRkcmVzcworICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZX0gcmVwcmVzZW50aW5nIHRoZSBjbGllbnQncworICAgKiBhbm5vdW5jZSByZXF1ZXN0LgorICAgKi8KKyAgLy8g5qC55o2u5a6i5oi356uv5Lyg5p2ldXJp77yM6Kej5p6Q5pWw5o2u77yM55Sf5oiQ5LiA5LiqSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2Xlr7nosaEKKyAgcHJpdmF0ZSBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBwYXJzZVF1ZXJ5KGZpbmFsIFN0cmluZyB1cmksIGZpbmFsIFN0cmluZyBob3N0QWRkcmVzcykKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7IC8v5a6i5oi356uv5Lyg5p2l55qE5Y+C5pWwCisKKyAgICB0cnkgeworLy8JCQlTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKTsKKyAgICAgIGZvciAoU3RyaW5nIHBhaXIgOiB1cmkuc3BsaXQoIls/XSIpWzFdLnNwbGl0KCImIikpIHsKKyAgICAgICAgU3RyaW5nW10ga2V5dmFsID0gcGFpci5zcGxpdCgiWz1dIiwgMik7CisgICAgICAgIGlmIChrZXl2YWwubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICB0aGlzLnJlY29yZFBhcmFtKHBhcmFtcywga2V5dmFsWzBdLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnJlY29yZFBhcmFtKHBhcmFtcywga2V5dmFsWzBdLCBrZXl2YWxbMV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgIHBhcmFtcy5jbGVhcigpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBwZWVyIElQLCBmYWxsYmFja2luZyBvbiB0aGUgcmVxdWVzdCdzIHNvdXJjZQorICAgIC8vIGFkZHJlc3MgaWYgdGhlIHBlZXIgZGlkbid0IHByb3ZpZGUgaXQuCisgICAgaWYgKHBhcmFtcy5nZXQoImlwIikgPT0gbnVsbCkgeworICAgICAgcGFyYW1zLnB1dCgiaXAiLCBuZXcgQkVWYWx1ZSgKKyAgICAgICAgICAgICAgaG9zdEFkZHJlc3MsCisgICAgICAgICAgICAgIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfQorCisgICAgcmV0dXJuIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLnBhcnNlKG5ldyBCRVZhbHVlKHBhcmFtcykpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlY29yZFBhcmFtKE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcywgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgIHZhbHVlID0gVVJMRGVjb2Rlci5kZWNvZGUodmFsdWUsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKTsKKworICAgICAgZm9yIChTdHJpbmcgZiA6IE5VTUVSSUNfUkVRVUVTVF9GSUVMRFMpIHsKKyAgICAgICAgaWYgKGYuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICBwYXJhbXMucHV0KGtleSwgbmV3IEJFVmFsdWUoTG9uZy52YWx1ZU9mKHZhbHVlKSkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwYXJhbXMucHV0KGtleSwgbmV3IEJFVmFsdWUodmFsdWUsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgIC8vIElnbm9yZSwgYWN0IGxpa2UgcGFyYW1ldGVyIHdhcyBub3QgdGhlcmUKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYSB7QGxpbmsgSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2V9IHRvIHRoZSByZXNwb25zZSB3aXRoIHRoZSBnaXZlbgorICAgKiBIVFRQIHN0YXR1cyBjb2RlLgorICAgKgorICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBIVFRQIHN0YXR1cyBjb2RlIHRvIHJldHVybi4KKyAgICogQHBhcmFtIGVycm9yICBUaGUgZXJyb3IgcmVwb3J0ZWQgYnkgdGhlIHRyYWNrZXIuCisgICAqLworICBwcml2YXRlIHZvaWQgc2VydmVFcnJvcihTdGF0dXMgc3RhdHVzLCBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSBlcnJvciwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmVxdWVzdEhhbmRsZXIuc2VydmVSZXNwb25zZShzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0RGVzY3JpcHRpb24oKSwgZXJyb3IuZ2V0RGF0YSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSByZXNwb25zZSB3aXRoIHRoZSBnaXZlbiBIVFRQIHN0YXR1cyBjb2RlLgorICAgKgorICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBIVFRQIHN0YXR1cyBjb2RlIHRvIHJldHVybi4KKyAgICogQHBhcmFtIGVycm9yICBUaGUgZXJyb3IgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgdHJhY2tlci4KKyAgICovCisgIHByaXZhdGUgdm9pZCBzZXJ2ZUVycm9yKFN0YXR1cyBzdGF0dXMsIFN0cmluZyBlcnJvciwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5zZXJ2ZUVycm9yKHN0YXR1cywgSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UuY3JhZnQoZXJyb3IpLCByZXF1ZXN0SGFuZGxlcik7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYSB0cmFja2VyIGZhaWx1cmUgcmVhc29uIGNvZGUgdG8gdGhlIHJlc3BvbnNlIHdpdGggdGhlIGdpdmVuIEhUVFAKKyAgICogc3RhdHVzIGNvZGUuCisgICAqCisgICAqIEBwYXJhbSBzdGF0dXMgVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLgorICAgKiBAcGFyYW0gcmVhc29uIFRoZSBmYWlsdXJlIHJlYXNvbiByZXBvcnRlZCBieSB0aGUgdHJhY2tlci4KKyAgICovCisgIHByaXZhdGUgdm9pZCBzZXJ2ZUVycm9yKFN0YXR1cyBzdGF0dXMsIEVycm9yTWVzc2FnZS5GYWlsdXJlUmVhc29uIHJlYXNvbiwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5zZXJ2ZUVycm9yKHN0YXR1cywgcmVhc29uLmdldE1lc3NhZ2UoKSwgcmVxdWVzdEhhbmRsZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKGJvb2xlYW4gYWNjZXB0Rm9yZWlnblRvcnJlbnRzKSB7CisgICAgbXlBY2NlcHRGb3JlaWduVG9ycmVudHMgPSBhY2NlcHRGb3JlaWduVG9ycmVudHM7CisgIH0KKworICBwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RIYW5kbGVyIHsKKyAgICAvLyDov5Tlm55odHRw5ZON5bqUCisgICAgdm9pZCBzZXJ2ZVJlc3BvbnNlKGludCBjb2RlLCBTdHJpbmcgZGVzY3JpcHRpb24sIEJ5dGVCdWZmZXIgcmVzcG9uc2VEYXRhKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJTZXJ2aWNlQ29udGFpbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclNlcnZpY2VDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmNlY2NhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJTZXJ2aWNlQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlcXVlc3Q7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlc3BvbnNlOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5jb3JlLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CisKKy8qKgorICogQGF1dGhvciBTZXJnZXkuUGFrCisgKiBEYXRlOiA4LzEyLzEzCisgKiBUaW1lOiA4OjI1IFBNCisgKi8KKworLy8gaHR0cOivt+axguWkhOeQhuWZqAorcHVibGljIGNsYXNzIFRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyIGltcGxlbWVudHMgQ29udGFpbmVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlclNlcnZpY2VDb250YWluZXIuY2xhc3MpOworCisgIHByaXZhdGUgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgbXlSZXF1ZXN0UHJvY2Vzc29yOworICBwcml2YXRlIGZpbmFsIE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yIG15TXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3I7CisKKyAgcHVibGljIFRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyKGZpbmFsIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIHJlcXVlc3RQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvciBtdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvcikgeworICAgIG15UmVxdWVzdFByb2Nlc3NvciA9IHJlcXVlc3RQcm9jZXNzb3I7CisgICAgbXlNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvciA9IG11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yOworICB9CisKKyAgLyoqCisgICAqIEhhbmRsZSB0aGUgaW5jb21pbmcgcmVxdWVzdCBvbiB0aGUgdHJhY2tlciBzZXJ2aWNlLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGlzIG1ha2VzIHN1cmUgdGhlIHJlcXVlc3QgaXMgbWFkZSB0byB0aGUgdHJhY2tlcidzIGFubm91bmNlIFVSTCwgYW5kCisgICAqIGRlbGVnYXRlcyBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdCB0byB0aGUgPGVtPnByb2Nlc3MoKTwvZW0+IG1ldGhvZCBhZnRlcgorICAgKiBwcmVwYXJpbmcgdGhlIHJlc3BvbnNlIG9iamVjdC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcmVxdWVzdCAgVGhlIGluY29taW5nIEhUVFAgcmVxdWVzdC4KKyAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3QuCisgICAqLworCisgIC8vIOWkhOeQhuWNleS4queahGh0dHDor7fmsYIg5oiW5piv5aSa5Liq6K+35rGCCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGUoUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgIC8vIFJlamVjdCBub24tYW5ub3VuY2UgcmVxdWVzdHMKKyAgICBpZiAoIVRyYWNrZXIuQU5OT1VOQ0VfVVJMLmVxdWFscyhyZXF1ZXN0LmdldFBhdGgoKS50b1N0cmluZygpKSkgeworICAgICAgcmVzcG9uc2Uuc2V0Q29kZSg0MDQpOworICAgICAgcmVzcG9uc2Uuc2V0VGV4dCgiTm90IEZvdW5kIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgT3V0cHV0U3RyZWFtIGJvZHkgPSBudWxsOworICAgIHRyeSB7CisgICAgICBib2R5ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgIHJlc3BvbnNlLnNldCgiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKTsKKyAgICAgIHJlc3BvbnNlLnNldCgiU2VydmVyIiwgIiIpOworICAgICAgcmVzcG9uc2Uuc2V0RGF0ZSgiRGF0ZSIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICAgICAgaWYgKCJHRVQiLmVxdWFsc0lnbm9yZUNhc2UocmVxdWVzdC5nZXRNZXRob2QoKSkpIHsvL+WNleeLrOivt+axggorCisgICAgICAgIG15UmVxdWVzdFByb2Nlc3Nvci5wcm9jZXNzKHJlcXVlc3QuZ2V0QWRkcmVzcygpLnRvU3RyaW5nKCksIHJlcXVlc3QuZ2V0Q2xpZW50QWRkcmVzcygpLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgIGdldFJlcXVlc3RIYW5kbGVyKHJlc3BvbnNlKSk7CisgICAgICB9IGVsc2Ugey8v5aSa6K+35rGC5aSE55CGCisgICAgICAgIG15TXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IucHJvY2VzcyhyZXF1ZXN0LmdldENvbnRlbnQoKSwgcmVxdWVzdC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENsaWVudEFkZHJlc3MoKS5nZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSwgZ2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2UpKTsKKyAgICAgIH0KKyAgICAgIGJvZHkuZmx1c2goKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJFcnJvciB3aGlsZSB3cml0aW5nIHJlc3BvbnNlOiB7fSEiLCBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiZXJyb3IgaW4gcHJvY2Vzc2luZyByZXF1ZXN0IHt9IiwgcmVxdWVzdCwgdCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGJvZHkpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBUcmFja2VyUmVxdWVzdFByb2Nlc3Nvci5SZXF1ZXN0SGFuZGxlciBnZXRSZXF1ZXN0SGFuZGxlcihmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgIHJldHVybiBuZXcgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuUmVxdWVzdEhhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHNlcnZlUmVzcG9uc2UoaW50IGNvZGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQnl0ZUJ1ZmZlciByZXNwb25zZURhdGEpIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29kZShjb2RlKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0VGV4dChkZXNjcmlwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uc2VEYXRhLnJld2luZCgpOworICAgICAgICAgIGZpbmFsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCA9IENoYW5uZWxzLm5ld0NoYW5uZWwocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgIGNoYW5uZWwud3JpdGUocmVzcG9uc2VEYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKGJvb2xlYW4gYWNjZXB0Rm9yZWlnblRvcnJlbnRzKSB7CisgICAgbXlSZXF1ZXN0UHJvY2Vzc29yLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyhhY2NlcHRGb3JlaWduVG9ycmVudHMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QW5ub3VuY2VJbnRlcnZhbChpbnQgYW5ub3VuY2VJbnRlcnZhbCkgeworICAgIG15UmVxdWVzdFByb2Nlc3Nvci5zZXRBbm5vdW5jZUludGVydmFsKGFubm91bmNlSW50ZXJ2YWwpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3JUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3ZDIxNgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9NdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVGVtcEZpbGVzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LlV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHAuSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3JUZXN0IHsKKworICBwcml2YXRlIFRyYWNrZXIgdHJhY2tlcjsKKyAgcHJpdmF0ZSBUZW1wRmlsZXMgdGVtcEZpbGVzOworCisKKyAgcHVibGljIE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yVGVzdCgpIHsKKyAgICBpZiAoTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5nZXRBbGxBcHBlbmRlcnMoKS5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgIHJldHVybjsKKyAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcihuZXcgUGF0dGVybkxheW91dCgiWyVke01NZGQgSEg6bW06c3MsU1NTfV0gJTZwIC0gJTIwLjIwYyAtICVtICVuIikpKTsKKyAgICBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnNldExldmVsKFV0aWxzLmdldExvZ0xldmVsKCkpOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRlbXBGaWxlcyA9IG5ldyBUZW1wRmlsZXMoKTsKKyAgICBzdGFydFRyYWNrZXIoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb3JyZWN0VGVzdCgpIHRocm93cyBUcmFja2VyTWVzc2FnZS5NZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UiKTsKKworICAgIGZpbmFsIFN0cmluZyB1cmxUZW1wbGF0ZSA9IHVybC50b1N0cmluZygpICsKKyAgICAgICAgICAgICI/aW5mb19oYXNoPXtoYXNofSIgKworICAgICAgICAgICAgIiZwZWVyX2lkPUFCQ0RFRkdISUpLTE1OT1BRUlNUIiArCisgICAgICAgICAgICAiJmlwPXtpcH0iICsKKyAgICAgICAgICAgICImcG9ydD17cG9ydH0iICsKKyAgICAgICAgICAgICImZG93bmxvYWRlZD0xMjM0IiArCisgICAgICAgICAgICAiJmxlZnQ9MCIgKworICAgICAgICAgICAgIiZldmVudD1zdGFydGVkIjsKKworICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgIFN0cmluZ0J1aWxkZXIgcmVxdWVzdFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcmVxdWVzdFN0cmluZy5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgICByZXF1ZXN0U3RyaW5nLmFwcGVuZChnZXRVcmxGcm9tVGVtcGxhdGUodXJsVGVtcGxhdGUsICIxIiArIGksICIxMjcuMC4wLjEiLCA2ODgxKSk7CisgICAgfQorICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCIpOworICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShyZXF1ZXN0U3RyaW5nLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOworCisgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisKKyAgICBmaW5hbCBCRVZhbHVlIGJkZWNvZGUgPSBCRGVjb2Rlci5iZGVjb2RlKGlucHV0U3RyZWFtKTsKKworICAgIGFzc2VydEVxdWFscyh0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSwgNSk7CisgICAgYXNzZXJ0RXF1YWxzKGJkZWNvZGUuZ2V0TGlzdCgpLnNpemUoKSwgNSk7CisKKyAgICBmb3IgKEJFVmFsdWUgYmVWYWx1ZSA6IGJkZWNvZGUuZ2V0TGlzdCgpKSB7CisKKyAgICAgIGZpbmFsIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSByZXNwb25zZU1lc3NhZ2UgPSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UucGFyc2UoYmVWYWx1ZSk7CisgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlTWVzc2FnZS5nZXRQZWVycygpLmlzRW1wdHkoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzcG9uc2VNZXNzYWdlLmdldENvbXBsZXRlKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3BvbnNlTWVzc2FnZS5nZXRJbmNvbXBsZXRlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFVybEZyb21UZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGUsIFN0cmluZyBoYXNoLCBTdHJpbmcgaXAsIGludCBwb3J0KSB7CisgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoIntoYXNofSIsIGhhc2gpLnJlcGxhY2UoIntpcH0iLCBpcCkucmVwbGFjZSgie3BvcnR9IiwgU3RyaW5nLnZhbHVlT2YocG9ydCkpOworICB9CisKKworICBwcml2YXRlIHZvaWQgc3RhcnRUcmFja2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIgPSBuZXcgVHJhY2tlcig2OTY5KTsKKyAgICB0cmFja2VyLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisgICAgdHJhY2tlci5zZXRQZWVyQ29sbGVjdG9yRXhwaXJlVGltZW91dCgxMCk7CisgICAgdGhpcy50cmFja2VyLnN0YXJ0KHRydWUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN0b3BUcmFja2VyKCkgeworICAgIHRoaXMudHJhY2tlci5zdG9wKCk7CisgIH0KKworICBAQWZ0ZXJNZXRob2QKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzdG9wVHJhY2tlcigpOworICAgIHRlbXBGaWxlcy5jbGVhbnVwKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RvcnJlbnRzUmVwb3NpdG9yeVRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9Ub3JyZW50c1JlcG9zaXRvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1Yjg0MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9Ub3JyZW50c1JlcG9zaXRvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lk1vY2tUaW1lU2VydmljZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBUb3JyZW50c1JlcG9zaXRvcnlUZXN0IHsKKworICBwcml2YXRlIFRvcnJlbnRzUmVwb3NpdG9yeSBteVRvcnJlbnRzUmVwb3NpdG9yeTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkgPSBuZXcgVG9ycmVudHNSZXBvc2l0b3J5KDEwKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdFRvcnJlbnRzU3RvcmVkSW5SZXBvc2l0b3J5KCkgeworICAgIGFzc2VydEVxdWFscyhteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnNpemUoKSwgMCk7CisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDIsIDN9KTsKKworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSwgdG9ycmVudCk7CisgICAgYXNzZXJ0VHJ1ZShteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSkgPT0gdG9ycmVudCk7CisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdG9ycmVudENvcHkgPSBuZXcgVHJhY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAyLCAzfSk7CisKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudCh0b3JyZW50Q29weS5nZXRIZXhJbmZvSGFzaCgpLCB0b3JyZW50Q29weSk7CisgICAgYXNzZXJ0VHJ1ZShteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSkgPT0gdG9ycmVudCk7CisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAxKTsKKworICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHNlY29uZFRvcnJlbnQgPSBuZXcgVHJhY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXszLCAyLCAxfSk7CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkucHV0SWZBYnNlbnQoc2Vjb25kVG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCBzZWNvbmRUb3JyZW50KTsKKyAgICBhc3NlcnRFcXVhbHMobXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS5zaXplKCksIDIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFB1dElmQWJzZW50QW5kVXBkYXRlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCisgICAgZmluYWwgQXRvbWljQm9vbGVhbiB1cGRhdGVJbnZva2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICBUcmFja2VkVG9ycmVudCB0b3JyZW50ID0gbmV3IFRyYWNrZWRUb3JyZW50KG5ldyBieXRlW117MSwgMiwgM30pIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFRyYWNrZWRQZWVyIHVwZGF0ZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwgQnl0ZUJ1ZmZlciBwZWVySWQsIFN0cmluZyBoZXhQZWVySWQsIFN0cmluZyBpcCwgaW50IHBvcnQsIGxvbmcgdXBsb2FkZWQsIGxvbmcgZG93bmxvYWRlZCwgbG9uZyBsZWZ0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHVwZGF0ZUludm9rZWQuc2V0KHRydWUpOworICAgICAgICByZXR1cm4gc3VwZXIudXBkYXRlKGV2ZW50LCBwZWVySWQsIGhleFBlZXJJZCwgaXAsIHBvcnQsIHVwbG9hZGVkLCBkb3dubG9hZGVkLCBsZWZ0KTsKKyAgICAgIH0KKyAgICB9OworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50QW5kVXBkYXRlKHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSwgdG9ycmVudCwKKyAgICAgICAgICAgIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50LlNUQVJURUQsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoNSksICIwIiwKKyAgICAgICAgICAgICIxMjcuMC4wLjEiLCA2ODgxLCA1LCAxMCwgMTIpOworICAgIGFzc2VydFRydWUodXBkYXRlSW52b2tlZC5nZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnQuZ2V0UGVlcnMoKS5zaXplKCksIDEpOworICAgIGZpbmFsIFRyYWNrZWRQZWVyIHRyYWNrZWRQZWVyID0gdG9ycmVudC5nZXRQZWVycygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXRJcCgpLCAiMTI3LjAuMC4xIik7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldFBvcnQoKSwgNjg4MSk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldExlZnQoKSwgMTIpOworICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXREb3dubG9hZGVkKCksIDEwKTsKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0VXBsb2FkZWQoKSwgNSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdENsZWFudXBEb250TG9ja0FsbFRvcnJlbnRzQW5kU3RvcmFnZSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFNlbWFwaG9yZSBjbGVhbkZpbmlzaExvY2sgPSBuZXcgU2VtYXBob3JlKDApOworICAgIGZpbmFsIFNlbWFwaG9yZSBjbGVhblN0YXJ0TG9jayA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDIsIDN9KSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGNvbGxlY3RVbmZyZXNoUGVlcnMoaW50IGV4cGlyZVRpbWVvdXRTZWMpIHsKKyAgICAgICAgY2xlYW5TdGFydExvY2sucmVsZWFzZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgIGlmICghY2xlYW5GaW5pc2hMb2NrLnRyeUFjcXVpcmUoMSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIGZhaWwoImNhbiBub3QgYWNxdWlyZSBzZW1hcGhvcmUiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKCJjYW4gbm90IGZpbmlzaCBjbGVhbnVwIiwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkucHV0SWZBYnNlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCB0b3JyZW50KTsKKyAgICB0b3JyZW50LmFkZFBlZXIobmV3IFRyYWNrZWRQZWVyKHRvcnJlbnQsICIxMjcuMC4wLjEiLCA2ODgxLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwKSkpOworICAgIGFzc2VydEVxdWFscyhteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnNpemUoKSwgMSk7CisKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICB0cnkgeworICAgICAgZmluYWwgRnV0dXJlPEludGVnZXI+IGNsZWFudXBGdXR1cmUgPSBleGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxJbnRlZ2VyPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5jbGVhbnVwKDEpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICghY2xlYW5TdGFydExvY2sudHJ5QWNxdWlyZSgxLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgIGZhaWwoImNhbm5vdCBhY3F1aXJlIHNlbWFwaG9yZSIpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZhaWwoImRvbid0IHJlY2VpdmVkIHRoYXQgY2xlYW51cCBpcyBzdGFydGVkIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHNlY29uZFRvcnJlbnQgPSBuZXcgVHJhY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXszLCAxLCAxfSk7CisKKyAgICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50QW5kVXBkYXRlKHNlY29uZFRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSwgc2Vjb25kVG9ycmVudCwKKyAgICAgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuU1RBUlRFRCwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KSwgIjAiLAorICAgICAgICAgICAgICAiMTI3LjAuMC4xIiwgNjg4MSwgMCwgMCwgMSk7CisKKyAgICAgIGNsZWFuRmluaXNoTG9jay5yZWxlYXNlKCk7CisgICAgICB0cnkgeworICAgICAgICBjbGVhbnVwRnV0dXJlLmdldCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFpbCgiY2xlYW51cCB3YXMgaW50ZXJydXB0ZWQiLCBlKTsKKyAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZhaWwoImNsZWFudXAgd2FzIGZhaWxlZCB3aXRoIGV4ZWN1dGlvbiBleGNlcHRpb24iLCBlKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsKCJjYW5ub3QgZ2V0IHJlc3VsdCBmcm9tIGZ1dHVyZSIsIGUpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdFRvcnJlbnRzQ2FuUmVtb3ZlZEZyb21TdG9yYWdlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFRyYWNrZWRUb3JyZW50IHRvcnJlbnQgPSBuZXcgVHJhY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAyLCAzfSk7CisKKyAgICBNb2NrVGltZVNlcnZpY2UgdGltZVNlcnZpY2UgPSBuZXcgTW9ja1RpbWVTZXJ2aWNlKCk7CisgICAgdGltZVNlcnZpY2Uuc2V0VGltZSgxMDAwMCk7CisgICAgZmluYWwgVHJhY2tlZFBlZXIgcGVlciA9IG5ldyBUcmFja2VkUGVlcih0b3JyZW50LCAiMTI3LjAuMC4xIiwgNjg4MSwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KSwgdGltZVNlcnZpY2UpOworICAgIHRvcnJlbnQuYWRkUGVlcihwZWVyKTsKKworICAgIHRpbWVTZXJ2aWNlLnNldFRpbWUoMTUwMDApOworICAgIGZpbmFsIFRyYWNrZWRQZWVyIHNlY29uZFBlZXIgPSBuZXcgVHJhY2tlZFBlZXIodG9ycmVudCwgIjEyNy4wLjAuMSIsIDY4ODIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoNSksIHRpbWVTZXJ2aWNlKTsKKyAgICB0b3JyZW50LmFkZFBlZXIoc2Vjb25kUGVlcik7CisKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCksIHRvcnJlbnQpOworCisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHModG9ycmVudC5nZXRQZWVycygpLnNpemUoKSwgMik7CisKKyAgICB0aW1lU2VydmljZS5zZXRUaW1lKDE3MDAwKTsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5jbGVhbnVwKDEwKTsKKworICAgIGFzc2VydEVxdWFscyhteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnNpemUoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnQuZ2V0UGVlcnMoKS5zaXplKCksIDIpOworCisgICAgdGltZVNlcnZpY2Uuc2V0VGltZSgyMzAwMCk7CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkuY2xlYW51cCgxMCk7CisKKyAgICBhc3NlcnRFcXVhbHMobXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS5zaXplKCksIDEpOworICAgIGFzc2VydEVxdWFscyh0b3JyZW50LmdldFBlZXJzKCkuc2l6ZSgpLCAxKTsKKworICAgIHRpbWVTZXJ2aWNlLnNldFRpbWUoNDAwMDApOworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LmNsZWFudXAoMTApOworCisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAwKTsKKyAgICBhc3NlcnRFcXVhbHModG9ycmVudC5nZXRQZWVycygpLnNpemUoKSwgMCk7CisKKyAgfQorfQo=