ZGlmZiAtLWdpdCBhL0xJQ0VOU0UuYWN0aXZhdGlvbiBiL0xJQ0VOU0UuYWN0aXZhdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQwMTlkCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRS5hY3RpdmF0aW9uCkBAIC0wLDAgKzEsMTE2IEBACitDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAorCisxLiBEZWZpbml0aW9ucy4KKworMS4xLiBDb250cmlidXRvciBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KKworMS4yLiBDb250cmlidXRvciBWZXJzaW9uIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCisKKzEuMy4gQ292ZXJlZCBTb2Z0d2FyZSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisKKzEuNC4gRXhlY3V0YWJsZSBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgorCisxLjUuIEluaXRpYWwgRGV2ZWxvcGVyIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzEuNi4gTGFyZ2VyIFdvcmsgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKzEuNy4gTGljZW5zZSBtZWFucyB0aGlzIGRvY3VtZW50LgorCisxLjguIExpY2Vuc2FibGUgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCisKKzEuOS4gTW9kaWZpY2F0aW9ucyBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKworQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zOworCitCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgorCitDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworMS4xMC4gT3JpZ2luYWwgU29mdHdhcmUgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisxLjExLiBQYXRlbnQgQ2xhaW1zIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgorCisxLjEyLiBTb3VyY2UgQ29kZSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KKworMS4xMy4gWW91IChvciBZb3VyKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsIFlvdSBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgY29udHJvbCBtZWFucyAoYSmHdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKYdvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworMi4gTGljZW5zZSBHcmFudHMuCisKKzIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgorQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKyhhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KKyhjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc4cyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKyhkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbocyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKYdmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKYdmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKYd0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKYd0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KKworMi4yLiBDb250cmlidXRvciBHcmFudC4KK0NvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKYdNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMimHdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgorKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zhzIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uhzIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEph2ZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKYdmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKYd0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSmHdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMymHdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KKworMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgorCiszLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KKworQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworMy4yLiBNb2RpZmljYXRpb25zLgorCitUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgorCiszLjMuIFJlcXVpcmVkIE5vdGljZXMuCitZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgorCiszLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCitZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCisKKzMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCitZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgorCiszLjYuIExhcmdlciBXb3Jrcy4KK1lvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLgorCis0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KKworNC4xLiBOZXcgVmVyc2lvbnMuCitTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KKworNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgorCitZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgorNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KKworV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEph3JlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYimHb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCisKKzUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCisKK0NPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgorCis2LiBURVJNSU5BVElPTi4KKworNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgorCis2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnOHMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCisKKzYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zhzYuMSBvciA2LjIgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCitVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKworOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KKworVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSBjb21tZXJjaWFsIGl0ZW0sIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ4h0MuRi5SLocyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4ghzI1Mi4yMjctNzAxNChhKSgxKSkgYW5kIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4h0MuRi5SLocxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KKworOS4gTUlTQ0VMTEFORU9VUy4KKworVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb25zIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KKworMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCisKK0FzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KKworTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKK1RoZSBHbGFzc0Zpc2ggY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLiAKZGlmZiAtLWdpdCBhL0xJQ0VOU0UubWFpbCBiL0xJQ0VOU0UubWFpbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQwMTlkCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRS5tYWlsCkBAIC0wLDAgKzEsMTE2IEBACitDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAorCisxLiBEZWZpbml0aW9ucy4KKworMS4xLiBDb250cmlidXRvciBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KKworMS4yLiBDb250cmlidXRvciBWZXJzaW9uIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCisKKzEuMy4gQ292ZXJlZCBTb2Z0d2FyZSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisKKzEuNC4gRXhlY3V0YWJsZSBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgorCisxLjUuIEluaXRpYWwgRGV2ZWxvcGVyIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzEuNi4gTGFyZ2VyIFdvcmsgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKzEuNy4gTGljZW5zZSBtZWFucyB0aGlzIGRvY3VtZW50LgorCisxLjguIExpY2Vuc2FibGUgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCisKKzEuOS4gTW9kaWZpY2F0aW9ucyBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKworQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zOworCitCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgorCitDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworMS4xMC4gT3JpZ2luYWwgU29mdHdhcmUgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisxLjExLiBQYXRlbnQgQ2xhaW1zIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgorCisxLjEyLiBTb3VyY2UgQ29kZSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KKworMS4xMy4gWW91IChvciBZb3VyKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsIFlvdSBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgY29udHJvbCBtZWFucyAoYSmHdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKYdvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworMi4gTGljZW5zZSBHcmFudHMuCisKKzIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgorQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKyhhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KKyhjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc4cyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKyhkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbocyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKYdmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKYdmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKYd0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKYd0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KKworMi4yLiBDb250cmlidXRvciBHcmFudC4KK0NvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKYdNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMimHdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgorKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zhzIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgorKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uhzIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEph2ZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKYdmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKYd0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSmHdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMymHdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KKworMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgorCiszLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KKworQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworMy4yLiBNb2RpZmljYXRpb25zLgorCitUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgorCiszLjMuIFJlcXVpcmVkIE5vdGljZXMuCitZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgorCiszLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCitZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCisKKzMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCitZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgorCiszLjYuIExhcmdlciBXb3Jrcy4KK1lvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLgorCis0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KKworNC4xLiBOZXcgVmVyc2lvbnMuCitTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KKworNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgorCitZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgorNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KKworV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEph3JlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYimHb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCisKKzUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCisKK0NPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgorCis2LiBURVJNSU5BVElPTi4KKworNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgorCis2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnOHMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCisKKzYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zhzYuMSBvciA2LjIgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisKKzcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgorCitVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKworOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KKworVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSBjb21tZXJjaWFsIGl0ZW0sIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ4h0MuRi5SLocyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4ghzI1Mi4yMjctNzAxNChhKSgxKSkgYW5kIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4h0MuRi5SLocxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KKworOS4gTUlTQ0VMTEFORU9VUy4KKworVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb25zIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KKworMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCisKK0FzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KKworTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKK1RoZSBHbGFzc0Zpc2ggY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLiAKZGlmZiAtLWdpdCBhL1JFTEVBU0VfTk9URVMudHh0IGIvUkVMRUFTRV9OT1RFUy50eHQKaW5kZXggMWM4OTJkMS4uYzYyYTNiZiAxMDA2NDQKLS0tIGEvUkVMRUFTRV9OT1RFUy50eHQKKysrIGIvUkVMRUFTRV9OT1RFUy50eHQKQEAgLTIwLDYgKzIwLDM1IEBACiBGb3IgbGVnYWwgYW5kIGxpY2Vuc2luZyBpc3N1ZXMsIHBsZWFzZSBsb29rIGluIHRoZSBsZWdhbCBzZWN0aW9uIG9mCiB0aGUgZG9jdW1lbnRhdGlvbiBvciByZWFkIHRoZSBMSUNFTlNFIGFuZCBOT1RJQ0UgZmlsZXMuCiAKK1ZlcnNpb24gMC40CistLS0tLS0tLS0tLSAKKworQ2hhbmdlcworLS0tLS0tLS0tCitTdWItdGFza3MgQ29tcGxldGVkCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01OSAtICBHZW5lcmlmeSBNYWlsQWRhcHRlciBBUEkKKyAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTY2IC0gRW5zdXJlIFNpZXZlRmFjdG9yeSBpcyB0aHJlYWQgc2FmZSBieSBkZWZhdWx0CisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS03MiAtIFZhbGlkYXRlIEV4dGVuc2lvbiBDb21wYXJhdG9ycyAKKyAKKyBCdWdzIEZpeGVkCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01NyAtIFBhcnNlIGZhaWx1cmUgd2l0aCBtdWx0aS1saW5lIGZvcm0gd2hlbiB0aGUgbGluZSBiZWdpbnMgd2l0aCBhIGRvdAorIAorIEltcHJvdmVtZW50cyBNYWRlCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS0zNSAtIFJldmlzZSBNYWlsQWRhcHRlci5nZXRDb250ZW50KCkgCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01NCAtIFJlbW92ZSBBbnQgQnVpbGQKKyAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTU1IC0gUmVtb3ZlIFN0YWdpbmcgRGlyZWN0b3J5CisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01NiAtIFByb3ZpZGUgYSB3YXkgdG8gZGV0ZXJtaW5lIGlmIGEga2VlcCBhY3Rpb24gaXMgaW1wbGljaXQgb3IgZXhwbGljaXQKKyAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTU4IC0gQ2xhcmlmeSBTaWV2ZUZhY3RvcnkgdGhyZWFkIHNhZmV0eQorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNjkgLSBJbXByb3ZlIFRlc3QgQ292ZXJhZ2UgT2YgQXNjaWkgTnVtZXJpYyBUZXN0CisgCisgTmV3IEZlYXR1cmVzIEFkZGVkCisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS03MSAtIEFkZCBTdXBwb3J0IEZvciBpO2FzY2lpLW51bWVyaWMgQ29tcGFyYXRvcgorIAorIFRhc2tzIENvbXBsZXRlZAorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNTMgLSBHZW5lcmlmeQorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNjMgLSBTd2l0Y2ggVG8gYXBhY2hlLXJlbGVhc2UgUHJvZmlsZQorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNjggLSBFbnN1cmUgTWFpbGV0IGlzIHRocmVhZCBzYWZlCisKIFZlcnNpb24gMC4zCiAtLS0tLS0tLS0tLSAKIFRoaXMgcmVsZWFzZSBpcyB0aGUgZmlyc3QgdG8gaW5jbHVkZSBtYWlsZXQgYW5kIHV0aWxpdHkgbW9kdWxlcywgaW4gYWRkaXRpb24gdG8gdGhlIGNvcmUgcGFyc2luZwpkaWZmIC0tZ2l0IGEvYXNzZW1ibGUvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvYmluLnhtbAppbmRleCA4OTcxNDliLi5jYWRkMjdhIDEwMDY0NAotLS0gYS9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgYi9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvYmluLnhtbApAQCAtMzEsOCArMzEsOCBAQAogICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi48L2RpcmVjdG9yeT4KICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgogICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLio8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRS4qPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KICAgICAgICAgPGluY2x1ZGU+UkVMRUFTRV9OT1RFUy50eHQ8L2luY2x1ZGU+CiAgICAgICA8L2luY2x1ZGVzPgogICAgIDwvZmlsZVNldD4KQEAgLTYxLDIxICs2MSwzOSBAQAogICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vdGFyZ2V0L3NpdGUvYXBpZG9jczwvZGlyZWN0b3J5PgogICAgICAgPG91dHB1dERpcmVjdG9yeT4vYXBpZG9jczwvb3V0cHV0RGlyZWN0b3J5PgogICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+Li4vc3RhZ2UvamF2YXguYWN0aXZhdGlvbi9qYXJzLzwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmFjdGl2YXRpb24uTElDRU5TRTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4uLi9zdGFnZS9qYXZheC5tYWlsL2phcnMvPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+bWFpbC5MSUNFTlNFPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+CiAgIDwvZmlsZVNldHM+CisgIDxmaWxlcz4KKyAgICA8ZmlsZT4KKyAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL0xJQ0VOU0UubWFpbDwvc291cmNlPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxkZXN0TmFtZT5tYWlsLkxJQ0VOU0U8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL0xJQ0VOU0UuYWN0aXZhdGlvbjwvc291cmNlPgorICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgIDxkZXN0TmFtZT5hY3RpdmF0aW9uLkxJQ0VOU0U8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL0xJQ0VOU0UudHh0PC9zb3VyY2U+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGRlc3ROYW1lPmFwYWNoZS1tYWlsZXQuTElDRU5TRTwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgIDxmaWxlPgorICAgICAgPHNvdXJjZT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vTElDRU5TRS50eHQ8L3NvdXJjZT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZGVzdE5hbWU+YXBhY2hlLW1haWxldC1iYXNlLkxJQ0VOU0U8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZT4KKyAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL0xJQ0VOU0UudHh0PC9zb3VyY2U+CisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPGRlc3ROYW1lPmFwYWNoZS1taW1lNGouTElDRU5TRTwvZGVzdE5hbWU+CisgICAgPC9maWxlPgorICAgIDxmaWxlPgorICAgICAgPHNvdXJjZT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vTElDRU5TRS50eHQ8L3NvdXJjZT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8ZGVzdE5hbWU+Y29tbW9ucy1sb2dnaW5nLkxJQ0VOU0U8L2Rlc3ROYW1lPgorICAgIDwvZmlsZT4KKyAgPC9maWxlcz4KICAgPGRlcGVuZGVuY3lTZXRzPgogICAgIDxkZXBlbmRlbmN5U2V0PgogICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliLzwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvYXNzZW1ibGUvc3JjL2Fzc2VtYmxlL3NyYy54bWwgYi9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvc3JjLnhtbAppbmRleCAwMzdhZjBhLi5jNjUxMTFmIDEwMDY0NAotLS0gYS9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvc3JjLnhtbAorKysgYi9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvc3JjLnhtbApAQCAtMzEsNiArMzEsNyBAQAogICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi48L2RpcmVjdG9yeT4KICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+CiAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgIDxleGNsdWRlPioqL2Jpbi8qKjwvZXhjbHVkZT4gICAgIAogICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+CiAgICAgICAgIDxleGNsdWRlPi4qPC9leGNsdWRlPgogICAgICAgICA8ZXhjbHVkZT4uKi8qKjwvZXhjbHVkZT4KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDYyODU3NjguLjExZjc0ZTcgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMzYsNiArMzYsOSBAQAogICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgogICAKICAgPHByb3BlcnRpZXM+CisgICAgPCEtLSBPdmVycmlkZSB0aGUgc291cmNlIGRlc2NyaXB0b3IgLS0+CisgICAgPHNvdXJjZVJlbGVhc2VBc3NlbWJseURlc2NyaXB0b3I+c3JjPC9zb3VyY2VSZWxlYXNlQXNzZW1ibHlEZXNjcmlwdG9yPgorICAgIAogICAgIDwhLS0KICAgICBUaGUgd2Vic2l0ZSBpcyBjb21taXR0ZWQgdG8gc3VidmVyc2lvbi4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgb3ZlcnJpZGVuCiAgICAgdG8gdXBsb2FkIHRoZSBzaXRlIHRvIGEgbG9jYWwgc3RhZ2luZyBsb2NhdGlvbi4KQEAgLTU5LDYgKzYyLDcgQEAKICAgICA8amFtZXMuanNpZXZlLnd3dz4ke2phbWVzLnd3d30vanNpZXZlLzwvamFtZXMuanNpZXZlLnd3dz4KICAgICA8IS0tIE92ZXJyaWRkaW5nIHRoaXMgdmFsdWUgYWxsb3dzIHNpbmdsZSBzZXQgb2YgbG9vcGJhY2sgc2V0dGluZ3MgdG8gYmUgbWFpbnRhaW5lZCAtLT4KICAgICA8amFtZXMud3d3LmlkPmpzaWV2ZS13ZWJzaXRlPC9qYW1lcy53d3cuaWQ+CisgICAgCiAgIDwvcHJvcGVydGllcz4KICAgCiAgIApkaWZmIC0tZ2l0IGEvdHJ1bmsvTElDRU5TRS50eHQgYi90cnVuay9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkOGM1OC4uMDAwMDAwMAotLS0gYS90cnVuay9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL05PVElDRS50eHQgYi90cnVuay9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMxNDQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFwYWNoZSBKYW1lcyBKU2lldmUgTGlicmFyeQ0KLUNvcHlyaWdodCAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLSAgIA0KZGlmZiAtLWdpdCBhL3RydW5rL1JFQURNRS50eHQgYi90cnVuay9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzY5NDU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUpTaWV2ZSBpcyBidWlsdCB1c2luZyBNYXZlbiAyIChodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZykuIFRvIGJ1aWxkIGFsbCBtb2R1bGVzIHR5cGUKLQotJSBtdm4gaW5zdGFsbAotCi0gCmRpZmYgLS1naXQgYS90cnVuay9SRUxFQVNFX05PVEVTLnR4dCBiL3RydW5rL1JFTEVBU0VfTk9URVMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5MmQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL1JFTEVBU0VfTk9URVMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSBOb3RlcwotICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLQotCi1BcGFjaGUgSlNpZXZlIGlzIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2lldmUgbWFpbCBmaWx0ZXJpbmcgbGFuZ3VhZ2UgZGVmaW5lZCBieSAKLVJGQyAzMDI4LiBqU2lldmUgaXMgaW1wbGVtZW50ZWQgYXMgYSBsYW5nYXVnZSBwcm9jZXNzb3IgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIGFueQotaW50ZXJuZXQgbWFpbCBhcHBsaWNhdGlvbiB0byBhZGQgU2lldmUgc3VwcG9ydC4KLQotQ29tbWVudHMsIFF1ZXN0aW9ucyBhbmQgSXNzdWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWpTaWV2ZSBpcyBhIHN1Yi1wcm9qZWN0IG9mIEFwYWNoZSBKYW1lcy4gUGxlYXNlIGRpcmVjdCB5b3VyIGNvbW1lbnRzIGFuZCBxdWVzdGlvbnMgdG8gCi10aGUgcmVsZXZhbnQgSmFtZXMgbGlzdC4KLQotVG8gcmVwb3J0IGlzc3Vlcywgc3VjaCBhcyBidWdzLCBnbyB0byAKLWh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUKLUFzIGpTaWV2ZSBjb21lcyB3aXRoIGEgZmFpcmx5IGV4dGVuc2l2ZSBzdWl0ZSBvZiBqVW5pdCBUZXN0cywgaXQgd291bGQgYmUgbW9zdCAKLWhlbHBmdWwgZm9yIGJ1ZyByZXBvcnRzIHRvIGJlIGFjY29tcGFuaWVkIGJ5IGFuIGlsbHVzdHJhdGl2ZSBqVW5pdCB0ZXN0IGNhc2UuCi0KLUxpY2Vuc2luZyBhbmQgbGVnYWwgaXNzdWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIGxlZ2FsIGFuZCBsaWNlbnNpbmcgaXNzdWVzLCBwbGVhc2UgbG9vayBpbiB0aGUgbGVnYWwgc2VjdGlvbiBvZgotdGhlIGRvY3VtZW50YXRpb24gb3IgcmVhZCB0aGUgTElDRU5TRSBhbmQgTk9USUNFIGZpbGVzLgotCi1WZXJzaW9uIDAuMwotLS0tLS0tLS0tLS0gCi1UaGlzIHJlbGVhc2UgaXMgdGhlIGZpcnN0IHRvIGluY2x1ZGUgbWFpbGV0IGFuZCB1dGlsaXR5IG1vZHVsZXMsIGluIGFkZGl0aW9uIHRvIHRoZSBjb3JlIHBhcnNpbmcKLWxpYnJhcnkuIFRoZSBjb25maWd1cmF0aW9uIEFQSSBoYXMgY2hhbmdlZCBzaWduaWZpY2FudGx5IHRvIHJlcGxhY2UgbWFnaWMgc2luZ2xldG9ucyB3aXRoIFBPSk9zCi1zdWl0YWJsZSBmb3IgSW9DLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSBoYXMgYmVlbiByZXRhaW5lZCBzbyB0aG91Z2ggY2FsbHMgaGF2ZQotY2hhbmdlZCwgZXhpc3RpbmcgY29uZmlndXJhdGlvbnMgc2hvdWxkIHN0aWxsIGJlIGNvbXBhdGlibGUuCi0gCi1VdGlsaXRpZXMgaW5jbHVkZSBub2RlIHNlcmlhbGl6ZXJzIHRvIHhtbCBhbmQgc2lldmUgc2NyaXB0LiBUaGUgbWFpbGV0IG1vZHVsZSBwcm92aWRlcyBTaWV2ZQotaW4gdGhlIEphbWVzIDMgY29kZWJhc2UuCi0KLUphdmEgMS41IGlzIG5vdyB0aGUgbWluaW11bSB2ZXJzaW9uIHJlcXVpcmVkLgotIAotQ2hhbmdlcyAgIAotLS0tLS0tLQotU3ViLXRhc2tzIENvbXBsZXRlZAotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMjcgLSBSZWZhY3RvciBDb21wYXJhdG9yTWFuYWdlcgotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMjkgLSBSZWZhY3RvciBDb25maWd1cmF0aW9uTWFuYWdlcgotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMzIgLSBSZWZhY3RvciBUZXN0TWFuYWdlcgotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMzcgLSBQdXNoIG1haW4gc291cmNlIGRvd24gYSBsZXZlbAotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMzggLSBNb2R1bGFyIEFudCBCdWlsZAotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDQgLSBDcmVhdGUgQ2hlY2sgTW9kdWxlCi0gKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS00NSAtIEV4dHJhY3QgUmV1c2FibGUgQW50IE1hY3JvcwotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDYgLSBVbmlmaWVkIERpc3RyaWJ1dGlvbgotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDggLSBSZWxlYXNlIFF1YWxpdHkgTWF2ZW4gQnVpbGQKLSAgICAKLUJ1Z3MgRml4ZWQKLSAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTQ5IC0gQ1BVIHNwaW5zIHdoZW4gOm1hdGNoZXMgZXhwcmVzc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgJnF1b3Q7KioqKioqKioqKioqKiZxdW90OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLUltcHJvdmVtZW50cyBNYWRlCi0gKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS00NyAtIEFjY2VzcyB0byBzY3JpcHQgY29tbWVudHMKLSAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTUyIC0gQ2hlY2sgU3VwcG9ydCBGb3IgTnVtZXJpYyBRdWFudGlmaWVycwotICAgIAotTmV3IEZlYXR1cmVzIEFkZGVkCi0gKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS00MyAtIEFkZCBBUEkgZm9yIGdlbmVyYXRpbmcgYSBTaWV2ZSBzY3JpcHQgZnJvbSBhIHBhcnNlIHRyZWUgCi0gKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01MCAtIFNpZXZlLUluLVhNTCAoRXhwZXJpbWVudGFsIFByZXZpZXcpCi0gICAgICAgICAgICAgICAgCi1UYXNrcyBDb21wbGV0ZWQKLSAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTE2IC0gU2luZ2xldG9ucyAtPiBJb0MKLSAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTI0IC0gSW5jbHVkZSBidWlsZCB0aW1lIGxpYnJhcmllcyAoamF2YWNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YW1haWwsIGFjdGl2YXRpb24pIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uCi0gKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS0zMyAtIFJlbW92ZSAuanVuaXQuIHBhY2thZ2UgbmFtZSBmcm9tIHRlc3RzLgotICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMzQgLSBtYWtlIGpzaWV2ZSBhIG11bHRpbW9kdWxlIHByb2plY3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9hc3NlbWJsZS9wb20ueG1sIGIvdHJ1bmsvYXNzZW1ibGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYTA5OS4uMDAwMDAwMAotLS0gYS90cnVuay9hc3NlbWJsZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAgLS0+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+anNpZXZlLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4wLjQ8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFwYWNoZS1qYW1lcy1qc2lldmU8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkFwYWNoZSBKQU1FUyBqU2lldmUgQXNzZW1ibHk8L25hbWU+Ci0gIDx2ZXJzaW9uPjAuNDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPGRlc2NyaXB0aW9uPgotQXBhY2hlIGpTaWV2ZSBpcyBhIHNlcnZlciBzaWRlIG1haWwgZmlsdGVyaW5nIHN5c3RlbSAKLWltcGxlbWVudGluZyBSRkMzMDI4LiBBcGFjaGUgalNpZXZlIGlzIGRldmVsb3BlZCBieSB0aGUgCi1KQU1FUyBwcm9qZWN0LiBUaGlzIG1vZHVsZSBpcyB1c2VkIGJ5IE1hdmVuIHRvIGNyZWF0ZQotZnVsbHkgYXNzZW1ibGVkIGFuZCBwYWNrYWdlZCBkaXN0cmlidXRpb25zLgotICA8L2Rlc2NyaXB0aW9uPgotICA8dXJsPmh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2pzaWV2ZTwvdXJsPgotICA8aW5jZXB0aW9uWWVhcj4yMDA0PC9pbmNlcHRpb25ZZWFyPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZTwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZS1tYWlsZXQ8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1qc2lldmUtdXRpbDwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLW1haWxldDwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLW1haWxldC1iYXNlPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1taW1lNGo8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5tYWlsPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWFpbDwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5hY3RpdmF0aW9uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPiAgICAKLSAgICA8cGx1Z2lucz4KLQotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9hc3NlbWJsZS88L2Rlc2NyaXB0b3JTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT5nbnU8L3RhckxvbmdGaWxlTW9kZT4gCi0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4gPCEtLSBhcHBlbmQgdG8gdGhlIHBhY2thZ2luZyBwaGFzZS4gLS0+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYXNzZW1ibGUvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi90cnVuay9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3MTQ5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTxhc3NlbWJseT4KLSAgPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyAgT0YgQU5ZIEtJTkQsIGVpdGhlciAgZXhwcmVzcyAgb3IKLSAgaW1wbGllZC4KLSAgCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotICA8aWQ+YmluPC9pZD4KLSAgPCEtLSAKLSAgR2VuZXJhdGVzIGEgamFyIGZpbGUgaW5jbHVkaW5nIHRoZSBiaW5hcnkgamFyIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMuCi0gIGluY2x1ZGluZyBOT1RJQ0UgYW5kIExJQ0VOU0UgaW4gdGhlIHJvb3QuCi0gIC0tPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi48L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLio8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPk5PVElDRS4qPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5SRUxFQVNFX05PVEVTLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vbWFpbGV0L3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmFwYWNoZS1qc2lldmUqLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vdXRpbC90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5hcGFjaGUtanNpZXZlKi5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL21haW4vdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+YXBhY2hlLWpzaWV2ZSouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi90YXJnZXQvc2l0ZS9hcGlkb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9hcGlkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4uLi9zdGFnZS9qYXZheC5hY3RpdmF0aW9uL2phcnMvPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+YWN0aXZhdGlvbi5MSUNFTlNFPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5Pi4uL3N0YWdlL2phdmF4Lm1haWwvamFycy88L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5tYWlsLkxJQ0VOU0U8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliLzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5hcGFjaGUtanNpZXZlKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9hc3NlbWJsZS9zcmMvYXNzZW1ibGUvc3JjLnhtbCBiL3RydW5rL2Fzc2VtYmxlL3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdhZjBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2Fzc2VtYmxlL3NyYy9hc3NlbWJsZS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPGFzc2VtYmx5PgotICA8IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TICBPRiBBTlkgS0lORCwgZWl0aGVyICBleHByZXNzICBvcgotICBpbXBsaWVkLgotICAKLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gIDxpZD5zcmM8L2lkPgotICA8IS0tIAotICBHZW5lcmF0ZXMgYSBmaWxlIGluY2x1ZGluZyBhbGwgdGhlIHNvdXJjZSB0cmVlIGV4Y2x1ZGluZyBmaWxlcy9mb2xkZXJzCi0gIHN0YXJ0aW5nIHdpdGggIi4iICwgKi5iYWsgYW5kIHRoZSB0YXJnZXQKLSAgLS0+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLjwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0LyoqPC9leGNsdWRlPgotICAgICAgICA8ZXhjbHVkZT4uKjwvZXhjbHVkZT4KLSAgICAgICAgPGV4Y2x1ZGU+LiovKio8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPioqLmJhazwvZXhjbHVkZT4KLSAgICAgICAgPGV4Y2x1ZGU+Ki5qYXI8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPioqL2phbWVzLXByb2plY3QvKio8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPioqL3NpdGUvKio8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPioqLy4qPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L0xJQ0VOU0UuYXBhY2hlIGIvdHJ1bmsvbWFpbGV0L0xJQ0VOU0UuYXBhY2hlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4YzU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9MSUNFTlNFLmFwYWNoZQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9OT1RJQ0UuYmFzZSBiL3RydW5rL21haWxldC9OT1RJQ0UuYmFzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhMDAxMS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvTk9USUNFLmJhc2UKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgPT0gICAgICBOT1RJQ0UgZmlsZSBmb3IgdXNlIHdpdGggdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCwgICAgICA9PQ0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gICBBcGFjaGUgSmFtZXMgSlNpZXZlIExpYnJhcnkNCi0gICBDb3B5cmlnaHQgMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi0NCi0gICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0DQotICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCi0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9idWlsZC54bWwgYi90cnVuay9tYWlsZXQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRkODlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0galNpZXZlIGJ1aWxkIGZpbGUgCi0KLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tPgotCi08cHJvamVjdCBuYW1lPSdqc2lldmUtbWFpbGV0JyBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLSAgICAgCi0gICAgPCEtLQotICAgIEdpdmUgdXNlciBhIGNoYW5jZSB0byBvdmVycmlkZSB3aXRob3V0IGVkaXRpbmcgdGhpcyBmaWxlCi0gICAgKGFuZCB3aXRob3V0IHR5cGluZyAtRCBlYWNoIHRpbWUgaGUgY29tcGlsZXMgaXQpCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9Ii5hbnQucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iLi4vaW5jbHVkZS5wcm9wZXJ0aWVzIiAvPgotICAgIDxwcm9wZXJ0eSBmaWxlPSIuLi9kZWZhdWx0LnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8cGF0aCBpZD0ibWFpbC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPScke21haWwuamFyfScgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPScke2FjdGl2YXRpb24uamFyfScgLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bG9nNGouamFyfSIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0nJHtsaWIuanNpZXZlLmRpcn0vJHtuYW1lfS0ke3ZlcnNpb259LmphcicgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haWxldC5qYXJ9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbGV0LWJhc2UuamFyfSIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21pbWU0ai5qYXJ9IiAvPgotICAgICAgICA8cGF0aCByZWZpZD0ibWFpbC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC5jbGFzc2VzfSIgLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8cGF0aCBpZD0icHJvamVjdC50ZXN0LmNsYXNzLnBhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzcy5wYXRoIiAvPgotICAgIDwvcGF0aD4KLQotICAgICA8aW1wb3J0IGZpbGU9Jy4uL2J1aWxkLnhtbCcvPgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icnVuLXRlc3RzIiBkZXNjcmlwdGlvbj0iIC0gbWFpbiB0YXJnZXQiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSIgZGVzY3JpcHRpb249IiAtIHBhcGFyYXRpb25zICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbF0iPgotICAgICAgICA8Q2hlY2tNYWlsQ29uZGl0aW9ucy8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9InByZXBhcmUiIGRlc2NyaXB0aW9uPSIgLSBjb21waWxlcyB0ZXN0IGFuZCBtYWluIHNvdXJjZSI+Ci0gICAgICAgIDxDb21waWxlTWFpbj4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtqYXZhLmRpcn0iIC8+Ci0gICAgICAgIDwvQ29tcGlsZU1haW4+Ci0gICAgICAgIDxDb21waWxlVGVzdHMvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSIgLSBqYXJzIGNsYXNzZXMiPgotICAgICAgICA8SmFyIG5hbWU9J21haWxldCcvPiAKLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzIiBkZXBlbmRzPSJqYXIiIGRlc2NyaXB0aW9uPSIgLSBydW5zIGFsbCB0ZXN0cyI+Ci0gICAgICAgIDxSdW5UZXN0cy8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iIC0gY2xlYW5zIGJ1aWxkIGZpbGVzIj4KLSAgICAgICAgPENsZWFuLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idXNhZ2UiIGRlc2NyaXB0aW9uPSIgLSBwcmludHMgaGVscCI+Ci0gICAgICAgIDxVc2FnZS8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvcG9tLnhtbCBiL3RydW5rL21haWxldC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzVjMDFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAgLS0+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+anNpZXZlLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4wLjQ8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFwYWNoZS1qc2lldmUtbWFpbGV0PC9hcnRpZmFjdElkPgotICA8bmFtZT5BcGFjaGUgSkFNRVMgalNpZXZlIE1haWxldDwvbmFtZT4KLSAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8ZGVzY3JpcHRpb24+Ci1BcGFjaGUgalNpZXZlIGlzIGEgc2VydmVyIHNpZGUgbWFpbCBmaWx0ZXJpbmcgc3lzdGVtIAotaW1wbGVtZW50aW5nIFJGQzMwMjguIEFwYWNoZSBqU2lldmUgaXMgZGV2ZWxvcGVkIGJ5IHRoZSAKLUpBTUVTIHByb2plY3QuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDx1cmw+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlPC91cmw+Ci0gIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPCEtLQotICAgIFRoZSB3ZWJzaXRlIGlzIGNvbW1pdHRlZCB0byBzdWJ2ZXJzaW9uLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBvdmVycmlkZW4KLSAgICB0byB1cGxvYWQgdGhlIHNpdGUgdG8gYSBsb2NhbCBzdGFnaW5nIGxvY2F0aW9uLgotICAgIEZvciBleGFtcGxlLCBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB+Ly5tMi9zZXR0aW5ncy54bWwgd2lsbCB1cGxvYWQKLSAgICB0byBsb2NhbGhvc3Q6Ci0gICAgCi0gICAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICA8aWQ+bWFpbjwvaWQ+Ci0gICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KLSAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgPGphbWVzLnd3dz5zY3A6Ly9sb2NhbGhvc3Qvd3d3PC9qYW1lcy53d3c+Ci0gICAgICAgICAgICAgIDxqYW1lcy53d3cuaWQ+bG9jYWxob3N0PC9qYW1lcy53d3cuaWQ+Ci0gICAgICAuLi4KLSAgICAtLT4KLSAgICA8IS0tIEdlbmVyYWwgbG9jYXRpb24gZm9yIHNpdGUgc3RhZ2UgLS0+Ci0gICAgPGphbWVzLnd3dz5zY3A6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvamFtZXMuYXBhY2hlLm9yZy88L2phbWVzLnd3dz4KLSAgICA8IS0tIFByb2plY3Qgc3BlY2lmaWMgbG9jYXRpb24sIGFsbG93aW5nIHNwZWNpZmljIG92ZXJyaWRlIC0tPgotICAgIDxqYW1lcy5qc2lldmUud3d3PiR7amFtZXMud3d3fS9qc2lldmUvPC9qYW1lcy5qc2lldmUud3d3PgotICAgIDwhLS0gT3ZlcnJpZGRpbmcgdGhpcyB2YWx1ZSBhbGxvd3Mgc2luZ2xlIHNldCBvZiBsb29wYmFjayBzZXR0aW5ncyB0byBiZSBtYWludGFpbmVkIC0tPgotICAgIDxqYW1lcy53d3cuaWQ+anNpZXZlLXdlYnNpdGU8L2phbWVzLnd3dy5pZD4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxzaXRlPgotICAgICAgPGlkPiR7amFtZXMud3d3LmlkfTwvaWQ+Ci0gICAgICA8dXJsPiR7amFtZXMuanNpZXZlLnd3d30vbWFpbGV0PC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLQotICA8aXNzdWVNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+SklSQTwvc3lzdGVtPgotICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRTwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2phbWVzL2pzaWV2ZS90YWdzL2pzaWV2ZS1wcm9qZWN0LTAuNDwvdXJsPgotICA8L3NjbT4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1qc2lldmU8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1tYWlsZXQ8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1tYWlsZXQtYmFzZTwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5hcGFjaGUtbWltZTRqPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYWlsPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4LmFjdGl2YXRpb248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5hY3RpdmF0aW9uPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+am1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qbW9jazwvYXJ0aWZhY3RJZD4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgPC9yZXNvdXJjZT4KLSAgICA8L3Jlc291cmNlcz4KLSAgICAKLSAgICA8cGx1Z2lucz4gICAgIAotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgIAk8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgCTxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZG9hcC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLW1haWxldGRvY3MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjE8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+IAotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sPC9ydWxlc2V0PgotICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgPGZvcm1hdD54bWw8L2Zvcm1hdD4KLSAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgPHNvdXJjZUVuY29kaW5nPnV0Zi04PC9zb3VyY2VFbmNvZGluZz4KLSAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC1iZXRhLTc8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMzwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgPGV4Y2x1ZGU+Tk9USUNFLmJhc2U8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5MSUNFTlNFLmFwYWNoZTwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPnJlbGVhc2UucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD50YWdsaXN0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLSAgCi0gIDxtYWlsaW5nTGlzdHM+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+QXBhY2hlIEphbWVzIFVzZXI8L25hbWU+Ci0gICAgICA8c3Vic2NyaWJlPnNlcnZlci11c2VyLXN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICA8dW5zdWJzY3JpYmU+c2VydmVyLXVzZXItdW5zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICA8cG9zdD5zZXJ2ZXItdXNlckBqYW1lcy5hcGFjaGUub3JnPC9wb3N0PgotICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9qYW1lcy1zZXJ2ZXItdXNlci88L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICA8bmFtZT5BcGFjaGUgSmFtZXMgRGV2ZWxvcGVyPC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5zZXJ2ZXItZGV2LXN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICA8dW5zdWJzY3JpYmU+c2VydmVyLWRldi11bnN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgIDxwb3N0PnNlcnZlci1kZXZAamFtZXMuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvamFtZXMtc2VydmVyLWRldi88L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgPC9tYWlsaW5nTGlzdHM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9BY3Rpb25Db250ZXh0LmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvQWN0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E5NGY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9BY3Rpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbEFkZHJlc3M7Ci0KLS8qKgotICogUHJvdmlkZXMgY29udGV4dCBmb3IgYWN0aW9uIGV4ZWN1dGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpb25Db250ZXh0IHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2cuCi0gICAgICogQHJldHVybiBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBMb2cgZ2V0TG9nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXhwZXJpbWVudGFsIG1haWwgZGVsaXZlcnkuIAotICAgICAqIFBPU1QgdmVyYiBpbmRpY2F0ZSB0aGF0IG1haWwgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICogaW5kaWNhdGVkIGJ5IHRoZSBnaXZlbiBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBpbmRpY2F0ZXMgdGhlIGRlc3RpbmF0aW9uIHRvIHdoaWNoIHRoZSBtYWlsIHRvIGFkZGVkLiBBVE0gCi0gICAgICogdGhlIHZhbHVlIHNob3VsZCBiZSBtYWlsYm94Oi8vPHVzZXI+QGxvY2FsaG9zdC88bWFpbGJveC1wYXRoPgotICAgICAqIEBwYXJhbSBtYWlsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdChTdHJpbmcgdXJpLCBNaW1lTWVzc2FnZSBtYWlsKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUG9zdHMgdGhlIGdpdmVuIG1haWwuCi0gICAgICogQHBhcmFtIHNlbmRlciBwb3NzaWJseSBudWxsCi0gICAgICogQHBhcmFtIHJlY2lwaWVudHMgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gbWFpbCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHdoZW4gbWFpbCBjYW5ub3QgYmUgcG9zdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdChNYWlsQWRkcmVzcyBzZW5kZXIsIENvbGxlY3Rpb248TWFpbEFkZHJlc3M+IHJlY2lwaWVudHMsIE1pbWVNZXNzYWdlIG1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIG5hbWUgKGluY2x1ZGluZyB2ZXJzaW9uKSBvZiB0aGlzIHNlcnZlci4KLSAgICAgKiBAcmV0dXJuIG5vdCBudWwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluZm8oKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9BY3Rpb25EaXNwYXRjaGVyLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvQWN0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U2MDRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9BY3Rpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uS2VlcDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlZGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uUmVqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0Lk1haWw7Ci0KLS8qKgotICogRHluYW1pY2FsbHkgZGlzcGF0Y2hlcyBhbiBBY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIEFjdGlvbiByZWNlaXZlZCBhdCBydW50aW1lLiAKLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPkFuIGluc3RhbmNlIG1heWJlIHNhZmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGlzcGF0Y2hlcgoteyAgIAotICAgIC8qKgotICAgICAqIEEgTWFwIGtleWVkIGJ5IHRoZSB0eXBlIG9mIEFjdGlvbi4gVGhlIHZhbHVlcyBhcmUgdGhlIG1ldGhvZHMgdG8gaW52b2tlIHRvIAotICAgICAqIGhhbmRsZSB0aGUgQWN0aW9uLgotICAgICAqIDxBY3Rpb24sIE1haWxBY3Rpb24+Ci0gICAgICovIAotICAgIHByaXZhdGUgQ29uY3VycmVudE1hcDxDbGFzcywgTWFpbEFjdGlvbj4gZmllbGRNYWlsQWN0aW9uTWFwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFjdGlvbkRpc3BhdGNoZXIuCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0gICAgICovCi0gICAgcHVibGljIEFjdGlvbkRpc3BhdGNoZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXRNZXRob2RNYXAoZGVmYXVsdE1ldGhvZE1hcCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZXhlY3V0ZSBleGVjdXRlcyB0aGUgcGFzc2VkIEFjdGlvbiBieSBpbnZva2luZyB0aGUgbWV0aG9kIG1hcHBlZCBieSB0aGUKLSAgICAgKiByZWNlaXZlciB3aXRoIGEgcGFyYW1ldGVyIG9mIHRoZSBFWEFDVCB0eXBlIG9mIEFjdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5BY3Rpb24gbm90IG51bGwKLSAgICAgKiBAcGFyYW0gYU1haWwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBBY3Rpb24gYW5BY3Rpb24sIGZpbmFsIE1haWwgYU1haWwsIGZpbmFsIEFjdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTWFpbEFjdGlvbiBtYWlsQWN0aW9uID0gZ2V0TWV0aG9kTWFwKCkuZ2V0KGFuQWN0aW9uLmdldENsYXNzKCkpOwotICAgICAgICBtYWlsQWN0aW9uLmV4ZWN1dGUoYW5BY3Rpb24sIGFNYWlsLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRob2RNYXAuCi0gICAgICogQHJldHVybiBNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uY3VycmVudE1hcDxDbGFzcywgTWFpbEFjdGlvbj4gZ2V0TWV0aG9kTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWVsZE1haWxBY3Rpb25NYXA7Ci0gICAgfSAgICAKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgbWV0aG9kTWFwLgotICAgICAqIEByZXR1cm4gTWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPENsYXNzLCBNYWlsQWN0aW9uPiBkZWZhdWx0TWV0aG9kTWFwKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbmN1cnJlbnRNYXA8Q2xhc3MsIE1haWxBY3Rpb24+IGFjdGlvbk1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzcywgTWFpbEFjdGlvbj4oNCk7Ci0gICAgICAgIGFjdGlvbk1hcC5wdXQoQWN0aW9uRmlsZUludG8uY2xhc3MsIG5ldyBGaWxlSW50b0FjdGlvbigpKTsKLSAgICAgICAgYWN0aW9uTWFwLnB1dChBY3Rpb25LZWVwLmNsYXNzLCBuZXcgS2VlcEFjdGlvbigpKTsKLSAgICAgICAgYWN0aW9uTWFwLnB1dChBY3Rpb25SZWRpcmVjdC5jbGFzcywgbmV3IFJlZGlyZWN0QWN0aW9uKCkpOwotICAgICAgICBhY3Rpb25NYXAucHV0KEFjdGlvblJlamVjdC5jbGFzcywgbmV3IFJlamVjdEFjdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbk1hcDsKLSAgICB9ICAgIAotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFpbCBhY3Rpb24gbWFpbC4KLSAgICAgKiBAcGFyYW0gbWFpbEFjdGlvbk1hcCA8QWN0aW9uLCBNYWlsQWN0aW9uPiBub3QgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1ldGhvZE1hcChDb25jdXJyZW50TWFwPENsYXNzLCBNYWlsQWN0aW9uPiAgbWFpbEFjdGlvbk1hcCkKLSAgICB7Ci0gICAgICAgIGZpZWxkTWFpbEFjdGlvbk1hcCA9IG1haWxBY3Rpb25NYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0FjdGlvblV0aWxzLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvQWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmM2NmMy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvQWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0OwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsOwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0Lk1haWxBZGRyZXNzOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBoZWxwZnVsIGZvciBhY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uVXRpbHMKLXsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX1BSRUZJWCA9IEFjdGlvblV0aWxzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLiI7Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHRoZSBzb2xlIGludGVuZGVkIHJlY2lwaWVudCBmb3IgYU1haWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFNYWlsCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFpbEFkZHJlc3MgZ2V0U29sZVJlY2lwaWVudChNYWlsIGFNYWlsKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoYU1haWwuZ2V0UmVjaXBpZW50cygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkludmFsaWQgbnVtYmVyIG9mIHJlY2lwaWVudHMgLSAwIgotICAgICAgICAgICAgICAgICAgICArICIuIEV4YWN0bHkgMSByZWNpcGllbnQgaXMgZXhwZWN0ZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoMSAhPSBhTWFpbC5nZXRSZWNpcGllbnRzKCkuc2l6ZSgpKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiSW52YWxpZCBudW1iZXIgb2YgcmVjaXBpZW50cyAtICIKLSAgICAgICAgICAgICAgICAgICAgKyBuZXcgSW50ZWdlcihhTWFpbC5nZXRSZWNpcGllbnRzKCkuc2l6ZSgpKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICsgIi4gRXhhY3RseSAxIHJlY2lwaWVudCBpcyBleHBlY3RlZC4iKTsKLSAgICAgICAgcmV0dXJuIChNYWlsQWRkcmVzcykgYU1haWwuZ2V0UmVjaXBpZW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVjdCBhbmQgaGFuZGxlIGxvY2FsbHkgbG9vcGluZyBtYWlsLiBFeHRlcm5hbCBsb29wIGRldGVjdGlvbiBpcyBsZWZ0Ci0gICAgICogdG8gdGhlIE1UQS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYU1haWwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBhbkF0dHJpYnV0ZVN1ZmZpeAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRldGVjdEFuZEhhbmRsZUxvY2FsTG9vcGluZyhNYWlsIGFNYWlsLCBBY3Rpb25Db250ZXh0IGNvbnRleHQsIFN0cmluZyBhbkF0dHJpYnV0ZVN1ZmZpeCkKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1haWxBZGRyZXNzIHRoaXNSZWNpcGllbnQgPSBnZXRTb2xlUmVjaXBpZW50KGFNYWlsKTsKLSAgICAgICAgTWFpbEFkZHJlc3MgbGFzdFJlY2lwaWVudCA9IChNYWlsQWRkcmVzcykgYU1haWwKLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUkVGSVggKyBhbkF0dHJpYnV0ZVN1ZmZpeCk7Ci0gICAgICAgIGlmIChudWxsICE9IGxhc3RSZWNpcGllbnQgJiYgbGFzdFJlY2lwaWVudC5lcXVhbHModGhpc1JlY2lwaWVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCA9IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGlzIG1lc3NhZ2UgaXMgbG9vcGluZyEgTWVzc2FnZSBJRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYU1haWwuZ2V0TWVzc2FnZSgpLmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9nKCkud2FybihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9Ci0gICAgICAgIGFNYWlsLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJFRklYICsgYW5BdHRyaWJ1dGVTdWZmaXgsCi0gICAgICAgICAgICAgICAgdGhpc1JlY2lwaWVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0NvbW1vbnNMb2dnaW5nQWRhcHRlci5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0NvbW1vbnNMb2dnaW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDlhMGQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9Db21tb25zTG9nZ2luZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuYmFzZS5HZW5lcmljTWFpbGV0OwotCi0vKioKLSAqIEFkYXB0cyBjb21tb25zIGxvZ2dpbmcgdG8gbWFpbGV0IGxvZ2dpbmcuCi0gKi8KLWNsYXNzIENvbW1vbnNMb2dnaW5nQWRhcHRlciBpbXBsZW1lbnRzIExvZyB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBQ0UgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFUQUwgPSAxOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgR2VuZXJpY01haWxldCBtYWlsZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGV2ZWw7Ci0gICAgCi0gICAgcHVibGljIENvbW1vbnNMb2dnaW5nQWRhcHRlcihmaW5hbCBHZW5lcmljTWFpbGV0IG1haWxldCwgZmluYWwgaW50IGxldmVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubWFpbGV0ID0gbWFpbGV0OwotICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVidWcoT2JqZWN0IG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1haWxldC5sb2cobWVzc2FnZSA9PSBudWxsID8gIk5VTEwiIDogbWVzc2FnZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYnVnKE9iamVjdCBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbWFpbGV0LmxvZyhtZXNzYWdlID09IG51bGwgPyAiTlVMTCIgOiBtZXNzYWdlLnRvU3RyaW5nKCksIHQpOwotICAgICAgICB9IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVycm9yKE9iamVjdCBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChpc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtYWlsZXQubG9nKG1lc3NhZ2UgPT0gbnVsbCA/ICJOVUxMIiA6IG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKGlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1haWxldC5sb2cobWVzc2FnZSA9PSBudWxsID8gIk5VTEwiIDogbWVzc2FnZS50b1N0cmluZygpLCB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhdGFsKE9iamVjdCBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChpc0ZhdGFsRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtYWlsZXQubG9nKG1lc3NhZ2UgPT0gbnVsbCA/ICJOVUxMIiA6IG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmYXRhbChPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKGlzRmF0YWxFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1haWxldC5sb2cobWVzc2FnZSA9PSBudWxsID8gIk5VTEwiIDogbWVzc2FnZS50b1N0cmluZygpLCB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluZm8oT2JqZWN0IG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKGlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbWFpbGV0LmxvZyhtZXNzYWdlID09IG51bGwgPyAiTlVMTCIgOiBtZXNzYWdlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5mbyhPYmplY3QgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKGlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbWFpbGV0LmxvZyhtZXNzYWdlID09IG51bGwgPyAiTlVMTCIgOiBtZXNzYWdlLnRvU3RyaW5nKCksIHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBsZXZlbCA8PSBERUJVRzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGxldmVsIDw9IEVSUk9SOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWxFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbGV2ZWwgPD0gRkFUQUw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmZvRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGxldmVsIDw9IElORk87Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBsZXZlbCA8PSBUUkFDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dhcm5FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbGV2ZWwgPD0gV0FSTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0cmFjZShPYmplY3QgbWVzc2FnZSkgewotICAgICAgICBpZiAoaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbWFpbGV0LmxvZyhtZXNzYWdlID09IG51bGwgPyAiTlVMTCIgOiBtZXNzYWdlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmIChpc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtYWlsZXQubG9nKG1lc3NhZ2UgPT0gbnVsbCA/ICJOVUxMIiA6IG1lc3NhZ2UudG9TdHJpbmcoKSwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3YXJuKE9iamVjdCBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChpc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1haWxldC5sb2cobWVzc2FnZSA9PSBudWxsID8gIk5VTEwiIDogbWVzc2FnZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm4oT2JqZWN0IG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmIChpc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1haWxldC5sb2cobWVzc2FnZSA9PSBudWxsID8gIk5VTEwiIDogbWVzc2FnZS50b1N0cmluZygpLCB0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9GaWxlSW50b0FjdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0ZpbGVJbnRvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzQ1OTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0ZpbGVJbnRvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0OwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0Lk1haWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbEFkZHJlc3M7Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIGZpbGluZyBvZiBhIG1haWwgaW50byBhIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4gCi0gKiA8aDQ+VGhyZWFkIFNhZmV0eTwvaDQ+Ci0gKiA8cD5BbiBpbnN0YW5jZSBtYXliZSBzYWZlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSBieSBtdWx0aXBsZSB0aHJlYWRzLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVJbnRvQWN0aW9uIGltcGxlbWVudHMgTWFpbEFjdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBISUVSQVJDSFlfREVMSU1JVEVSID0gJy4nOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb24gYWN0aW9uLCBNYWlsIG1haWwsIEFjdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25GaWxlSW50bykgewotICAgICAgICAgICAgZmluYWwgQWN0aW9uRmlsZUludG8gZmlsZUludG9BY3Rpb24gPSAoQWN0aW9uRmlsZUludG8pIGFjdGlvbjsKLSAgICAgICAgICAgIGV4ZWN1dGUoZmlsZUludG9BY3Rpb24sIG1haWwsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRXhlY3V0ZXMgdGhlIHBhc3NlZCBBY3Rpb25GaWxlSW50by4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGFueSBkZXN0aW5hdGlvbiB3aXRoIHRoZSByb290IG9mIDxjb2RlPklOQk9YPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgdGhlIGN1cnJlbnQgUE9QMyBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzdWItZm9sZGVycywgdGhlIG1haWwgaXMKLSAgICAgKiBzdG9yZWQgaW4gdGhlIElOQk9YIGZvciB0aGUgcmVjaXBpZW50IG9mIHRoZSBtYWlsIGFuZCB0aGUgZnVsbCBpbnRlbmRlZAotICAgICAqIGRlc3RpbmF0aW9uIGFkZGVkIGFzIGEgcHJlZml4IHRvIHRoZSBtZXNzYWdlJ3Mgc3ViamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBJTUFQIHN1cHBvcnQgaXMgYWRkZWQgdG8gSmFtZXMsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gc3VwcG9ydAotICAgICAqIHN1Yi1mb2xkZXJzIG9mIDxjb2RlPklOQk9YPC9jb2RlPiBmdWxseS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGFuQWN0aW9uCi0gICAgICogQHBhcmFtIGFNYWlsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25GaWxlSW50byBhbkFjdGlvbiwgTWFpbCBhTWFpbCwgZmluYWwgQWN0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25NYWlsYm94ID0gYW5BY3Rpb24uZ2V0RGVzdGluYXRpb24oKTsKLSAgICAgICAgTWFpbEFkZHJlc3MgcmVjaXBpZW50OwotICAgICAgICBib29sZWFuIGRlbGl2ZXJlZCA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmVjaXBpZW50ID0gQWN0aW9uVXRpbHMuZ2V0U29sZVJlY2lwaWVudChhTWFpbCk7Ci0gICAgICAgICAgICBNaW1lTWVzc2FnZSBsb2NhbE1lc3NhZ2UgPSBjcmVhdGVNaW1lTWVzc2FnZShhTWFpbCwgcmVjaXBpZW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCEoZGVzdGluYXRpb25NYWlsYm94Lmxlbmd0aCgpID4gMCAKLSAgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25NYWlsYm94LmNoYXJBdCgwKSA9PSBISUVSQVJDSFlfREVMSU1JVEVSKSkgewotICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uTWFpbGJveCA9ICBISUVSQVJDSFlfREVMSU1JVEVSICsgZGVzdGluYXRpb25NYWlsYm94OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFpbGJveCA9IGRlc3RpbmF0aW9uTWFpbGJveC5yZXBsYWNlKEhJRVJBUkNIWV9ERUxJTUlURVIsICcvJyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdDsKLSAgICAgICAgICAgIGlmIChtYWlsYm94LmNoYXJBdCgwKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBob3N0ID0gIkBsb2NhbGhvc3QiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBob3N0ID0gIkBsb2NhbGhvc3QvIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSAibWFpbGJveDovLyIgKyByZWNpcGllbnQuZ2V0VXNlcigpICsgaG9zdCArIG1haWxib3g7Ci0gICAgICAgICAgICAvL1RPRE86IGNvcHlpbmcgdGhpcyBtZXNzYWdlIHNvIG1hbnkgdGltZXMgc2VlbXMgYSB3YXN0ZQotICAgICAgICAgICAgY29udGV4dC5wb3N0KHVybCwgbG9jYWxNZXNzYWdlKTsKLSAgICAgICAgICAgIGRlbGl2ZXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTG9nIGxvZyA9IGNvbnRleHQuZ2V0TG9nKCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVycm9yIHdoaWxlIHN0b3JpbmcgbWFpbCBpbnRvLiAiK2Rlc3RpbmF0aW9uTWFpbGJveCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIG1haWwgaXMgYWx3YXlzIGdob3N0ZWQKLSAgICAgICAgICAgIGFNYWlsLnNldFN0YXRlKE1haWwuR0hPU1QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWxpdmVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExvZyBsb2cgPSBjb250ZXh0LmdldExvZygpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGaWxlZCBNZXNzYWdlIElEOiAiCi0gICAgICAgICAgICAgICAgICAgICsgYU1haWwuZ2V0TWVzc2FnZSgpLmdldE1lc3NhZ2VJRCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBpbnRvIGRlc3RpbmF0aW9uOiBcIiIKLSAgICAgICAgICAgICAgICAgICAgKyBkZXN0aW5hdGlvbk1haWxib3ggKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBNaW1lTWVzc2FnZSBjcmVhdGVNaW1lTWVzc2FnZShNYWlsIGFNYWlsLCBNYWlsQWRkcmVzcyByZWNpcGllbnQpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICAvLyBBZGFwdGVkIGZyb20gTG9jYWxEZWxpdmVyeSBNYWlsZXQKLSAgICAgICAgLy8gQWRkIHFtYWlsJ3MgZGUgZmFjdG8gc3RhbmRhcmQgRGVsaXZlcmVkLVRvIGhlYWRlcgotICAgICAgICBNaW1lTWVzc2FnZSBsb2NhbE1lc3NhZ2UgPSBuZXcgTWltZU1lc3NhZ2UoYU1haWwuZ2V0TWVzc2FnZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWFkZXJzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChnZXRNZXNzYWdlSUQoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzdXBlci51cGRhdGVIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsb2NhbE1lc3NhZ2UuYWRkSGVhZGVyKCJEZWxpdmVyZWQtVG8iLCByZWNpcGllbnQudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbG9jYWxNZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIHJldHVybiBsb2NhbE1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0tlZXBBY3Rpb24uamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9LZWVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDQyYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L0tlZXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldDsKLQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25GaWxlSW50bzsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbktlZXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbDsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgZmlsaW5nIG9mIGEgbWFpbCBpbnRvIHRoZSBpbmJveC4gCi0gKiA8aDQ+VGhyZWFkIFNhZmV0eTwvaDQ+Ci0gKiA8cD5BbiBpbnN0YW5jZSBtYXliZSBzYWZlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSBieSBtdWx0aXBsZSB0aHJlYWRzLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEtlZXBBY3Rpb24gZXh0ZW5kcyBGaWxlSW50b0FjdGlvbiBpbXBsZW1lbnRzIE1haWxBY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkJPWCA9ICJJTkJPWCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbiBhY3Rpb24sIE1haWwgbWFpbCwgQWN0aW9uQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25LZWVwKSB7Ci0gICAgICAgICAgICBmaW5hbCBBY3Rpb25LZWVwIGFjdGlvbktlZXAgPSAoQWN0aW9uS2VlcCkgYWN0aW9uOwotICAgICAgICAgICAgZXhlY3V0ZShhY3Rpb25LZWVwLCBtYWlsLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEV4ZWN1dGVzIHRoZSBwYXNzZWQgQWN0aW9uS2VlcC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgImtlZXAiIGlzIGVxdWl2YWxlbnQgdG8gImZpbGVpbnRvIiB3aXRoIGEKLSAgICAgKiBkZXN0aW5hdGlvbiBvZiAiSU5CT1giLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5BY3Rpb24gbm90IG51bGwKLSAgICAgKiBAcGFyYW0gYU1haWwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25LZWVwIGFuQWN0aW9uLCBNYWlsIGFNYWlsLCBBY3Rpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFjdGlvbkZpbGVJbnRvIGFjdGlvbiA9IG5ldyBBY3Rpb25GaWxlSW50byhJTkJPWCk7Ci0gICAgICAgIGV4ZWN1dGUoYWN0aW9uLCBhTWFpbCwgY29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L01haWxBY3Rpb24uamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9NYWlsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTVkYzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L01haWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldDsKLQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbDsKLQotLyoqCi0gKiBFeGVjdXRlcyBhIFNpZXZlIGFjdGlvbi4KLSAqIEltcGxlbWVudGF0aW9ucyBtYXkgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFpbEFjdGlvbiB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gYWN0aW9uIG5vdCBudWxsCi0gICAgICogQHBhcmFtIG1haWwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHdoZW4gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQWN0aW9uIGFjdGlvbiwgZmluYWwgTWFpbCBtYWlsLCBmaW5hbCBBY3Rpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvUG9zdGVyLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvUG9zdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OWNmMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1Bvc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlOwotCi0vKioKLSAqIEV4cGVyaW1lbnRhbCBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9zdGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHBlcmltZW50YWwgbWFpbCBkZWxpdmVyeS4gCi0gICAgICogUE9TVCB2ZXJiIGluZGljYXRlIHRoYXQgbWFpbCBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIGNvbGxlY3Rpb24KLSAgICAgKiBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gdG8gd2hpY2ggdGhlIG1haWwgdG8gYWRkZWQuIEFUTSAKLSAgICAgKiB0aGUgdmFsdWUgc2hvdWxkIGJlIG1haWxib3g6Ly88dXNlcj5AbG9jYWxob3N0LzxtYWlsYm94LXBhdGg+Ci0gICAgICogQHBhcmFtIG1haWwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0KFN0cmluZyB1cmksIE1pbWVNZXNzYWdlIG1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvUmVkaXJlY3RBY3Rpb24uamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9SZWRpcmVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjhlZDgzLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9SZWRpcmVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuSW50ZXJuZXRBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uUmVkaXJlY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsQWRkcmVzczsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgcmVkaXJlY3Rpb24gb2YgYSBtYWlsLiAKLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPkFuIGluc3RhbmNlIG1heWJlIHNhZmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVkaXJlY3RBY3Rpb24gaW1wbGVtZW50cyBNYWlsQWN0aW9uIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQWN0aW9uIGFjdGlvbiwgTWFpbCBtYWlsLCBBY3Rpb25Db250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvblJlZGlyZWN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBBY3Rpb25SZWRpcmVjdCBhY3Rpb25SZWRpcmVjdCA9IChBY3Rpb25SZWRpcmVjdCkgYWN0aW9uOwotICAgICAgICAgICAgZXhlY3V0ZShhY3Rpb25SZWRpcmVjdCwgbWFpbCwgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBleGVjdXRlIGV4ZWN1dGVzIHRoZSBwYXNzZWQgQWN0aW9uUmVkaXJlY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFuQWN0aW9uIG5vdCBudWwKLSAgICAgKiBAcGFyYW0gYU1haWwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShBY3Rpb25SZWRpcmVjdCBhbkFjdGlvbiwgTWFpbCBhTWFpbCwgQWN0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBY3Rpb25VdGlscy5kZXRlY3RBbmRIYW5kbGVMb2NhbExvb3BpbmcoYU1haWwsIGNvbnRleHQsICJyZWRpcmVjdCIpOwotICAgICAgICBDb2xsZWN0aW9uPE1haWxBZGRyZXNzPiByZWNpcGllbnRzID0gbmV3IEFycmF5TGlzdDxNYWlsQWRkcmVzcz4oMSk7Ci0gICAgICAgIHJlY2lwaWVudHMuYWRkKG5ldyBNYWlsQWRkcmVzcyhuZXcgSW50ZXJuZXRBZGRyZXNzKGFuQWN0aW9uLmdldEFkZHJlc3MoKSkpKTsKLSAgICAgICAgTWFpbEFkZHJlc3Mgc2VuZGVyID0gYU1haWwuZ2V0U2VuZGVyKCk7Ci0gICAgICAgIGNvbnRleHQucG9zdChzZW5kZXIsIHJlY2lwaWVudHMsIGFNYWlsLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGFNYWlsLnNldFN0YXRlKE1haWwuR0hPU1QpOwotICAgICAgICBMb2cgbG9nID0gY29udGV4dC5nZXRMb2coKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJlZGlyZWN0ZWQgTWVzc2FnZSBJRDogIgotICAgICAgICAgICAgICAgICsgYU1haWwuZ2V0TWVzc2FnZSgpLmdldE1lc3NhZ2VJRCgpICsgIiB0byBcIiIKLSAgICAgICAgICAgICAgICArIGFuQWN0aW9uLmdldEFkZHJlc3MoKSArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1JlamVjdEFjdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1JlamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmIxMDk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9SZWplY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgubWFpbC5BZGRyZXNzOwotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuSW50ZXJuZXRBZGRyZXNzOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25SZWplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuLkFjdGlvbk1vZGVBdXRvbWF0aWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbi5EaXNwb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuLkRpc3Bvc2l0aW9uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbi5NRE5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG4uTW9kaWZpZXJFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuLlNlbmRpbmdNb2RlQXV0b21hdGljOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG4uVHlwZURlbGV0ZWQ7Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIHJlamVjdGlvbiBvZiBhIG1haWwsIHdpdGggYSByZXBseSB0byB0aGUgc2VuZGVyLiAKLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPkFuIGluc3RhbmNlIG1heWJlIHNhZmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVqZWN0QWN0aW9uIGltcGxlbWVudHMgTWFpbEFjdGlvbiB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvbiBhY3Rpb24sIE1haWwgbWFpbCwgQWN0aW9uQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25SZWplY3QpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjdGlvblJlamVjdCBhY3Rpb25SZWplY3QgPSAoQWN0aW9uUmVqZWN0KSBhY3Rpb247Ci0gICAgICAgICAgICBleGVjdXRlKGFjdGlvblJlamVjdCwgbWFpbCwgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBleGVjdXRlIGV4ZWN1dGVzIHRoZSBwYXNzZWQgQWN0aW9uUmVqZWN0LiBJdCBzZW5kcyBhbiBSRkMgMjA5OAotICAgICAqIGNvbXBsaWFudCByZWplY3QgTUROIGJhY2sgdG8gdGhlIHNlbmRlci4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTk9URTogVGhlIE1pbWVjb250ZW50IHR5cGUgc2hvdWxkIGJlICdyZXBvcnQnLCBidXQgYXMgd2UgZG8gbm90IHlldCBoYXZlCi0gICAgICogYSBEYXRhSGFuZGxlciBmb3IgdGhpcyB5ZXQsIGl0cyBjdXJyZW50bHkgJ3RleHQnIQotICAgICAqIAotICAgICAqIEBwYXJhbSBhbkFjdGlvbiBub3QgbnVsbAotICAgICAqIEBwYXJhbSBhTWFpbCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICogQHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFjdGlvblJlamVjdCBhbkFjdGlvbiwgTWFpbCBhTWFpbCwgQWN0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBY3Rpb25VdGlscy5kZXRlY3RBbmRIYW5kbGVMb2NhbExvb3BpbmcoYU1haWwsIGNvbnRleHQsICJyZWplY3QiKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIE1ETiBwYXJ0Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgaHVtYW5UZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKLSAgICAgICAgaHVtYW5UZXh0LmFwcGVuZCgiVGhpcyBtZXNzYWdlIHdhcyByZWZ1c2VkIGJ5IHRoZSByZWNpcGllbnQncyBtYWlsIGZpbHRlcmluZyBwcm9ncmFtLiIpOwotICAgICAgICBodW1hblRleHQuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgIGh1bWFuVGV4dC5hcHBlbmQoIlRoZSByZWFzb24gZ2l2ZW4gd2FzOiIpOwotICAgICAgICBodW1hblRleHQuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgIGh1bWFuVGV4dC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgaHVtYW5UZXh0LmFwcGVuZChhbkFjdGlvbi5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIFN0cmluZyByZXBvcnRpbmdfVUFfbmFtZSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXBvcnRpbmdfVUFfbmFtZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxIb3N0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb3J0aW5nX1VBX25hbWUgPSAibG9jYWxob3N0IjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXBvcnRpbmdfVUFfcHJvZHVjdCA9IGNvbnRleHQuZ2V0U2VydmVySW5mbygpOwotCi0gICAgICAgIFN0cmluZ1tdIG9yaWdpbmFsUmVjaXBpZW50cyA9IGFNYWlsLmdldE1lc3NhZ2UoKS5nZXRIZWFkZXIoCi0gICAgICAgICAgICAgICAgIk9yaWdpbmFsLVJlY2lwaWVudCIpOwotICAgICAgICBTdHJpbmcgb3JpZ2luYWxfcmVjaXBpZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gb3JpZ2luYWxSZWNpcGllbnRzICYmIG9yaWdpbmFsUmVjaXBpZW50cy5sZW5ndGggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcmlnaW5hbF9yZWNpcGllbnQgPSBvcmlnaW5hbFJlY2lwaWVudHNbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBNYWlsQWRkcmVzcyBzb2xlUmVjaXBpZW50ID0gQWN0aW9uVXRpbHMuZ2V0U29sZVJlY2lwaWVudChhTWFpbCk7Ci0gICAgICAgIFN0cmluZyBmaW5hbF9yZWNpcGllbnQgPSBzb2xlUmVjaXBpZW50LnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsX21lc3NhZ2VfaWQgPSBhTWFpbC5nZXRNZXNzYWdlKCkuZ2V0TWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgRGlzcG9zaXRpb25Nb2RpZmllciBtb2RpZmllcnNbXSA9IHtuZXcgTW9kaWZpZXJFcnJvcigpfTsKLSAgICAgICAgRGlzcG9zaXRpb24gZGlzcG9zaXRpb24gPSBuZXcgRGlzcG9zaXRpb24obmV3IEFjdGlvbk1vZGVBdXRvbWF0aWMoKSwKLSAgICAgICAgICAgICAgICBuZXcgU2VuZGluZ01vZGVBdXRvbWF0aWMoKSwgbmV3IFR5cGVEZWxldGVkKCksIG1vZGlmaWVycyk7Ci0KLSAgICAgICAgTWltZU11bHRpcGFydCBtdWx0aVBhcnQgPSBNRE5GYWN0b3J5LmNyZWF0ZShodW1hblRleHQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICByZXBvcnRpbmdfVUFfbmFtZSwgcmVwb3J0aW5nX1VBX3Byb2R1Y3QsIG9yaWdpbmFsX3JlY2lwaWVudCwKLSAgICAgICAgICAgICAgICBmaW5hbF9yZWNpcGllbnQsIG9yaWdpbmFsX21lc3NhZ2VfaWQsIGRpc3Bvc2l0aW9uKTsKLQotICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlCi0gICAgICAgIE1pbWVNZXNzYWdlIHJlcGx5ID0gKE1pbWVNZXNzYWdlKSBhTWFpbC5nZXRNZXNzYWdlKCkucmVwbHkoZmFsc2UpOwotICAgICAgICByZXBseS5zZXRGcm9tKHNvbGVSZWNpcGllbnQudG9JbnRlcm5ldEFkZHJlc3MoKSk7Ci0gICAgICAgIHJlcGx5LnNldENvbnRlbnQobXVsdGlQYXJ0KTsKLSAgICAgICAgcmVwbHkuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgQWRkcmVzc1tdIHJlY2lwaWVudEFkZHJlc3NlcyA9IHJlcGx5LmdldEFsbFJlY2lwaWVudHMoKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcmVjaXBpZW50QWRkcmVzc2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPE1haWxBZGRyZXNzPiByZWNpcGllbnRzID0gbmV3IEFycmF5TGlzdDxNYWlsQWRkcmVzcz4ocmVjaXBpZW50QWRkcmVzc2VzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY2lwaWVudEFkZHJlc3Nlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWNpcGllbnRzLmFkZChuZXcgTWFpbEFkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoSW50ZXJuZXRBZGRyZXNzKSByZWNpcGllbnRBZGRyZXNzZXNbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQucG9zdChudWxsLCByZWNpcGllbnRzLCByZXBseSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldExvZygpLmluZm8oIlVuYWJsZSB0byBzZW5kIHJlamVjdCBNRE4uIENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHJlY2lwaWVudC4iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBHaG9zdCB0aGUgb3JpZ2luYWwgbWFpbAotICAgICAgICBhTWFpbC5zZXRTdGF0ZShNYWlsLkdIT1NUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9SZXNvdXJjZUxvY2F0b3IuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9SZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyYWQwOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogPHA+RXhwZXJpbWVudGFsIEFQSSBsb2NhdGVzIHJlc291cmNlcy4gCi0gKiBVc2VkIHRvIGxvYWQgU2lldmUgc2NyaXB0cy4gVGhlIGJhc2UgZm9yIHJlbGF0aXZlIFVSTHMKLSAqIHNob3VsZCBiZSB0YWtlbiB0byBiZSB0aGUgcm9vdCBvZiB0aGUgSmFtZXMgY29uZmlndXJhdGlvbi4KLSAqIDwvcD48cD4KLSAqIFJlcXVpcmVkIHNjaGVtYXM6Ci0gKiA8L3A+Ci0gKiA8dWw+Ci0gKiA8bGk+PHN0cm9uZz5Vc2VyIHNpZXZlIHNjcmlwdHM8L3N0cm9uZz4gLSB0aGUgcmVsYXRpdmUgVVJMIHNjaGVtZSAKLSAqIDxjb2RlPi8vPGVtPnVzZXI8L2VtPkA8ZW0+aG9zdDwvZW0+LzxlbT5zaWV2ZTwvZW0+IHdpbGwgYmUgdXNlZCB0bwotICogb2J0YWluIHRoZSBzY3JpcHQKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgPGNvZGU+VVJJPC9jb2RlPnMgCi0gKiBhbmQgdmVyYnMgKGZvciBleGFtcGxlIDxjb2RlPkdFVDwvY29kZT4sIDxjb2RlPlBPU1Q8L2NvZGU+KQotICogYXJlIHRoZWlyIHVuaWZvcm1pdHkuIFRoZSBzYW1lIEFQSSBjYW4gYmUgdXNlZCB0byBpbnRlcmZhY2UgcmFkaWNhbGx5Ci0gKiBkaWZmZXJlbnQgcmVzb3VyY2UgdHlwZXMgYW5kIHByb3RvY29scy4gVGhpcyBhbGxvd3MgY29uY2lzZSwgbWluaW1hbCwKLSAqIHBvd2VyZnVsIEFQSXMgdG8gYmUgY3JlYXRlZC4gVGhlaXIgc2ltcGxpY2l0eSBpcyBlYXN5IHRvIHByZXNlcnZlZCAKLSAqIGFjcm9zcyB2ZXJzaW9ucy4gCi0gKiA8L3A+PHA+Ci0gKiBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBmcmVlIGRlY291cGxlIG1lYW5zIHRoYXQgdGhlcmUgaXMgCi0gKiBubyBnYXVyYW50ZWUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb25zIGRlY291cGxlZCBieSB0aGlzIGludGVyZmFjZQotICogYWN0dWFsbHkgc3VwcG9ydCB0aGUgc2FtZSBzY2hlbWUuIElzc3VlcyB3aWxsIGJlIGNhdWdodCBvbmx5IAotICogYXQgZGVwbG95bWVudCBhbmQgbm90IGF0IGNvbXBpbGUgdGltZS4KLSAqIFRoaXMgcGxhY2VzIGEgbGFyZ2VyIGJ1cmRlbiBvbiB0aGUgZGVwbG95ZXIuCi0gKiA8L3A+PHA+Ci0gKiBFaXRoZXIgYW4gdW5kZXJzdGFuZGluZyBvciBhIGNvbnNpc3RlbnQgVVJMIG1hcHBpbmcgc2NoZW1lIG1heSBiZSAKLSAqIHJlcXVpcmVkLiBGb3IgZXhhbXBsZSwgPGNvZGU+Ly9qb2huLnNtaXRoQGxvY2FsaG9zdC9zaWV2ZTwvY29kZT4KLSAqIG1heSBuZWVkIHRvIGJlIHJlc29sdmVkIHRvIDxjb2RlPi4uL2FwcHMvamFtZXMvdmFyL3NpZXZlL2pvaG4uc21pdGhAbG9jYWxob3N0LnNpZXZlPC9jb2RlPgotICogd2hlbiB1c2luZyB0aGUgZmlsZSBzeXN0ZW0gdG8gc3RvcmUgc2NyaXB0cy4gTm90ZSB0aGF0IG5hbWVzIDxzdHJvbmc+TVVTVDwvc3Ryb25nPgotICogYmUgbm9ybWFsaXNlZCBiZWZvcmUgcmVzb2x2aW5nIG9uIGEgZmlsZSBzeXN0ZW0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VMb2NhdG9yIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHRVQgdmVyYiBsb2NhdGVzIGFuZCBsb2FkcyBhIHJlc291cmNlLiAKLSAgICAgKiBAcGFyYW0gdXJpIGlkZW50aWZpZXMgdGhlIFNpZXZlIHNjcmlwdCAKLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUgbG9jYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXQoU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1NpZXZlTWFpbEFkYXB0ZXIuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9TaWV2ZU1haWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjU5M2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1NpZXZlTWFpbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lm1haWwuSGVhZGVyOwotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLkFkZHJlc3NMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuTWFpbGJveDsKLWltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLk1haWxib3hMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFkZHJlc3NJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29yczsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsOwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0Lk1haWxBZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0Lk1haWxldENvbnRleHQ7Ci0vKioKLSAqIDxwPgotICogQ2xhc3MgPGNvZGU+U2lldmVNYWlsQWRhcHRlcjwvY29kZT4gaW1wbGVtZW50cyBhIDxjb2RlPk1haWxBZGFwdGVyPC9jb2RlPgotICogZm9yIHVzZSBpbiBhIE1haWxldCBlbnZpcm9ubWVudC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNpZXZlTWFpbEFkYXB0ZXIgaW1wbGVtZW50cyBNYWlsQWRhcHRlciwgRW52ZWxvcGVBY2Nlc3NvcnMsIEFjdGlvbkNvbnRleHQKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2lldmVNYWlsQWRhcHRlci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTE9HOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBNYWlsIGJlaW5nIGFkYXB0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYWlsIGZpZWxkTWFpbDsKLSAgICAvKioKLSAgICAgKiBUaGUgTWFpbGV0Q29udGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1haWxldENvbnRleHQgZmllbGRNYWlsZXRDb250ZXh0OwotICAgIC8qKgotICAgICAqIExpc3Qgb2YgQWN0aW9ucyB0byBwZXJmb3JtLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxBY3Rpb24+IGZpZWxkQWN0aW9uczsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIEFjdGlvbkRpc3BhdGNoZXIgZGlzcGF0Y2hlcjsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFBvc3RlciBwb3N0ZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VGV4dDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2lldmVNYWlsQWRhcHRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYU1haWwKLSAgICAgKiBAcGFyYW0gYU1haWxldENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVNYWlsQWRhcHRlcihmaW5hbCBNYWlsIGFNYWlsLCBmaW5hbCBNYWlsZXRDb250ZXh0IGFNYWlsZXRDb250ZXh0LCBmaW5hbCBBY3Rpb25EaXNwYXRjaGVyIGRpc3BhdGNoZXIsIGZpbmFsIFBvc3RlciBwb3N0ZXIpCi0gICAgewotICAgICAgICB0aGlzLnBvc3RlciA9IHBvc3RlcjsKLSAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKLSAgICAgICAgc2V0TWFpbChhTWFpbCk7Ci0gICAgICAgIHNldE1haWxldENvbnRleHQoYU1haWxldENvbnRleHQpOwotICAgIH0KLSAgICAKLSAgCi0gICAgcHVibGljIHZvaWQgc2V0TG9nKExvZyBsb2cpIHsKLSAgICAgICAgdGhpcy5sb2cgPSBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1pbWVNZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1pbWVNZXNzYWdlIGdldE1lc3NhZ2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0TWFpbCgpLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTGlzdCBvZiBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEFjdGlvbj4gZ2V0QWN0aW9ucygpCi0gICAgewotICAgICAgICBMaXN0PEFjdGlvbj4gYWN0aW9ucyA9IG51bGw7Ci0gICAgICAgIGlmIChudWxsID09IChhY3Rpb25zID0gZ2V0QWN0aW9uc0Jhc2ljKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVBY3Rpb25zKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QWN0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpb25zOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IExpc3Qgb2YgYWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxBY3Rpb24+IGNvbXB1dGVBY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTGlzdCBvZiBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxBY3Rpb24+IGdldEFjdGlvbnNCYXNpYygpCi0gICAgewotICAgICAgICByZXR1cm4gZmllbGRBY3Rpb25zOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIEFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWN0aW9uKEFjdGlvbiBhY3Rpb24pCi0gICAgewotICAgICAgICBnZXRBY3Rpb25zKCkuYWRkKGFjdGlvbik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlciNleGVjdXRlQWN0aW9ucygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZUFjdGlvbnMoKSB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gZ2V0QWN0aW9ucygpOwotICAgICAgICBmb3IgKGZpbmFsIEFjdGlvbiBhY3Rpb246IGFjdGlvbnMpIHsKLSAgICAgICAgICAgIGdldE1haWxldENvbnRleHQoKS5sb2coIkV4ZWN1dGluZyBhY3Rpb246ICIgKyBhY3Rpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmV4ZWN1dGUoYWN0aW9uLCBnZXRNYWlsKCksIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhY3Rpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBhY3Rpb25zIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEFjdGlvbnMoTGlzdDxBY3Rpb24+IGFjdGlvbnMpCi0gICAgewotICAgICAgICBmaWVsZEFjdGlvbnMgPSBhY3Rpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBhY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoKQotICAgIHsKLSAgICAgICAgc2V0QWN0aW9ucyhjb21wdXRlQWN0aW9ucygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0SGVhZGVyKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhlYWRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGhlYWRlcnMgPSBnZXRNZXNzYWdlKCkuZ2V0SGVhZGVyKG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIChoZWFkZXJzID09IG51bGwgPyBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkgOiBBcnJheXMuYXNMaXN0KGhlYWRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0SGVhZGVyTmFtZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyTmFtZXMoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTZXQ8U3RyaW5nPiBoZWFkZXJOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGFsbEhlYWRlcnMgPSBnZXRNZXNzYWdlKCkuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICAgICAgd2hpbGUgKGFsbEhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTmFtZXMuYWRkKCgoSGVhZGVyKSBhbGxIZWFkZXJzLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGhlYWRlck5hbWVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0TWF0Y2hpbmdIZWFkZXIoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBNYWlsVXRpbHMuZ2V0TWF0Y2hpbmdIZWFkZXIodGhpcywgbmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlciNnZXRTaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKS5nZXRTaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldEVudmVsb3Blcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEVudmVsb3BlcygpCi0gICAgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmVsb3BlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigyKTsKLSAgICAgICAgaWYgKG51bGwgIT0gZ2V0RW52ZWxvcGVGcm9tKCkpCi0gICAgICAgICAgICBlbnZlbG9wZXMucHV0KCJGcm9tIiwgZ2V0RW52ZWxvcGVGcm9tKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBnZXRFbnZlbG9wZVRvKCkpCi0gICAgICAgICAgICBlbnZlbG9wZXMucHV0KCJUbyIsIGdldEVudmVsb3BlVG8oKSk7Ci0gICAgICAgIHJldHVybiBlbnZlbG9wZXM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29ycyNnZXRFbnZlbG9wZShTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbnZlbG9wZShTdHJpbmcgbmFtZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0RW52ZWxvcGVzKCkuZ2V0KG5hbWUpOwotICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkKLSAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwub3B0aW9uYWwuRW52ZWxvcGVBY2Nlc3NvcnMjZ2V0RW52ZWxvcGVOYW1lcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbnZlbG9wZU5hbWVzKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihnZXRFbnZlbG9wZXMoKS5rZXlTZXQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29ycyNnZXRNYXRjaGluZ0VudmVsb3BlKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoaW5nRW52ZWxvcGUoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtYXRjaGVkRW52ZWxvcGVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMzIpOwotICAgICAgICBmb3IgKFN0cmluZyBlbnZlbG9wZU5hbWU6IGdldEVudmVsb3BlTmFtZXMoKSkgewotICAgICAgICAgICAgaWYgKGVudmVsb3BlTmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLSAgICAgICAgICAgICAgICBtYXRjaGVkRW52ZWxvcGVWYWx1ZXMuYWRkQWxsKGdldEVudmVsb3BlKGVudmVsb3BlTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXRjaGVkRW52ZWxvcGVWYWx1ZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZyb20uCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudmVsb3BlRnJvbSgpCi0gICAgewotICAgICAgICBNYWlsQWRkcmVzcyBzZW5kZXIgPSBnZXRNYWlsKCkuZ2V0U2VuZGVyKCk7IAotICAgICAgICByZXR1cm4gKG51bGwgPT0gc2VuZGVyID8gIiIgOiBzZW5kZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvbGUgcmVjaXBpZW50IG9yIG51bGwgaWYgdGhlcmUgaXNuJ3Qgb25lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnZlbG9wZVRvKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyByZWNpcGllbnQgPSBudWxsOwotICAgICAgICBJdGVyYXRvciByZWNpcGllbnRJdGVyID0gZ2V0TWFpbCgpLmdldFJlY2lwaWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICBpZiAocmVjaXBpZW50SXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICByZWNpcGllbnQgPSAoU3RyaW5nKSByZWNpcGllbnRJdGVyLm5leHQoKS50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gcmVjaXBpZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYWlsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTWFpbAotICAgICAqLwotICAgIHB1YmxpYyBNYWlsIGdldE1haWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkTWFpbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWFpbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFpbCBUaGUgbWFpbCB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRNYWlsKE1haWwgbWFpbCkKLSAgICB7Ci0gICAgICAgIGZpZWxkTWFpbCA9IG1haWw7Ci0gICAgICAgIGNvbnRlbnRUZXh0ID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFpbGV0Q29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1haWxldENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFpbGV0Q29udGV4dCBnZXRNYWlsZXRDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWVsZE1haWxldENvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1haWxldENvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWxldENvbnRleHQgVGhlIG1haWxldENvbnRleHQgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TWFpbGV0Q29udGV4dChNYWlsZXRDb250ZXh0IG1haWxldENvbnRleHQpCi0gICAgewotICAgICAgICBmaWVsZE1haWxldENvbnRleHQgPSBtYWlsZXRDb250ZXh0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlSUQgPSBnZXRNYWlsKCkuZ2V0TWVzc2FnZSgpLmdldE1lc3NhZ2VJRCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZUlEID0gIjwiICsgZS5nZXRNZXNzYWdlKCkgKyAiPiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBFbnZlbG9wZSBGcm9tOiAiCi0gICAgICAgICAgICAgICAgKyAobnVsbCA9PSBnZXRFbnZlbG9wZUZyb20oKSA/ICJudWxsIiA6IGdldEVudmVsb3BlRnJvbSgpKQotICAgICAgICAgICAgICAgICsgIiBFbnZlbG9wZSBUbzogIgotICAgICAgICAgICAgICAgICsgKG51bGwgPT0gZ2V0RW52ZWxvcGVUbygpID8gIm51bGwiIDogZ2V0RW52ZWxvcGVUbygpKQotICAgICAgICAgICAgICAgICsgIiBNZXNzYWdlIElEOiAiICsgKG51bGwgPT0gbWVzc2FnZUlEID8gIm51bGwiIDogbWVzc2FnZUlEKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWRkcmVzc1tdIHBhcnNlQWRkcmVzc2VzKFN0cmluZyBhcmcpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24sIEludGVybmV0QWRkcmVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBNYWlsYm94TGlzdCBsaXN0ID0gQWRkcmVzc0xpc3QucGFyc2UoYXJnKS5mbGF0dGVuKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgZmluYWwgQWRkcmVzc1tdIHJlc3VsdHMgPSBuZXcgQWRkcmVzc1tzaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHNpemU7aSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFpbGJveCBtYWlsYm94ID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IG5ldyBBZGRyZXNzSW1wbChtYWlsYm94LmdldExvY2FsUGFydCgpLCBtYWlsYm94LmdldERvbWFpbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExvZyBnZXRMb2coKSB7Ci0gICAgICAgIHJldHVybiBsb2c7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGdldE1haWxldENvbnRleHQoKS5nZXRTZXJ2ZXJJbmZvKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBvc3QoU3RyaW5nIHVyaSwgTWltZU1lc3NhZ2UgbWFpbCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHBvc3Rlci5wb3N0KHVyaSwgbWFpbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHBvc3QoTWFpbEFkZHJlc3Mgc2VuZGVyLCBDb2xsZWN0aW9uIHJlY2lwaWVudHMsIE1pbWVNZXNzYWdlIG1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBnZXRNYWlsZXRDb250ZXh0KCkuc2VuZE1haWwoc2VuZGVyLCByZWNpcGllbnRzLCBtYWlsKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Cb2R5VGV4dChTdHJpbmcgcGhyYXNlQ2FzZUluc2Vuc2l0aXZlKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFRleHQgPSBnZXRNZXNzYWdlKCkuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb250ZW50VGV4dC5jb250YWlucyhwaHJhc2VDYXNlSW5zZW5zaXRpdmUpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoU2lldmVDb250ZXh0IGNvbnRleHQpIHt9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvU2lldmVNYWlsYm94TWFpbGV0LmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvU2lldmVNYWlsYm94TWFpbGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmE1MmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L1NpZXZlTWFpbGJveE1haWxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC5tYWlsLkhlYWRlcjsKLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0SGVhZGVyczsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5NYWlsZXRDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYWlsZXQuTWFpbGV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0LmJhc2UuR2VuZXJpY01haWxldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1haWxldC5iYXNlLlJGQzI4MjJIZWFkZXJzOwotCi0vKioKLSAqIDxwPkV4ZWN1dGVzIGEgPGEgaHJlZj0naHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzAyOC50eHQnPlNpZXZlPC9hPgotICogc2NyaXB0IGFnYWluc3QgaW5jb21pbmcgbWFpbC4gVGhlIHNjcmlwdCBhcHBsaWVkIGlzIGJhc2VkIG9uIHRoZSByZWNpcGllbnQuPC9wPgotICogPGg0PkluaXQgUGFyYW1ldGVyczwvaDQ+Ci0gKiA8dGFibGU+Ci0gKiA8dGhlYWQ+PHRyPjx0aD5OYW1lPC90aD48dGg+UmVxdWlyZWQ8L3RoPjx0aD5WYWx1ZXM8L3RoPjx0aD5Sb2xlPC90aD48L3RoZWFkPgotICogPHRyPjx0ZD52ZXJib3NlPC90ZD48dGQ+Tm8gLSBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+PHRkPnRydWUgKGlnbm9yaW5nIGNhc2UpIHRvIGVuYWJsZSwgb3RoZXJ3aXNlIGRpc2FibGU8L3RkPgotICogPHRkPgotICogRW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcuCi0gKiA8L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICovCi1wdWJsaWMgY2xhc3MgU2lldmVNYWlsYm94TWFpbGV0IGV4dGVuZHMgR2VuZXJpY01haWxldCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVsaXZlcnkgaGVhZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVsaXZlcnlIZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiByZXNldFJldHVyblBhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVzZXRSZXR1cm5QYXRoOwotICAgIC8qKiBFeHBlcmltZW50YWwgKi8KLSAgICBwcml2YXRlIFBvc3RlciBwb3N0ZXI7Ci0gICAgLyoqIEV4cGVyaW1lbnRhbCAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VMb2NhdG9yIGxvY2F0b3I7Ci0gICAgCi0gICAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbWFpbGV0IHNob3VsZCBsb2cgdmVyYm9zZWx5ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY29uc3VtZSA9IHRydWU7Ci0gICAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbWFpbGV0IHNob3VsZCBsb2cgbWluaW1hbCBpbmZvcm1hdGlvbiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFNpZXZlRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBBY3Rpb25EaXNwYXRjaGVyIGFjdGlvbkRpc3BhdGNoZXI7Ci0KLSAgICBwcml2YXRlIExvZyBsb2c7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgU0RJCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlTWFpbGJveE1haWxldCgpIHt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ0RJCi0gICAgICogQHBhcmFtIHBvc3RlciBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZU1haWxib3hNYWlsZXQoUG9zdGVyIHBvc3RlciwgUmVzb3VyY2VMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLnBvc3RlciA9IHBvc3RlcjsKLSAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBTREkKLSAgICAgKiBAcGFyYW0gbG9jYXRvciBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0b3IoUmVzb3VyY2VMb2NhdG9yIGxvY2F0b3IpIHsKLSAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9zdGVyIGdldFBvc3RlcigpIHsKLSAgICAgICAgcmV0dXJuIHBvc3RlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9yIFNESQotICAgICAqIEBwYXJhbSBwb3N0ZXIgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3N0ZXIoUG9zdGVyIHBvc3RlcikgewotICAgICAgICB0aGlzLnBvc3RlciA9IHBvc3RlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGlzIG1haWxldCBHSE9TVGluZyBhbGwgbWFpbCBpdCBwcm9jZXNzZXM/Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gbWFpbGV0IGNvbnN1bWVzIGFsbCBtYWlsLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWUoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIG1haWxldCBzaG91bGQgR0hPU1QgYWxsIG1haWwuCi0gICAgICogQHBhcmFtIGNvbnN1bWUgdHJ1ZSB3aGVuIHRoZSBtYWlsZXQgc2hvdWxkIGNvbnN1bWUgYWxsIG1haWwsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnN1bWUoYm9vbGVhbiBjb25zdW1lKSB7Ci0gICAgICAgIHRoaXMuY29uc3VtZSA9IGNvbnN1bWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyBtYWlsZXQgbG9nZ2luZyB2ZXJib3NlbHk/Ci0gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBzZXQgYnkgaW5pdCBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBsb2dnaW5nIHNob3VsZCBiZSB2ZXJib3NlLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJib3NlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIGxvZ2dpbmcgc2hvdWxkIGJlIHZlcmJvc2UgZm9yIHRoaXMgbWFpbGV0LgotICAgICAqIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IGluaXQgcGFyYW1ldGVycy4KLSAgICAgKiBUaGlzIHNldHRpbmcgb3ZlcnJpZGVzIHtAbGluayAjaXNRdWlldCgpfS4KLSAgICAgKiBAcGFyYW0gdmVyYm9zZSB0cnVlIHdoZW4gbG9nZ2luZyBzaG91bGQgYmUgdmVyYm9zZSwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgewotICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzIHRoZSBsb2dnaW5nIGZvciB0aGlzIG1haWxldCBzZXQgdG8gbWluaW1hbD8KLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1aWV0KCkgewotICAgICAgICByZXR1cm4gcXVpZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbG9nZ2luZyBmb3IgdGhpcyBtYWlsZXQgdG8gbWluaW1hbC4KLSAgICAgKiBUaGlzIGlzIG92ZXJyaWRlbiBieSB7QGxpbmsgI3NldFZlcmJvc2UoYm9vbGVhbil9LgotICAgICAqIEBwYXJhbSBxdWlldCB0cnVlIGZvciBtaW5pbWFsIGxvZ2dpbmcsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpIHsKLSAgICAgICAgdGhpcy5xdWlldCA9IHF1aWV0OwotICAgIH0KLSAgICAKLSAgIAotICAgIC8qKgotICAgICAqIElzIGluZm9ybWF0aW9uYWwgbG9nZ2luZyB0dXJuZWQgb24/IAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIG1pbmltYWwgbG9nZ2luZyBpcyBvZmYsCi0gICAgICogZmFsc2Ugd2hlbiBsb2dnaW5nIGlzIG1pbmltYWwKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9Mb2dnaW5nT24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJib3NlIHx8ICFxdWlldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1haWxldENvbmZpZyBjb25maWcpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgc3VwZXIuaW5pdChjb25maWcpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOwotICAgICAgICAgICAgZmluYWwgaW50IGxvZ0xldmVsOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBsb2dMZXZlbCA9IENvbW1vbnNMb2dnaW5nQWRhcHRlci5UUkFDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocXVpZXQpIHsKLSAgICAgICAgICAgICAgICBsb2dMZXZlbCA9IENvbW1vbnNMb2dnaW5nQWRhcHRlci5GQVRBTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nTGV2ZWwgPSBDb21tb25zTG9nZ2luZ0FkYXB0ZXIuV0FSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZyA9IG5ldyBDb21tb25zTG9nZ2luZ0FkYXB0ZXIodGhpcywgbG9nTGV2ZWwpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0TG9nKGxvZyk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gY29uZmlndXJhdGlvbk1hbmFnZXIuYnVpbGQoKTsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIHN0YW5kYXJkIFNpZXZlIGNvbmZpZ3VyYXRpb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxpdmVycyBhIG1haWwgdG8gYSBsb2NhbCBtYWlsYm94LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogICAgICAgICAgICB0aGUgbWFpbCBiZWluZyBwcm9jZXNzZWQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzdG9yaW5nIHRoZSBtYWlsCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VydmljZShNYWlsIG1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBDb2xsZWN0aW9uPE1haWxBZGRyZXNzPiByZWNpcGllbnRzID0gbWFpbC5nZXRSZWNpcGllbnRzKCk7Ci0gICAgICAgIENvbGxlY3Rpb248TWFpbEFkZHJlc3M+IGVycm9ycyA9IG5ldyBWZWN0b3I8TWFpbEFkZHJlc3M+KCk7Ci0KLSAgICAgICAgTWltZU1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmIChkZWxpdmVyeUhlYWRlciAhPSBudWxsIHx8IHJlc2V0UmV0dXJuUGF0aCkgewotICAgICAgICAgICAgbWVzc2FnZSA9IG1haWwuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc2V0UmV0dXJuUGF0aCkgewotICAgICAgICAgICAgLy8gU2V0IFJldHVybi1QYXRoIGFuZCByZW1vdmUgYWxsIG90aGVyIFJldHVybi1QYXRoIGhlYWRlcnMgZnJvbSB0aGUKLSAgICAgICAgICAgIC8vIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIFRoaXMgb25seSB3b3JrcyBiZWNhdXNlIHRoZXJlIGlzIGEgcGxhY2Vob2xkZXIgaW5zZXJ0ZWQgYnkKLSAgICAgICAgICAgIC8vIE1pbWVNZXNzYWdlV3JhcHBlcgotICAgICAgICAgICAgbWVzc2FnZS5zZXRIZWFkZXIoUkZDMjgyMkhlYWRlcnMuUkVUVVJOX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgIChtYWlsLmdldFNlbmRlcigpID09IG51bGwgPyAiPD4iIDogIjwiICsgbWFpbC5nZXRTZW5kZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIj4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJzOwotICAgICAgICBJbnRlcm5ldEhlYWRlcnMgZGVsaXZlcmVkVG8gPSBuZXcgSW50ZXJuZXRIZWFkZXJzKCk7Ci0gICAgICAgIGlmIChkZWxpdmVyeUhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDb3B5IGFueSBEZWxpdmVyZWQtVG8gaGVhZGVycyBmcm9tIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBoZWFkZXJzID0gbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hpbmdIZWFkZXJzKG5ldyBTdHJpbmdbXSB7IGRlbGl2ZXJ5SGVhZGVyIH0pOwotICAgICAgICAgICAgd2hpbGUgKGhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gKEhlYWRlcikgaGVhZGVycy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGRlbGl2ZXJlZFRvLmFkZEhlYWRlcihoZWFkZXIuZ2V0TmFtZSgpLCBoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPE1haWxBZGRyZXNzPiBpID0gcmVjaXBpZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1haWxBZGRyZXNzIHJlY2lwaWVudCA9IGkubmV4dCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsaXZlcnlIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcW1haWwncyBkZSBmYWN0byBzdGFuZGFyZCBEZWxpdmVyZWQtVG8gaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkSGVhZGVyKGRlbGl2ZXJ5SGVhZGVyLCByZWNpcGllbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3RvcmVNYWlsKG1haWwuZ2V0U2VuZGVyKCksIHJlY2lwaWVudCwgbWFpbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGVsaXZlcnlIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBoZWFkZXJzIGJ1dCBsZWF2ZSBhbGwgcGxhY2Vob2xkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlbW92ZUhlYWRlcihkZWxpdmVyeUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gZGVsaXZlcmVkVG8uZ2V0QWxsSGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHJlc3RvcmUgYW55IG9yaWdpbmFsIERlbGl2ZXJlZC1UbyBoZWFkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBoZWFkZXJzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRIZWFkZXIoaGVhZGVyLmdldE5hbWUoKSwgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBsb2coIkVycm9yIHdoaWxlIHN0b3JpbmcgbWFpbC4iLCBleCk7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChyZWNpcGllbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGVycm9ycywgd2UgcmVkaXJlY3QgdGhlIGVtYWlsIHRvIHRoZSBFUlJPUgotICAgICAgICAgICAgLy8gcHJvY2Vzc29yLgotICAgICAgICAgICAgLy8gSW4gb3JkZXIgZm9yIHRoaXMgc2VydmVyIHRvIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgU01UUAotICAgICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbiwgbWFpbHMgb24gdGhlIEVSUk9SIHByb2Nlc3NvciBtdXN0IGJlIHJldHVybmVkIHRvCi0gICAgICAgICAgICAvLyB0aGUgc2VuZGVyLiBOb3RlIHRoYXQgdGhpcyBlbWFpbCBkb2Vzbid0IGluY2x1ZGUgYW55IGRldGFpbHMKLSAgICAgICAgICAgIC8vIHJlZ2FyZGluZyB0aGUgZGV0YWlscyBvZiB0aGUgZmFpbHVyZShzKS4KLSAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUgd2UgbWF5IHdpc2ggdG8gYWRkcmVzcyB0aGlzLgotICAgICAgICAgICAgZ2V0TWFpbGV0Q29udGV4dCgpLnNlbmRNYWlsKG1haWwuZ2V0U2VuZGVyKCksIGVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCksIE1haWwuRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICAvLyBDb25zdW1lIHRoaXMgbWVzc2FnZQotICAgICAgICAgICAgbWFpbC5zZXRTdGF0ZShNYWlsLkdIT1NUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgbWFpbGV0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG1haWxldAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbGV0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuICJTaWV2ZSBNYWlsYm94IE1haWxldCI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlbmRlcgotICAgICAqIEBwYXJhbSByZWNpcGllbnQKLSAgICAgKiBAcGFyYW0gbWFpbAotICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBzdG9yZU1haWwoTWFpbEFkZHJlc3Mgc2VuZGVyLCBNYWlsQWRkcmVzcyByZWNpcGllbnQsCi0gICAgICAgICAgICBNYWlsIG1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBpZiAocmVjaXBpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJSZWNpcGllbnQgZm9yIG1haWwgdG8gYmUgc3Bvb2xlZCBjYW5ub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFpbC5nZXRNZXNzYWdlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk1haWwgbWVzc2FnZSB0byBiZSBzcG9vbGVkIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzaWV2ZU1lc3NhZ2UocmVjaXBpZW50LCBtYWlsKTsKLSAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzaWV2ZU1lc3NhZ2UoTWFpbEFkZHJlc3MgcmVjcGllbnQsIE1haWwgYU1haWwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgIAlTdHJpbmcgdXNlcm5hbWUgPSBnZXRVc2VybmFtZShyZWNwaWVudCk7Ci0gICAgICAgIC8vIEV2YWx1YXRlIHRoZSBzY3JpcHQgYWdhaW5zdCB0aGUgbWFpbAotICAgICAgICBTdHJpbmcgcmVsYXRpdmVVcmkgPSAiLy8iICsgdXNlcm5hbWUgKyIvc2lldmUiOyAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucyA9IGxvY2F0b3IuZ2V0KHJlbGF0aXZlVXJpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBhTWFpbEFkYXB0ZXIgPSBuZXcgU2lldmVNYWlsQWRhcHRlcihhTWFpbCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWFpbGV0Q29udGV4dCgpLCBhY3Rpb25EaXNwYXRjaGVyLCBwb3N0ZXIpOwotICAgICAgICAgICAgYU1haWxBZGFwdGVyLnNldExvZyhsb2cpOwotICAgICAgICAgICAgLy8gVGhpcyBsb2dnaW5nIG9wZXJhdGlvbiBpcyBwb3RlbnRpYWxseSBjb3N0bHkKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJFdmFsdWF0aW5nICIgKyBhTWFpbEFkYXB0ZXIudG9TdHJpbmcoKSArICJhZ2FpbnN0IFwiIgotICAgICAgICAgICAgICAgICAgICArIHJlbGF0aXZlVXJpICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYWN0b3J5LmV2YWx1YXRlKGFNYWlsQWRhcHRlciwgZmFjdG9yeS5wYXJzZShpbnMpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gU0xJRVZFIGlzIGEgbWFpbCBmaWx0ZXJpbmcgcHJvdG9jb2wuCi0gICAgICAgICAgICAvLyBSZWplY3RpbmcgdGhlIG1haWwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgZmlsdGVyZWQKLSAgICAgICAgICAgIC8vIHNlZW1zIHZlcnkgdW5mcmllbmRseS4KLSAgICAgICAgICAgIC8vIFNvIGp1c3QgbG9nIGFuZCBzdG9yZSBpbiBJTkJPWC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoaXNJbmZvTG9nZ2luZ09uKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkNhbm5vdCBldmFsdWF0ZSBTaWV2ZSBzY3JpcHQuIFN0b3JpbmcgbWFpbCBpbiB1c2VyIElOQk9YLiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0b3JlTWVzc2FnZUluYm94KHVzZXJuYW1lLCBhTWFpbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzdG9yZU1lc3NhZ2VJbmJveChTdHJpbmcgdXNlcm5hbWUsIE1haWwgbWFpbCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSAibWFpbGJveDovLyIgKyB1c2VybmFtZSArICIvIjsKLSAgICAgICAgcG9zdGVyLnBvc3QodXJsLCBtYWlsLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLm1haWxldC5iYXNlLkdlbmVyaWNNYWlsZXQjaW5pdCgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzdXBlci5pbml0KCk7Ci0gICAgICAgIGlmIChwb3N0ZXIgPT0gbnVsbCB8fCBsb2NhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWlsZXRFeGNlcHRpb24oIk5vdCBpbml0aWFsaXNlZC4gUGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBtYWlsZXQgY29udGFpbmVyIHN1cHBvcnRzIGVpdGhlciIgKwotICAgICAgICAgICAgICAgICAgICAiIHNldHRlciBvciBjb25zdHJ1Y3RvciBpbmplY3Rpb24iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5kZWxpdmVyeUhlYWRlciA9IGdldEluaXRQYXJhbWV0ZXIoImFkZERlbGl2ZXJ5SGVhZGVyIik7Ci0gICAgICAgIHRoaXMucmVzZXRSZXR1cm5QYXRoID0gZ2V0SW5pdFBhcmFtZXRlcigicmVzZXRSZXR1cm5QYXRoIiwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuY29uc3VtZSA9IGdldEluaXRQYXJhbWV0ZXIoImNvbnN1bWUiLCB0cnVlKTsKLSAgICAgICAgdGhpcy52ZXJib3NlID0gZ2V0SW5pdFBhcmFtZXRlcigidmVyYm9zZSIsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5xdWlldCA9IGdldEluaXRQYXJhbWV0ZXIoInF1aWV0IiwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgYWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBBY3Rpb25EaXNwYXRjaGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdXNlcm5hbWUgdG8gdXNlIGZvciBzaWV2ZSBwcm9jZXNzaW5nIGZvciB0aGUgZ2l2ZW4gTWFpbEFkZHJlc3MKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbQotICAgICAqIEByZXR1cm4gdXNlcm5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJuYW1lKE1haWxBZGRyZXNzIG0pIHsKLSAgICAJcmV0dXJuIG0uZ2V0TG9jYWxQYXJ0KCkgKyAiQGxvY2FsaG9zdCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9BY3Rpb25Nb2RlQXV0b21hdGljLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0FjdGlvbk1vZGVBdXRvbWF0aWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjYWI5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0FjdGlvbk1vZGVBdXRvbWF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbjsKLQotCi0vKioKLSAqIENsYXNzIDxjb2RlPkFjdGlvbk1vZGVBdXRvbWF0aWM8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlQXV0b21hdGljIGV4dGVuZHMgT2JqZWN0Ci0gICAgICAgIGltcGxlbWVudHMKLSAgICAgICAgICAgIERpc3Bvc2l0aW9uQWN0aW9uTW9kZQotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25Nb2RlQXV0b21hdGljKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gImF1dG9tYXRpYy1hY3Rpb24iOwotICAgIH0gICAgICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9BY3Rpb25Nb2RlTWFudWFsLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0FjdGlvbk1vZGVNYW51YWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MTZkOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0FjdGlvbk1vZGVNYW51YWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbjsKLQotCi0vKioKLSAqIENsYXNzIDxjb2RlPkFjdGlvbk1vZGVNYW51YWw8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlTWFudWFsCi0gICAgICAgIGltcGxlbWVudHMKLSAgICAgICAgICAgIERpc3Bvc2l0aW9uQWN0aW9uTW9kZQotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25Nb2RlTWFudWFsKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gIm1hbnVhbC1hY3Rpb24iOwotICAgIH0gICAgICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9EaXNwb3NpdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9EaXNwb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTM5ZTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLS8qKgotICogQ2xhc3MgPGNvZGU+RGlzcG9zaXRpb248L2NvZGU+IGVuY2Fwc3VsYXRpbmcKLSAqIGRpc3Bvc2l0aW9uIGluZm9ybWF0aW9uIGFzIGRlZmluZWQgYnkgUkZDIDIyOTguCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwb3NpdGlvbgotewotICAgIHByaXZhdGUgRGlzcG9zaXRpb25BY3Rpb25Nb2RlIGZpZWxkQWN0aW9uTW9kZTsKLSAgICBwcml2YXRlIERpc3Bvc2l0aW9uU2VuZGluZ01vZGUgZmllbGRTZW5kaW5nTW9kZTsKLSAgICBwcml2YXRlIERpc3Bvc2l0aW9uVHlwZSBmaWVsZERpc3Bvc2l0aW9uVHlwZTsKLSAgICBwcml2YXRlIERpc3Bvc2l0aW9uTW9kaWZpZXJbXSBmaWVsZERpc3Bvc2l0aW9uTW9kaWZpZXJzOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y29yCi0gICAgICovCi0gICAgcHJpdmF0ZSBEaXNwb3NpdGlvbigpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb25Nb2RlCi0gICAgICogQHBhcmFtIHNlbmRpbmdNb2RlCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlzcG9zaXRpb24oRGlzcG9zaXRpb25BY3Rpb25Nb2RlIGFjdGlvbk1vZGUsIERpc3Bvc2l0aW9uU2VuZGluZ01vZGUgc2VuZGluZ01vZGUsIERpc3Bvc2l0aW9uVHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXRBY3Rpb25Nb2RlKGFjdGlvbk1vZGUpOwotICAgICAgICBzZXRTZW5kaW5nTW9kZShzZW5kaW5nTW9kZSk7Ci0gICAgICAgIHNldERpc3Bvc2l0aW9uVHlwZSh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9uTW9kZQotICAgICAqIEBwYXJhbSBzZW5kaW5nTW9kZQotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogQHBhcmFtIG1vZGlmaWVycwotICAgICAqLwotICAgIHB1YmxpYyBEaXNwb3NpdGlvbihEaXNwb3NpdGlvbkFjdGlvbk1vZGUgYWN0aW9uTW9kZSwgRGlzcG9zaXRpb25TZW5kaW5nTW9kZSBzZW5kaW5nTW9kZSwgRGlzcG9zaXRpb25UeXBlIHR5cGUsCi0gICAgICAgICAgICBEaXNwb3NpdGlvbk1vZGlmaWVyW10gbW9kaWZpZXJzKQotICAgIHsKLSAgICAgICAgdGhpcyhhY3Rpb25Nb2RlLCBzZW5kaW5nTW9kZSwgdHlwZSk7Ci0gICAgICAgIHNldERpc3Bvc2l0aW9uTW9kaWZpZXJzKG1vZGlmaWVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBEaXNwb3NpdGlvbiBNb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcG9zdGlvbk1vZGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpc3Bvc2l0aW9uQWN0aW9uTW9kZSBnZXRBY3Rpb25Nb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWVsZEFjdGlvbk1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBEaXNwb3NpdGlvbiBNb2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaXNwb3N0aW9uTW9kZSBUaGUgZGlzcG9zdGlvbk1vZGUgdG8gc2V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEFjdGlvbk1vZGUoRGlzcG9zaXRpb25BY3Rpb25Nb2RlIGRpc3Bvc3Rpb25Nb2RlKQotICAgIHsKLSAgICAgICAgZmllbGRBY3Rpb25Nb2RlID0gZGlzcG9zdGlvbk1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBEaXNwb3NpdGlvbiBNb2RpZmllcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkaXNwb3N0aW9uTW9kaWZpZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEaXNwb3NpdGlvbk1vZGlmaWVyW10gZ2V0RGlzcG9zaXRpb25Nb2RpZmllcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkRGlzcG9zaXRpb25Nb2RpZmllcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBEaXNwb3NpdGlvbiBNb2RpZmllcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpc3Bvc3Rpb25Nb2RpZmllcnMgVGhlIGRpc3Bvc3Rpb25Nb2RpZmllcnMgdG8gc2V0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERpc3Bvc2l0aW9uTW9kaWZpZXJzKERpc3Bvc2l0aW9uTW9kaWZpZXJbXSBkaXNwb3N0aW9uTW9kaWZpZXJzKQotICAgIHsKLSAgICAgICAgZmllbGREaXNwb3NpdGlvbk1vZGlmaWVycyA9IGRpc3Bvc3Rpb25Nb2RpZmllcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBEaXNwb3NpdGlvbiBUeXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcG9zdGlvblR5cGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpc3Bvc2l0aW9uVHlwZSBnZXREaXNwb3NpdGlvblR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkRGlzcG9zaXRpb25UeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgRGlzcG9zaXRpb24gVHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlzcG9zdGlvblR5cGUgVGhlIGRpc3Bvc3Rpb25UeXBlIHRvIHNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREaXNwb3NpdGlvblR5cGUoRGlzcG9zaXRpb25UeXBlIGRpc3Bvc3Rpb25UeXBlKQotICAgIHsKLSAgICAgICAgZmllbGREaXNwb3NpdGlvblR5cGUgPSBkaXNwb3N0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoNjQpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiRGlzcG9zaXRpb246ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRBY3Rpb25Nb2RlKCkgPT0gbnVsbCA/ICIiIDogZ2V0QWN0aW9uTW9kZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgnLycpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRTZW5kaW5nTW9kZSgpID09IG51bGwgPyAiIiA6IGdldFNlbmRpbmdNb2RlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldERpc3Bvc2l0aW9uVHlwZSgpID09IG51bGwgPyAiIiA6IGdldERpc3Bvc2l0aW9uVHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBnZXREaXNwb3NpdGlvbk1vZGlmaWVycygpCi0gICAgICAgICAgICAgICAgJiYgZ2V0RGlzcG9zaXRpb25Nb2RpZmllcnMoKS5sZW5ndGggPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREaXNwb3NpdGlvbk1vZGlmaWVycygpLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXREaXNwb3NpdGlvbk1vZGlmaWVycygpW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlciB0aGUgU2VuZGluZyBNb2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VuZGluZ01vZGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERpc3Bvc2l0aW9uU2VuZGluZ01vZGUgZ2V0U2VuZGluZ01vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkU2VuZGluZ01vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBTZW5kaW5nIE1vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlbmRpbmdNb2RlIFRoZSBzZW5kaW5nTW9kZSB0byBzZXQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2VuZGluZ01vZGUoRGlzcG9zaXRpb25TZW5kaW5nTW9kZSBzZW5kaW5nTW9kZSkKLSAgICB7Ci0gICAgICAgIGZpZWxkU2VuZGluZ01vZGUgPSBzZW5kaW5nTW9kZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0Rpc3Bvc2l0aW9uQWN0aW9uTW9kZS5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9EaXNwb3NpdGlvbkFjdGlvbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViODgzZi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0Rpc3Bvc2l0aW9uQWN0aW9uTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0vKioKLSAqIEludGVyZmFjZSA8Y29kZT5EaXNwb3NpdGlvbkFjdGlvbk1vZGU8L2NvZGU+IG1hcmtzIGEgdHlwZSBlbmNhcHN1bGF0aW5nCi0gKiBkaXNwb3NpdGlvbiBhY3Rpb24gbW9kZSBpbmZvcm1hdGlvbiBhcyBkZWZpbmVkIGJ5IFJGQyAyMjk4LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3Bvc2l0aW9uQWN0aW9uTW9kZQotewotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0Rpc3Bvc2l0aW9uTW9kaWZpZXIuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb25Nb2RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJmMDZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb25Nb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0vKioKLSAqIEludGVyZmFjZSA8Y29kZT5EaXNwb3NpdGlvbk1vZGlmaWVyPC9jb2RlPiBtYXJrcyBhIHR5cGUgZW5jYXBzdWxhdGluZwotICogZGlzcG9zaXRpb24gbW9kaWZpZXIgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBieSBSRkMgMjI5OC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwb3NpdGlvbk1vZGlmaWVyCi17Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb25TZW5kaW5nTW9kZS5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9EaXNwb3NpdGlvblNlbmRpbmdNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjliOTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9EaXNwb3NpdGlvblNlbmRpbmdNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLS8qKgotICogSW50ZXJmYWNlIDxjb2RlPkRpc3Bvc2l0aW9uU2VuZGluZ01vZGU8L2NvZGU+IG1hcmtzIGEgdHlwZSBlbmNhcHN1bGF0aW5nCi0gKiBkaXNwb3NpdGlvbiBzZW5kaW5nIG1vZGUgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBieSBSRkMgMjI5OC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwb3NpdGlvblNlbmRpbmdNb2RlCi17Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb25UeXBlLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL0Rpc3Bvc2l0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE3ZGUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vRGlzcG9zaXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLS8qKgotICogSW50ZXJmYWNlIDxjb2RlPkRpc3Bvc2l0aW9uVHlwZTwvY29kZT4gbWFya3MgYSB0eXBlIGVuY2Fwc3VsYXRpbmcKLSAqIGRpc3Bvc2l0aW9uIHR5cGUgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBieSBSRkMgMjI5OC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNwb3NpdGlvblR5cGUKLXsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9NRE5GYWN0b3J5LmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01ETkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1MTRiMi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01ETkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVCb2R5UGFydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWFpbGV0LmJhc2UubWFpbC5NaW1lTXVsdGlwYXJ0UmVwb3J0OwotCi0vKioKLSAqIENsYXNzIDxjb2RlPk1ETkZhY3Rvcnk8L2NvZGU+IGNyZWF0ZXMgTWltZU11bHRpcGFydFJlcG9ydHMgY29udGFpbmluZwotICogTWVzc2FnZSBEZWxpdmVyeSBOb3RpZmljYXRpb25zIGFzIHNwZWNpZmllZCBieSBSRkMgMjI5OC4KLSAqLwotcHVibGljIGNsYXNzIE1ETkZhY3RvcnkKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwcml2YXRlIE1ETkZhY3RvcnkoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VycyBhIE1pbWVNdWx0aXBhcnRSZXBvcnQgY29udGFpbmluZyBhCi0gICAgICogTWVzc2FnZSBEZWxpdmVyeSBOb3RpZmljYXRpb24gYXMgc3BlY2lmaWVkIGJ5IFJGQyAyMjk4LgotICAgICAqIAotICAgICAqIEBwYXJhbSBodW1hblRleHQKLSAgICAgKiBAcGFyYW0gcmVwb3J0aW5nX1VBX25hbWUKLSAgICAgKiBAcGFyYW0gcmVwb3J0aW5nX1VBX3Byb2R1Y3QKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxfcmVjaXBpZW50Ci0gICAgICogQHBhcmFtIGZpbmFsX3JlY2lwaWVudAotICAgICAqIEBwYXJhbSBvcmlnaW5hbF9tZXNzYWdlX2lkCi0gICAgICogQHBhcmFtIGRpc3Bvc2l0aW9uCi0gICAgICogQHJldHVybiBNaW1lTXVsdGlwYXJ0UmVwb3J0Ci0gICAgICogQHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIE1pbWVNdWx0aXBhcnRSZXBvcnQgY3JlYXRlKFN0cmluZyBodW1hblRleHQsCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3J0aW5nX1VBX25hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3J0aW5nX1VBX3Byb2R1Y3QsCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxfcmVjaXBpZW50LAotICAgICAgICAgICAgU3RyaW5nIGZpbmFsX3JlY2lwaWVudCwKLSAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbF9tZXNzYWdlX2lkLAotICAgICAgICAgICAgRGlzcG9zaXRpb24gZGlzcG9zaXRpb24pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSBwYXJ0cy4gQWNjb3JkaW5nIHRvIFJGQyAyMjk4LCB0aGVyZSBhcmUgdHdvCi0gICAgICAgIC8vIGNvbXB1bHNvcnkgcGFydHMgYW5kIG9uZSBvcHRpb25hbCBwYXJ0Li4uCi0gICAgICAgIE1pbWVNdWx0aXBhcnRSZXBvcnQgbXVsdGlQYXJ0ID0gbmV3IE1pbWVNdWx0aXBhcnRSZXBvcnQoKTsKLSAgICAgICAgbXVsdGlQYXJ0LnNldFJlcG9ydFR5cGUoImRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbiIpOwotICAgICAgICAKLSAgICAgICAgLy8gUGFydCAxOiBUaGUgJ2h1bWFuLXJlYWRhYmxlJyBwYXJ0Ci0gICAgICAgIE1pbWVCb2R5UGFydCBodW1hblBhcnQgPSBuZXcgTWltZUJvZHlQYXJ0KCk7Ci0gICAgICAgIGh1bWFuUGFydC5zZXRUZXh0KGh1bWFuVGV4dCk7Ci0gICAgICAgIG11bHRpUGFydC5hZGRCb2R5UGFydChodW1hblBhcnQpOwotCi0gICAgICAgIC8vIFBhcnQgMjogTUROIFJlcG9ydCBQYXJ0Ci0gICAgICAgIC8vIDEpIHJlcG9ydGluZy11YS1maWVsZAotICAgICAgICBTdHJpbmdCdWlsZGVyIG1kblJlcG9ydCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoIlJlcG9ydGluZy1VQTogIik7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoKHJlcG9ydGluZ19VQV9uYW1lID09IG51bGwgPyAiIiA6IHJlcG9ydGluZ19VQV9uYW1lKSk7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoIjsgIik7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoKHJlcG9ydGluZ19VQV9wcm9kdWN0ID09IG51bGwgPyAiIiA6IHJlcG9ydGluZ19VQV9wcm9kdWN0KSk7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoIlxyXG4iKTsKLSAgICAgICAgLy8gMikgb3JpZ2luYWwtcmVjaXBpZW50LWZpZWxkCi0gICAgICAgIGlmIChudWxsICE9IG9yaWdpbmFsX3JlY2lwaWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWRuUmVwb3J0LmFwcGVuZCgiT3JpZ2luYWwtUmVjaXBpZW50OiAiKTsKLSAgICAgICAgICAgIG1kblJlcG9ydC5hcHBlbmQoInJmYzgyMjsgIik7Ci0gICAgICAgICAgICBtZG5SZXBvcnQuYXBwZW5kKG9yaWdpbmFsX3JlY2lwaWVudCk7Ci0gICAgICAgICAgICBtZG5SZXBvcnQuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gMykgZmluYWwtcmVjaXBpZW50LWZpZWxkCi0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoIkZpbmFsLVJlY2VwaWVudDogIik7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoInJmYzgyMjsgIik7Ci0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoKGZpbmFsX3JlY2lwaWVudCA9PSBudWxsID8gIiIgOiBmaW5hbF9yZWNpcGllbnQpKTsKLSAgICAgICAgbWRuUmVwb3J0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAvLyA0KSBvcmlnaW5hbC1tZXNzYWdlLWlkLWZpZWxkCi0gICAgICAgIG1kblJlcG9ydC5hcHBlbmQoIk9yaWdpbmFsLU1lc3NhZ2UtSUQ6ICIpOwotICAgICAgICBtZG5SZXBvcnQuYXBwZW5kKChvcmlnaW5hbF9tZXNzYWdlX2lkID09IG51bGwgPyAiIiA6IG9yaWdpbmFsX21lc3NhZ2VfaWQpKTsKLSAgICAgICAgbWRuUmVwb3J0LmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAvLyA1KSBkaXNwb3NpdGlvbi1maWVsZAotICAgICAgICBtZG5SZXBvcnQuYXBwZW5kKGRpc3Bvc2l0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICBtZG5SZXBvcnQuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgIE1pbWVCb2R5UGFydCBtZG5QYXJ0ID0gbmV3IE1pbWVCb2R5UGFydCgpOwotICAgICAgICBtZG5QYXJ0LnNldENvbnRlbnQobWRuUmVwb3J0LnRvU3RyaW5nKCksICJtZXNzYWdlL2Rpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvbiIpOwotICAgICAgICBtdWx0aVBhcnQuYWRkQm9keVBhcnQobWRuUGFydCk7Ci0KLSAgICAgICAgLy8gUGFydCAzOiBUaGUgb3B0aW9uYWwgdGhpcmQgcGFydCwgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgaXMgb21pdHRlZC4KLSAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBwcm9wb2dhdGUgb3Zlci1zaXplZCwgdmlydXMgaW5mZWN0ZWQgb3IKLSAgICAgICAgLy8gb3RoZXIgdW5kZXNpcmFibGUgbWFpbCEKLSAgICAgICAgLy8gVGhlcmUgaXMgdGhlIG9wdGlvbiBvZiBhZGRpbmcgYSBUZXh0L1JGQzgyMi1IZWFkZXJzIHBhcnQsIHdoaWNoCi0gICAgICAgIC8vIGluY2x1ZGVzIG9ubHkgdGhlIFJGQyA4MjIgaGVhZGVycyBvZiB0aGUgZmFpbGVkIG1lc3NhZ2UuIFRoaXMgaXMKLSAgICAgICAgLy8gZGVzY3JpYmVkIGluIFJGQyAxODkyLiBJdCB3b3VsZCBiZSBhIHVzZWZ1bCBhZGRpdGlvbiEgICAgICAgIAotICAgICAgICByZXR1cm4gbXVsdGlQYXJ0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9Nb2RpZmllckVycm9yLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4MmU1Yy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbjsKLQotCi0vKioKLSAqIENsYXNzIDxjb2RlPk1vZGlmaWVyRXJyb3I8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmllckVycm9yIGltcGxlbWVudHMgRGlzcG9zaXRpb25Nb2RpZmllcgotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBNb2RpZmllckVycm9yKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiZXJyb3IiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vTW9kaWZpZXJFeHBpcmVkLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyRXhwaXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODBhNzAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vTW9kaWZpZXJFeHBpcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5Nb2RpZmllckV4cGlyZWQ8L2NvZGU+Ci0gKi8gICAgCi1wdWJsaWMgY2xhc3MgTW9kaWZpZXJFeHBpcmVkIGltcGxlbWVudHMgRGlzcG9zaXRpb25Nb2RpZmllcgotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBNb2RpZmllckV4cGlyZWQoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiZXhwaXJlZCI7Ci0gICAgfSAgICAgICAgCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vTW9kaWZpZXJGYWlsZWQuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vTW9kaWZpZXJGYWlsZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZDc3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyRmFpbGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5Nb2RpZmllckZhaWxlZDwvY29kZT4KLSAqLyAgICAKLXB1YmxpYyBjbGFzcyBNb2RpZmllckZhaWxlZCBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uTW9kaWZpZXIKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kaWZpZXJGYWlsZWQoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiZmFpbGVkIjsKLSAgICB9ICAgICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9Nb2RpZmllck1haWxib3hUZXJtaW5hdGVkLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyTWFpbGJveFRlcm1pbmF0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MTVjNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyTWFpbGJveFRlcm1pbmF0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbGV0Lm1kbjsKLQotCi0vKioKLSAqIENsYXNzIDxjb2RlPk1vZGlmaWVyTWFpbGJveFRlcm1pbmF0ZWQ8L2NvZGU+Ci0gKi8gICAgCi1wdWJsaWMgY2xhc3MgTW9kaWZpZXJNYWlsYm94VGVybWluYXRlZCBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uTW9kaWZpZXIKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kaWZpZXJNYWlsYm94VGVybWluYXRlZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJtYWlsYm94LXRlcm1pbmF0ZWQiOwotICAgIH0gICAgICAgIAotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyU3VwZXJzZWRlZC5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9Nb2RpZmllclN1cGVyc2VkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4Mzc1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyU3VwZXJzZWRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0KLS8qKgotICogQ2xhc3MgPGNvZGU+TW9kaWZpZXJTdXBlcnNlZGVkPC9jb2RlPgotICovICAgIAotcHVibGljIGNsYXNzIE1vZGlmaWVyU3VwZXJzZWRlZCBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uTW9kaWZpZXIKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kaWZpZXJTdXBlcnNlZGVkKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gInN1cGVyc2VkZWQiOwotICAgIH0gICAgICAgIAotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyV2FybmluZy5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9Nb2RpZmllcldhcm5pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZjVkMS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL01vZGlmaWVyV2FybmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0KLS8qKgotICogQ2xhc3MgPGNvZGU+TW9kaWZpZXJXYXJuaW5nPC9jb2RlPgotICovICAgIAotcHVibGljIGNsYXNzIE1vZGlmaWVyV2FybmluZyBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uTW9kaWZpZXIKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kaWZpZXJXYXJuaW5nKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gIndhcm5pbmciOwotICAgIH0gICAgICAgIAotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1NlbmRpbmdNb2RlQXV0b21hdGljLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1NlbmRpbmdNb2RlQXV0b21hdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTc4YjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9TZW5kaW5nTW9kZUF1dG9tYXRpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0KLS8qKgotICogQ2xhc3MgPGNvZGU+U2VuZGluZ01vZGVBdXRvbWF0aWM8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZW5kaW5nTW9kZUF1dG9tYXRpYyBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uU2VuZGluZ01vZGUKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VuZGluZ01vZGVBdXRvbWF0aWMoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiTUROLXNlbnQtYXV0b21hdGljYWxseSI7Ci0gICAgfSAgICAgICAgCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vU2VuZGluZ01vZGVNYW51YWwuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vU2VuZGluZ01vZGVNYW51YWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyM2RjNi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1NlbmRpbmdNb2RlTWFudWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5TZW5kaW5nTW9kZU1hbnVhbDwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFNlbmRpbmdNb2RlTWFudWFsIGltcGxlbWVudHMgRGlzcG9zaXRpb25TZW5kaW5nTW9kZQotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBTZW5kaW5nTW9kZU1hbnVhbCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJNRE4tc2VudC1tYW51YWxseSI7Ci0gICAgfSAgICAgICAgIAotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1R5cGVEZWxldGVkLmphdmEgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1R5cGVEZWxldGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMGExOTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlRGVsZXRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0KLS8qKgotICogQ2xhc3MgPGNvZGU+VHlwZURlbGV0ZWQ8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlRGVsZXRlZCBpbXBsZW1lbnRzIERpc3Bvc2l0aW9uVHlwZQotewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVsZXRlZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJkZWxldGVkIjsKLSAgICB9ICAgICAgICAgCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZURlbmllZC5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlRGVuaWVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODE4M2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlRGVuaWVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5UeXBlRGVuaWVkPC9jb2RlPgotICovICAgIAotcHVibGljIGNsYXNzIFR5cGVEZW5pZWQgaW1wbGVtZW50cyBEaXNwb3NpdGlvblR5cGUKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlbmllZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJkZW5pZWQiOwotICAgIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZURpc3BhdGNoZWQuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZURpc3BhdGNoZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MTQ4Mi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1R5cGVEaXNwYXRjaGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5UeXBlRGlzcGF0Y2hlZDwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVEaXNwYXRjaGVkIGltcGxlbWVudHMgRGlzcG9zaXRpb25UeXBlCi17Ci0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGlzcGF0Y2hlZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJkaXNwYXRjaGVkIjsKLSAgICB9ICAgICAgICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvbWRuL1R5cGVEaXNwbGF5ZWQuamF2YSBiL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZURpc3BsYXllZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWY0MDMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZURpc3BsYXllZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsZXQubWRuOwotCi0KLS8qKgotICogQ2xhc3MgPGNvZGU+VHlwZURpc3BsYXllZDwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVEaXNwbGF5ZWQgaW1wbGVtZW50cyBEaXNwb3NpdGlvblR5cGUKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURpc3BsYXllZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJkaXNwbGF5ZWQiOwotICAgIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZUZhaWxlZC5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlRmFpbGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjExNDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlRmFpbGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5UeXBlRmFpbGVkPC9jb2RlPgotICovICAgIAotcHVibGljIGNsYXNzIFR5cGVGYWlsZWQgaW1wbGVtZW50cyBEaXNwb3NpdGlvblR5cGUKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZUZhaWxlZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJmYWlsZWQiOwotICAgIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vVHlwZVByb2Nlc3NlZC5qYXZhIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlUHJvY2Vzc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjA1NjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9UeXBlUHJvY2Vzc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWxldC5tZG47Ci0KLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5UeXBlUHJvY2Vzc2VkPC9jb2RlPgotICovICAgIAotcHVibGljIGNsYXNzIFR5cGVQcm9jZXNzZWQgaW1wbGVtZW50cyBEaXNwb3NpdGlvblR5cGUKLXsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVByb2Nlc3NlZCgpCi0gICAgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJwcm9jZXNzZWQiOwotICAgIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9tZG4vcGFja2FnZS5odG1sIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNWFlNzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbGV0L21kbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gIEAoIylwYWNrYWdlLmh0bWwKLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgCi0tLT4KLQotPC9IRUFEPgotPEJPRFk+Ci0KLTxwPjxhYmJyIHRpdGxlPSdNZXNzYWdlIERlbGl2ZXJ5IE5vdGlmaWNhdGlvbnMnPk1ETjwvYWJicj4gCi1mb3IgSmF2YU1haWwuPC9wPgotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9wYWNrYWdlLmh0bWwgYi90cnVuay9tYWlsZXQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsZXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ5OWFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWxldC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gIEAoIylwYWNrYWdlLmh0bWwKLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgCi0tLT4KLQotPC9IRUFEPgotPEJPRFk+Ci0KLTxwPlNpZXZlIGZpbHRlcmluZyBtYWlsZXQuPC9wPgotPHA+UHJvdmlkZXMgc3VpdGFibGUgYWN0aW9ucyBhbmQgYWRhcHRlcnMgZm9yIFNpZXZlIHVzZSBpbiBhIDxhIGhyZWY9J2h0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL21haWxldCc+TWFpbGV0PC9hPiBjb250YWluZXIuPC9wPgotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvbWFpbi9yZXNvdXJjZXMvc2lldmVDb25maWcueG1sIGIvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL3Jlc291cmNlcy9zaWV2ZUNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2MwNmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9tYWluL3Jlc291cmNlcy9zaWV2ZUNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gLS0+Ci08IS0tIFNpZXZlIGNvbmZpZ3VyYXRpb24uIC0tPgotPHNpZXZlPgotICAgIDwhLS0gRGVjbGFyZSBzdXBwb3J0ZWQgY29tbWFuZCBtYXBwaW5ncyAtLT4KLSAgICA8Y29tbWFuZE1hcD4KLSAgICAgICAgPCEtLSBDb25kaXRpb24gQ29tbWFuZHMgLS0+Ci0gICAgICAgIDwhLS0gIFJGQzMwODIgLSBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IHRoZXNlOiAtLT4KLSAgICAgICAgPGVudHJ5PiAKLSAgICAgICAgICAgIDxuYW1lPmlmPC9uYW1lPiAKLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5JZjwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5lbHNlPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2U8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5lbHNpZjwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5FbHNpZjwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPnJlcXVpcmU8L25hbWU+Ci0gICAgICAgICAgICA8Y2xhc3M+b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuUmVxdWlyZTwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPnN0b3A8L25hbWU+Ci0gICAgICAgICAgICA8Y2xhc3M+b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuU3RvcDwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0KLSAgICAgICAgPCEtLSAgQWN0aW9uIENvbW1hbmRzIC0tPiAgICAgICAKLSAgICAgICAgPCEtLSAgUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlc2U6IC0tPgotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5rZWVwPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLktlZXA8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5kaXNjYXJkPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkRpc2NhcmQ8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5yZWRpcmVjdDwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5SZWRpcmVjdDwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgICA8IS0tICBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIFNIT1VMRCBzdXBwb3J0IHRoZXNlOiAtLT4gICAgICAKLSAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPG5hbWU+cmVqZWN0PC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLlJlamVjdDwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPmZpbGVpbnRvPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLkZpbGVJbnRvPC9jbGFzcz4KLSAgICAgICAgPC9lbnRyeT4gICAgICAgICAgICAKLQotICAgICAgICA8IS0tIEpVbml0IENvbW1hbmRzIGZvciBUZXN0aW5nIC0tPiAgICAgICAKLSAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPG5hbWU+dGhyb3d0ZXN0ZXhjZXB0aW9uPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmp1bml0LmNvbW1hbmRzLlRocm93VGVzdEV4Y2VwdGlvbjwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+Ci0gICAgICAgIAotICAgICAgICA8IS0tIEV4dGVuc2lvbiBDb21tYW5kcyAtLT4gICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPmxvZzwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5leHRlbnNpb25zLkxvZzwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgPC9jb21tYW5kTWFwPgotCi0gICAgPCEtLSBEZWNsYXJlIHN1cHBvcnRlZCB0ZXN0IG1hcHBpbmdzIC0tPiAgICAKLSAgICA8dGVzdE1hcD4KLSAgICAgICAgPCEtLSAgUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlc2UgdGVzdHM6IC0tPgotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5hZGRyZXNzPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFkZHJlc3M8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5hbGxvZjwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BbGxPZjwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPmFueW9mPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFueU9mPC9jbGFzcz4KLSAgICAgICAgPC9lbnRyeT4gICAgICAgICAgICAKLSAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPG5hbWU+ZXhpc3RzPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkV4aXN0czwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPmZhbHNlPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkZhbHNlPC9jbGFzcz4KLSAgICAgICAgPC9lbnRyeT4gICAgICAgICAgICAKLSAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPG5hbWU+aGVhZGVyPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkhlYWRlcjwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgICAgIDxlbnRyeT4KLSAgICAgICAgICAgIDxuYW1lPm5vdDwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5Ob3Q8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5zaXplPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLlNpemU8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT50cnVlPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLlRydWU8L2NsYXNzPgotICAgICAgICA8L2VudHJ5PiAgICAgICAgICAgIAotCi0gICAgICAgIDwhLS0gIFJGQzMwODIgLSBJbXBsZW1lbnRhdGlvbnMgU0hPVUxEIHN1cHBvcnQgdGhlc2U6IC0tPgotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5lbnZlbG9wZTwvbmFtZT4KLSAgICAgICAgICAgIDxjbGFzcz5vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5vcHRpb25hbC5FbnZlbG9wZTwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgCi0gICAgPC90ZXN0TWFwPgotCi0gICAgPCEtLSBEZWNsYXJlIHN1cHBvcnRlZCBjb21wYXJhdG9yIG1hcHBpbmdzIC0tPiAgICAKLSAgICA8Y29tcGFyYXRvck1hcD4KLSAgICAgICAgPCEtLSAgUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlc2U6IC0tPgotICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8bmFtZT5pO29jdGV0PC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk9jdGV0PC9jbGFzcz4KLSAgICAgICAgPC9lbnRyeT4gICAgICAgICAgICAKLSAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPG5hbWU+aTthc2NpaS1jYXNlbWFwPC9uYW1lPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkFzY2lpQ2FzZW1hcDwvY2xhc3M+Ci0gICAgICAgIDwvZW50cnk+ICAgICAgICAgICAgICAgICAgICAKLSAgICA8L2NvbXBhcmF0b3JNYXA+ICAgICAgICAgICAgICAgICAgICAKLTwvc2lldmU+ICAgICAgICAgICAgCmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZiBiL3RydW5rL21haWxldC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NjMTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbGV0L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmIGIvdHJ1bmsvbWFpbGV0L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdlMzRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haWxldC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2phbWVzLWpzaWV2ZS1sb2dvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL21haWxldC9zcmMvc2l0ZS9zaXRlLnhtbCBiL3RydW5rL21haWxldC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlNWI2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9tYWlsZXQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB1bmRlciB0aGUgTGljZW5zZS4gICAgDQotLS0+DQotPHByb2plY3QgbmFtZT0ialNpZXZlIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+SkFNRVMgalNpZXZlPC9uYW1lPgotICAgIDxzcmM+aW1hZ2VzL2phbWVzLWpzaWV2ZS1sb2dvLmdpZjwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4NCi0gICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPg0KLSAgICA8c3JjPmltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZjwvc3JjPg0KLSAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4NCi0gIDwvYmFubmVyUmlnaHQ+IA0KLQotICA8Ym9keT4KLQotICAgIDxtZW51IG5hbWU9ImpTaWV2ZSBNYWlsZXQiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciIGhyZWY9ImluZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9J0NhdGFsb2cnIGhyZWY9J21haWxldC1yZXBvcnQuaHRtbCcvPgotICAgICAgPGl0ZW0gCi0gICAgICAgIG5hbWU9IkRPQVAiIAotICAgICAgICBocmVmPSJkb2FwX2FwYWNoZS1qc2lldmUtbWFpbGV0LnJkZiIgCi0gICAgICAgIGltZz0naHR0cDovL3d3dy53My5vcmcvUkRGL2ljb25zL3JkZl9tZXRhZGF0YV9idXR0b24uMzInLz4KLSAgICA8L21lbnU+Ci0gICAgCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIiAvPgotICAgIAotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9tYWlsZXQvc3JjL3NpdGUveGRvYy9pbmRleC54bWwgYi90cnVuay9tYWlsZXQvc3JjL3NpdGUveGRvYy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYThlYmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbGV0L3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIAotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgIAotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgIAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgIAotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgCi0tLT4KLTxkb2N1bWVudD4KLQotIDxwcm9wZXJ0aWVzPgotICA8dGl0bGU+T3ZlcnZpZXc8L3RpdGxlPgotICA8YXV0aG9yIGVtYWlsPSJqc2lldmUtZGV2QGpha2FydGEuYXBhY2hlLm9yZyI+alNpZXZlIFByb2plY3Q8L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotPHNlY3Rpb24gbmFtZT0iV2hhdCBpcyBqU2lldmU/Ij4KLTxwPgotalNpZXZlIGlzIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2lldmUgbWFpbCBmaWx0ZXJpbmcgbGFuZ3VhZ2UgZGVmaW5lZCBieSAKLTxhIGhyZWY9J2h0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzMwMjgudHh0Jz5SRkMgMzAyODwvYT4uIGpTaWV2ZSBpcyBpbXBsZW1lbnRlZCAKLWFzIGEgbGFuZ3VhZ2UgcHJvY2Vzc29yIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byBhbnkgaW50ZXJuZXQgbWFpbCBhcHBsaWNhdGlvbiB0byBhZGQgCi1TaWV2ZSBzdXBwb3J0LgotPC9wPgotPHN1YnNlY3Rpb24gbmFtZT0nU2lldmUgTWFpbGV0cyc+Ci08cD4KLVRoaXMgbGlicmFyeSBjb250YWlucyBtYWlsZXRzIHdoaWNoIGFsbG93IFNpZXZlIGZpbHRlcnMgdG8gYmUgZWFzaWx5IGZpdHRpbmcKLWludG8gYW55IGVudGVycHJpc2UgbWFpbCBzZXJ2ZXIgc3VwcG9ydGluZyB0aGUgCi08YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9tYWlsZXQnIHJlbD0ndGFnJz5NYWlsZXQgQVBJPC9hPi4gVGhpcyBsaWJyYXJ5Ci1zdXBwbGllcyBTaWV2ZSBtYWlsIGZpbHRlcmluZyBzdXBwb3J0IGZvciBKYW1lcy4KLTwvcD48cD4KLUZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgPGEgaHJlZj0nbWFpbGV0LXJlcG9ydC5odG1sJz5DYXRlbG9nPC9hPi4KLTwvcD4KLTwvc3Vic2VjdGlvbj4KLTwvc2VjdGlvbj4KLTwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9tYWluL0JVSUxESU5HLnR4dCBiL3RydW5rL21haW4vQlVJTERJTkcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhmNGVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vQlVJTERJTkcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQlVJTERJTkcgSlNJRVZFIFdJVEggTUFWRU4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLTEpIEluc3RhbGwgbWF2ZW4gMi4wLjkKLQotMikgQWRkIG1hdmVuIHRvIHlvdXIgcGF0aCBhbmQgbWFrZSBzdXJlIHlvdSBhbHNvIGhhdmUgYSBKQVZBX0hPTUUgZW52aXJvbm1lbnQKLSAgIHZhcmlhYmxlIHRvIHBvaW50IGEgamF2YSAxLjQrIHZpcnR1YWwgbWFjaGluZS4KLQotMykgUnVuICJtdm4gcGFja2FnZSIKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCVUlMRElORyBKU0lFVkUgV0lUSCBBTlQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRoZSBzb3VyY2UgdHJ1bmsgZm9yIEpTSUVWRSBubyBsb25nZXIgaW5jbHVkZXMgQW50LCBzbyBpbiBvcmRlciB0bwotYnVpbGQgSlNJRVZFLCB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgQW50IGFzIHdlbGwgYXMgYWNxdWlyZSBKU0lFVkUKLXNvdXJjZSBmcm9tIHN1YnZlcnNpb24gb3IgYSBzb3VyY2UgdGFyYmFsbC4KLQotSlNJRVZFIHVzZXMgSmF2YUNDIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0IHBhcnNlci4KLVVuZm9ydHVuYXRlbHksIHRob3VnaCB0aGUgbGF0ZXN0IGNvZGViYXNlIGlzIG5vdyBhdmFpbGFibGUgdW5kZXIgdGhlIEJTRAotbGljZW5zZSB0aGVyZSBpcyAoYXQgdGhpcyB0aW1lKSBubyBvZmZpY2lhbCBvcGVuIHNvdXJjZWQgcmVsZWFzZS4gU28KLXRvIGJ1aWxkIEpTSUVWRSBkb3dubG9hZCB0aGUgSmF2YUNDIDQuMCByZWxlYXNlIGZyb20gCi1odHRwczovL2phdmFjYy5kZXYuamF2YS5uZXQvLiBFeHRyYWN0IHRoZSBqYXZhY2MuamFyIGFuZCBjb3B5IGludG8gdGhlCi1yb290IG9mIHRoZSBKU0lFVkUgZGlyZWN0b3J5LiBSZW5hbWUgdGhpcyB0byBqYXZhY2MtNC4wLmphci4KLQotWW91IGFsc28gaGF2ZSB0byBkb3dubG9hZCBhY3RpdmF0aW9uLTEuMS4xLmphciBhbmQgbWFpbC0xLjQuMS5qYXIgZmlsZXMgdG8gCi10aGUgcm9vdCBmb2xkZXIgaW4gb3JkZXIgdG8gYnVpbGQvcnVuIHVuaXQgdGVzdHMuCi0KLVN0ZXBzOgotCi0xKSBJbnN0YWxsIEFudCAodjEuNi41IGFzIG9mIHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZykKLQotMikgQWRkIEFudCB0byB5b3VyIHBhdGguICBGb3IgbWUsIEkgZG8gdGhlIGZvbGxvd2luZzoKLSAgICQgdGFyIHp4dmYgYXBhY2hlLWFudC0xLjYuNS1iaW4udGFyLmd6Ci0gICAkIG12IGFwYWNoZS1hbnQtMS42LjUgL3Vzci9sb2NhbAotICAgJCBsbiAtc2YgL3Vzci9sb2NhbC9hcGFjaGUtYW50LTEuNi41IC91c3IvbG9jYWwvYW50Ci0gICAkIGxuIC1zZiAvdXNyL2xvY2FsL2FudC9iaW4vYW50IC91c3IvbG9jYWwvYmluL2FudAotCi0zKSBDaGFuZ2UgYW55IEpTSUVWRS1yZWxhdGVkIGJ1aWxkIHNjcmlwdHMgdGhhdCB5b3UgbWlnaHQgaGF2ZSB0byBjYWxsCi0gICAgQW50IGRpcmVjdGx5LCBlLmcuOiAgLi9idWlsZC5zaCA8dGFyZ2V0PiA9PT4gYW50IDx0YXJnZXQ+Ci0KLVRoYXQncyBpdC4gIFBsZWFzZSBjb250YWN0IGdlbmVyYWxAamFtZXMuYXBhY2hlLm9yZyBpZiB5b3UgaGF2ZSBhbnkKLXByb2JsZW1zLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU0VUIFVQIEpTSUVWRSBJTlNJREUgRUNMSVBTRQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVlvdSBjYW4gdXNlIG1hdmVuIGZhY2lsaXR5IHRvIHNldHVwIGFuIGVjbGlwc2UgcHJvamVjdDoKLW12biBlY2xpcHNlOmVjbGlwc2UKLQotWW91IGNhbiBhbHNvIHVzZSBxNGUgcGx1Z2luIGZyb20gZWNsaXBzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9tYWluL0xJQ0VOU0UuYXBhY2hlIGIvdHJ1bmsvbWFpbi9MSUNFTlNFLmFwYWNoZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkOGM1OC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL0xJQ0VOU0UuYXBhY2hlCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9OT1RJQ0UuYmFzZSBiL3RydW5rL21haW4vTk9USUNFLmJhc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTAwMTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9OT1RJQ0UuYmFzZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICA9PSAgICAgIE5PVElDRSBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgID09DQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSAgIEFwYWNoZSBKYW1lcyBKU2lldmUgTGlicmFyeQ0KLSAgIENvcHlyaWdodCAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLQ0KLSAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQNCi0gICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9idWlsZC54bWwgYi90cnVuay9tYWluL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1NGJiMC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0galNpZXZlIGJ1aWxkIGZpbGUgCi0KLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tPgotCi08cHJvamVjdCBuYW1lPSdqc2lldmUtbWFpbicgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0gICAgCi0gICAgPCEtLQotICAgIEdpdmUgdXNlciBhIGNoYW5jZSB0byBvdmVycmlkZSB3aXRob3V0IGVkaXRpbmcgdGhpcyBmaWxlCi0gICAgKGFuZCB3aXRob3V0IHR5cGluZyAtRCBlYWNoIHRpbWUgaGUgY29tcGlsZXMgaXQpCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5IGZpbGU9Ii5hbnQucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iLi4vaW5jbHVkZS5wcm9wZXJ0aWVzIiAvPgotICAgIDxwcm9wZXJ0eSBmaWxlPSIuLi9kZWZhdWx0LnByb3BlcnRpZXMiIC8+Ci0KLSAgICA8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bG9nNGouamFyfSIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLmNsYXNzZXN9IiAvPgotICAgIDwvcGF0aD4KLQotICAgIDxwYXRoIGlkPSJtYWlsLmNsYXNzLnBhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249JyR7bWFpbC5qYXJ9JyAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249JyR7YWN0aXZhdGlvbi5qYXJ9JyAvPgotICAgIDwvcGF0aD4KLQotICAgIDxwYXRoIGlkPSJwcm9qZWN0LnRlc3QuY2xhc3MucGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiIC8+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtYWlsLmNsYXNzLnBhdGgiIC8+Ci0gICAgPC9wYXRoPgotICAgIAotICAgIDxpbXBvcnQgZmlsZT0nLi4vYnVpbGQueG1sJy8+Ci0gICAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJydW4tdGVzdHMiIGRlc2NyaXB0aW9uPSIgLSBtYWluIHRhcmdldCIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXBlbmRzPSJwcmVwcm9jZXNzIiBkZXNjcmlwdGlvbj0iIC0gcGFwYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgW2ludGVybmFsXSI+Ci0gICAgICAgIDxDaGVja01haWxDb25kaXRpb25zLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8IS0tCi0gICAgVW5sZXNzIHlvdSB3YW50IHRvIGFsdGVyIHRoZSBTaWV2ZSBncmFtbWFyLCBleHByZXNzZWQgYnkgdGhlIHNlaXZlLmpqdCAKLSAgICBmaWxlLCBpcyBidWlsdCwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIGEgYmxhY2sgYm94LgotICAgIE9yIHplbiBmb3IgdGhlIG1vcmUgc3Bpcml0dWFsIGFtb25nc3QgeW91LgotICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJwcmVwcm9jZXNzIiBkZXNjcmlwdGlvbj0iIC0gZ2VuZXJhdGUgc291cmNlIGZyb20gZ3JhbW1hciAgW2ludGVybmFsXSI+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgR2VuZXJhdGUgSmF2YUNDIHNvdXJjZSBpbnNlcnRpbmcgcGFyc2UgdHJlZSBidWlsZGluZyBhY3Rpb25zIAotICAgICAgICBhbmQgdGhlIEphdmEgc291cmNlIGZvciB0aGUgcGFyc2UgY2xhc3Nlcy4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuc3JjfS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvZ2VuZXJhdGVkL2FkZHJlc3MiIC8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iamp0cmVlIiBmb3JrPSJ5ZXMiIGZhaWxvbmVycm9yPSJ0cnVlIiBkaXI9IiR7YnVpbGQuc3JjfSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7amF2YWNjLmRpcn0vc2lldmUvc2lldmUuamp0IiAvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YWNjLmphcn0iIC8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iamp0cmVlIiBmb3JrPSJ5ZXMiIGZhaWxvbmVycm9yPSJ0cnVlIiBkaXI9IiR7YnVpbGQuc3JjfSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7amF2YWNjLmRpcn0vYWRkcmVzcy9BZGRyZXNzTGlzdFBhcnNlci5qanQiIC8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhY2MuamFyfSIgLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLQotICAgICAgICA8IS0tIEdlbmVyYXRlIEphdmEgc291cmNlIGZyb20gdGhlIEphdmFDQyBzb3VyY2UgLS0+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iamF2YWNjIiBmb3JrPSJ5ZXMiIGZhaWxvbmVycm9yPSJ0cnVlIiBkaXI9IiR7YnVpbGQuc3JjfSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7YnVpbGQuc3JjfS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvZ2VuZXJhdGVkL3NpZXZlLmpqIiAvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YWNjLmphcn0iIC8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iamF2YWNjIiBmb3JrPSJ5ZXMiIGZhaWxvbmVycm9yPSJ0cnVlIiBkaXI9IiR7YnVpbGQuc3JjfSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7YnVpbGQuc3JjfS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvZ2VuZXJhdGVkL2FkZHJlc3MvQWRkcmVzc0xpc3RQYXJzZXIuamoiIC8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhY2MuamFyfSIgLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlcGFyZSIgZGVzY3JpcHRpb249IiAtIGNvbXBpbGVzIHRlc3QgYW5kIG1haW4gc291cmNlIj4KLSAgICAgICAgPENvbXBpbGVNYWluPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke2J1aWxkLnNyY30iIC8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7amF2YS5kaXJ9IiAvPgotICAgICAgICA8L0NvbXBpbGVNYWluPgotICAgICAgICA8Q29tcGlsZVRlc3RzLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iIC0gamFycyBjbGFzc2VzIj4KLSAgICAgICAgPEphciBuYW1lPScnIHByZWZpeD0nJy8+ICAgICAKLSAgICAKLSAgICAgICAgPCEtLSBNYWtlIGpTaWV2ZSBqVW5pdCBqYXItLT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iTWFraW5nIGpTaWV2ZSBqVW5pdCBKYXIgKCR7bmFtZX0tdGVzdHMtJHt2ZXJzaW9ufS5qYXIpIiAvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGlifS8ke25hbWV9LXRlc3RzLSR7dmVyc2lvbn0uamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXMudGVzdH0iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qc2lldmUvKioiIC8+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNyZWF0ZWQtQnkiIHZhbHVlPScke2NyZWF0b3J9JyAvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iWC1Db21waWxlLVNvdXJjZS1KREsiIHZhbHVlPScke2pkay5zb3VyY2V9JyAvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iWC1Db21waWxlLVRhcmdldC1KREsiIHZhbHVlPScke2pkay50YXJnZXR9JyAvPgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgPC9qYXI+Ci0KLSAgICAgICAgPGNvcHkgdG9kaXI9JyR7bGliLmpzaWV2ZS5kaXJ9JyBmaWxlPScke2J1aWxkLmxpYn0vJHtuYW1lfS10ZXN0cy0ke3ZlcnNpb259LmphcicgLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzIiBkZXBlbmRzPSJqYXIiIGRlc2NyaXB0aW9uPSIgLSBydW5zIGFsbCB0ZXN0cyI+Ci0gICAgICAgIDxSdW5UZXN0cy8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iIC0gY2xlYW5zIGJ1aWxkIGZpbGVzIj4KLSAgICAgICAgPENsZWFuLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idXNhZ2UiIGRlc2NyaXB0aW9uPSIgLSBwcmludHMgaGVscCI+Ci0gICAgICAgIDxVc2FnZS8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vcG9tLnhtbCBiL3RydW5rL21haW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkNTFhOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICAtLT4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5qc2lldmUtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjAuNDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+QXBhY2hlIEpBTUVTIGpTaWV2ZTwvbmFtZT4KLSAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8ZGVzY3JpcHRpb24+Ci1BcGFjaGUgalNpZXZlIGlzIGEgc2VydmVyIHNpZGUgbWFpbCBmaWx0ZXJpbmcgc3lzdGVtIAotaW1wbGVtZW50aW5nIFJGQzMwMjguIEFwYWNoZSBqU2lldmUgaXMgZGV2ZWxvcGVkIGJ5IHRoZSAKLUpBTUVTIHByb2plY3QuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDx1cmw+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlPC91cmw+Ci0gIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0gIAotICA8cHJvcGVydGllcz4KLSAgICA8IS0tCi0gICAgVGhlIHdlYnNpdGUgaXMgY29tbWl0dGVkIHRvIHN1YnZlcnNpb24uIFRoaXMgcHJvcGVydHkgY2FuIGJlIG92ZXJyaWRlbgotICAgIHRvIHVwbG9hZCB0aGUgc2l0ZSB0byBhIGxvY2FsIHN0YWdpbmcgbG9jYXRpb24uCi0gICAgRm9yIGV4YW1wbGUsIGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIH4vLm0yL3NldHRpbmdzLnhtbCB3aWxsIHVwbG9hZAotICAgIHRvIGxvY2FsaG9zdDoKLSAgICAKLSAgICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgIDxpZD5tYWluPC9pZD4KLSAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgotICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgICA8amFtZXMud3d3PnNjcDovL2xvY2FsaG9zdC93d3c8L2phbWVzLnd3dz4KLSAgICAgICAgICAgICAgPGphbWVzLnd3dy5pZD5sb2NhbGhvc3Q8L2phbWVzLnd3dy5pZD4KLSAgICAgIC4uLgotICAgIC0tPgotICAgIDwhLS0gR2VuZXJhbCBsb2NhdGlvbiBmb3Igc2l0ZSBzdGFnZSAtLT4KLSAgICA8amFtZXMud3d3PnNjcDovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9qYW1lcy5hcGFjaGUub3JnLzwvamFtZXMud3d3PgotICAgIDwhLS0gUHJvamVjdCBzcGVjaWZpYyBsb2NhdGlvbiwgYWxsb3dpbmcgc3BlY2lmaWMgb3ZlcnJpZGUgLS0+Ci0gICAgPGphbWVzLmpzaWV2ZS53d3c+JHtqYW1lcy53d3d9L2pzaWV2ZS88L2phbWVzLmpzaWV2ZS53d3c+Ci0gICAgPCEtLSBPdmVycmlkZGluZyB0aGlzIHZhbHVlIGFsbG93cyBzaW5nbGUgc2V0IG9mIGxvb3BiYWNrIHNldHRpbmdzIHRvIGJlIG1haW50YWluZWQgLS0+Ci0gICAgPGphbWVzLnd3dy5pZD5qc2lldmUtd2Vic2l0ZTwvamFtZXMud3d3LmlkPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNpdGU+Ci0gICAgICA8aWQ+JHtqYW1lcy53d3cuaWR9PC9pZD4KLSAgICAgIDx1cmw+JHtqYW1lcy5qc2lldmUud3d3fS9tYWluPC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLQotICA8aXNzdWVNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+SklSQTwvc3lzdGVtPgotICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRTwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2phbWVzL2pzaWV2ZS90YWdzL2pzaWV2ZS1wcm9qZWN0LTAuNDwvdXJsPgotICA8L3NjbT4KLSAgCi0gIDxyZXBvc2l0b3JpZXM+Ci0gIAk8IS0tIGVuYWJsZSBjZW50cmFsIHRoYXQgaXMgb3RoZXJ3aXNlIGRpc2FibGVkIGJ5IHRoZSBwYXJlbnQgcG9tLiAtLT4KLSAgCTxyZXBvc2l0b3J5PgotICAJCTxpZD5jZW50cmFsPC9pZD4KLSAgCQk8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yPC91cmw+Ci0gIAkJPHJlbGVhc2VzPgotICAJCQk8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAJCTwvcmVsZWFzZXM+Ci0gIAk8L3JlcG9zaXRvcnk+Ci0gIDwvcmVwb3NpdG9yaWVzPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5tYWlsPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWFpbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5hY3RpdmF0aW9uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotICAgIAotICAgIDxwbHVnaW5zPiAgICAKLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhY2MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtamp0cmVlPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+amp0cmVlLWphdmFjYzwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgIAk8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgCTxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZG9hcC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+IAotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgICA8cnVsZXNldHM+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sPC9ydWxlc2V0PgotICAgICAgICAgIDwvcnVsZXNldHM+Ci0gICAgICAgICAgPGZvcm1hdD54bWw8L2Zvcm1hdD4KLSAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgPHNvdXJjZUVuY29kaW5nPnV0Zi04PC9zb3VyY2VFbmNvZGluZz4KLSAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC1iZXRhLTc8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5yYXQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMzwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgPGV4Y2x1ZGU+Tk9USUNFLmJhc2U8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5MSUNFTlNFLmFwYWNoZTwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPnJlbGVhc2UucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD50YWdsaXN0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+amF2YWNjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0gIAotICA8bWFpbGluZ0xpc3RzPgotICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgIDxuYW1lPkFwYWNoZSBKYW1lcyBVc2VyPC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5zZXJ2ZXItdXNlci1zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgPHVuc3Vic2NyaWJlPnNlcnZlci11c2VyLXVuc3Vic2NyaWJlQGphbWVzLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPHBvc3Q+c2VydmVyLXVzZXJAamFtZXMuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvamFtZXMtc2VydmVyLXVzZXIvPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+QXBhY2hlIEphbWVzIERldmVsb3BlcjwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+c2VydmVyLWRldi1zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgPHVuc3Vic2NyaWJlPnNlcnZlci1kZXYtdW5zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICA8cG9zdD5zZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc8L3Bvc3Q+Ci0gICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2phbWVzLXNlcnZlci1kZXYvPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gIDwvbWFpbGluZ0xpc3RzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9zdXBwbGVtZW50YWwtbW9kZWxzLnhtbCBiL3RydW5rL21haW4vc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI4MzFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzdXBwbGVtZW50YWxEYXRhTW9kZWxzPgotICA8IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TICBPRiBBTlkgS0lORCwgZWl0aGVyICBleHByZXNzICBvcgotICBpbXBsaWVkLgotICAKLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gIDwhLS0gQWxzbyBhZGRlZCBtYW51YWxseSBpbiBwb20ueG1sIGFwcGVuZWRlZCB0ZXh0IGJlY2F1c2UgdGVzdAotICAgICAgIGRlcGVuZGVuY2llcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgdGhlIE5PVElDRSAKLSAgICAgICBnZW5lcmF0b3IgLS0+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxuYW1lPkpVbml0PC9uYW1lPgotICAgICAgPHVybD5odHRwOi8vd3d3Lmp1bml0Lm9yZy88L3VybD4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAJPG5hbWU+S2VudCBCZWNrLCBFcmljaCBHYW1tYSwgYW5kIERhdmlkIFNhZmY8L25hbWU+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwucGhwPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci08L3N1cHBsZW1lbnRhbERhdGFNb2RlbHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FyZ3VtZW50LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQXJndW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzNDcxZC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQXJndW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLS8qKgotICogQSBzaW1wbGUgSW50ZXJmYWNlIGZvciBBcmd1bWVudHMuCi0gKiAKLSAqIENyZWF0aW9uIERhdGU6IDI0LU5vdi0wMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyZ3VtZW50IHsKLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0VmFsdWUgYW5zd2VycyB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyJ3MgQXJndW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQXJndW1lbnRzLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2UyYTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxwPgotICogQSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJGQzMwMjggQk5GLi4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPmFyZ3VtZW50cyA9ICphcmd1bWVudCBbdGVzdCAvIHRlc3QtbGlzdF08L2NvZGU+Ci0gKiAKLSAqIDxwPgotICogTm90ZSB0aGF0IGEgdGVzdCBpcyByZXByZXNlbnRlZCBhcyBhIHRlc3QtbGlzdCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFyZ3VtZW50cyB7Ci0gICAgLyoqCi0gICAgICogQSBMaXN0IG9mIHRoZSBwYXJzZWQgQXJndW1lbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEFyZ3VtZW50PiBmaWVsZEFyZ3VtZW50TGlzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYXJzZWQgdGVzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIFRlc3RMaXN0IGZpZWxkVGVzdExpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQXJndW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgQXJndW1lbnRzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBcmd1bWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgICAqIEBwYXJhbSB0ZXN0TGlzdAotICAgICAqLwotICAgIHB1YmxpYyBBcmd1bWVudHMoTGlzdDxBcmd1bWVudD4gYXJndW1lbnRzLCBUZXN0TGlzdCB0ZXN0TGlzdCkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldEFyZ3VtZW50TGlzdChhcmd1bWVudHMpOwotICAgICAgICBzZXRUZXN0TGlzdCh0ZXN0TGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJndW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEFyZ3VtZW50PiBnZXRBcmd1bWVudExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEFyZ3VtZW50TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0TGlzdCwgbGF6aWx5IGluaXRpYWxpc2VkIGlmIHJlcXVpcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGVzdExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdExpc3QgZ2V0VGVzdExpc3QoKSB7Ci0gICAgICAgIFRlc3RMaXN0IHRlc3RMaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgPT0gKHRlc3RMaXN0ID0gZ2V0VGVzdExpc3RCYXNpYygpKSkgewotICAgICAgICAgICAgdXBkYXRlVGVzdExpc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRUZXN0TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXN0TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBUZXN0TGlzdCBhbmQgaXQgaGFzIFRlc3RzLiBTYXZlcyB0cmlnZ2VyaW5nCi0gICAgICogbGF6eSBpbml0aWFsaXNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXN0cygpIHsKLSAgICAgICAgVGVzdExpc3QgdGVzdExpc3QgPSBnZXRUZXN0TGlzdEJhc2ljKCk7Ci0gICAgICAgIHJldHVybiBudWxsICE9IHRlc3RMaXN0ICYmICF0ZXN0TGlzdC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVzdExpc3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBUZXN0TGlzdAotICAgICAqLwotICAgIHByaXZhdGUgVGVzdExpc3QgZ2V0VGVzdExpc3RCYXNpYygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkVGVzdExpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHRlc3RMaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGVzdExpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVGVzdExpc3QgY29tcHV0ZVRlc3RMaXN0KCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RMaXN0KG5ldyBBcnJheUxpc3Q8VGVzdD4oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJndW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QXJndW1lbnRMaXN0KExpc3Q8QXJndW1lbnQ+IGFyZ3VtZW50cykgewotICAgICAgICBmaWVsZEFyZ3VtZW50TGlzdCA9IGFyZ3VtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0ZXN0TGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdExpc3QKLSAgICAgKiAgICAgICAgICAgIFRoZSB0ZXN0TGlzdCB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXN0TGlzdChUZXN0TGlzdCB0ZXN0TGlzdCkgewotICAgICAgICBmaWVsZFRlc3RMaXN0ID0gdGVzdExpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgVGVzdExpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUZXN0TGlzdCgpIHsKLSAgICAgICAgc2V0VGVzdExpc3QoY29tcHV0ZVRlc3RMaXN0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBcmd1bWVudHM6ICIgKyBnZXRBcmd1bWVudExpc3QoKS50b1N0cmluZygpICsgIiBUZXN0czogIgotICAgICAgICAgICAgICAgICsgKGhhc1Rlc3RzKCkgPyBnZXRUZXN0TGlzdCgpLnRvU3RyaW5nKCkgOiAibnVsbCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0Jhc2VTaWV2ZUNvbnRleHQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9CYXNlU2lldmVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDlmMWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0Jhc2VTaWV2ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotCi0vKioKLSAqIEJlYW4gYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgY29udGV4dC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQmFzZVNpZXZlQ29udGV4dCBleHRlbmRzIFNpZXZlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIFNjcmlwdENvb3JkaW5hdGUgY29vcmRpbmF0ZTsKLQotICAgIHByaXZhdGUgQ29uZGl0aW9uTWFuYWdlciBjb25kaXRpb25NYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kU3RhdGVNYW5hZ2VyIGNvbW1hbmRTdGF0ZU1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yTWFuYWdlciBjb21wYXJhdG9yTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdE1hbmFnZXIgdGVzdE1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2c7Ci0KLSAgICBwdWJsaWMgQmFzZVNpZXZlQ29udGV4dChmaW5hbCBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlciwKLSAgICAgICAgICAgIGZpbmFsIENvbXBhcmF0b3JNYW5hZ2VyIGNvbXBhcmF0b3JNYW5hZ2VyLAotICAgICAgICAgICAgZmluYWwgVGVzdE1hbmFnZXIgdGVzdE1hbmFnZXIsIGZpbmFsIExvZyBsb2cpIHsKLSAgICAgICAgdGhpcy5jb21tYW5kU3RhdGVNYW5hZ2VyID0gbmV3IENvbW1hbmRTdGF0ZU1hbmFnZXIoKTsKLSAgICAgICAgdGhpcy5jb25kaXRpb25NYW5hZ2VyID0gbmV3IENvbmRpdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgdGhpcy50ZXN0TWFuYWdlciA9IHRlc3RNYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvck1hbmFnZXIgPSBjb21wYXJhdG9yTWFuYWdlcjsKLSAgICAgICAgdGhpcy5sb2cgPSBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2NyaXB0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlNjcmlwdENvb3JkaW5hdGU8L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTY3JpcHRDb29yZGluYXRlIGdldENvb3JkaW5hdGUoKSB7Ci0gICAgICAgIHJldHVybiBjb29yZGluYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNjcmlwdCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBvcGVyYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkaW5hdGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNjcmlwdENvb3JkaW5hdGU8L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENvb3JkaW5hdGUoU2NyaXB0Q29vcmRpbmF0ZSBjb29yZGluYXRlKSB7Ci0gICAgICAgIHRoaXMuY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGU7Ci0gICAgICAgIGlmIChjb29yZGluYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvb3JkaW5hdGUuc2V0TG9nKGdldExvZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVDb250ZXh0I2dldENvbW1hbmRTdGF0ZU1hbmFnZXIoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb21tYW5kU3RhdGVNYW5hZ2VyIGdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb21tYW5kU3RhdGVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVDb250ZXh0I2dldENvbmRpdGlvbk1hbmFnZXIoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb25kaXRpb25NYW5hZ2VyIGdldENvbmRpdGlvbk1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb25kaXRpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVDb250ZXh0I3NldENvbmRpdGlvbk1hbmFnZXIoQ29uZGl0aW9uTWFuYWdlcikKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb25NYW5hZ2VyKENvbmRpdGlvbk1hbmFnZXIgY29uZGl0aW9uTWFuYWdlcikgewotICAgICAgICB0aGlzLmNvbmRpdGlvbk1hbmFnZXIgPSBjb25kaXRpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVDb250ZXh0I2dldExvZygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvZyBnZXRMb2coKSB7Ci0gICAgICAgIHJldHVybiBsb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBTaWV2ZUNvbnRleHQjZ2V0Q29tcGFyYXRvck1hbmFnZXIoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb21wYXJhdG9yTWFuYWdlciBnZXRDb21wYXJhdG9yTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3JNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVDb250ZXh0I2dldENvbW1hbmRNYW5hZ2VyKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29tbWFuZE1hbmFnZXIgZ2V0Q29tbWFuZE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb21tYW5kTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFNpZXZlQ29udGV4dCNnZXRUZXN0TWFuYWdlcigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3RNYW5hZ2VyIGdldFRlc3RNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdGVzdE1hbmFnZXI7Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0Jsb2NrLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2N2M5Yy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBSRkMzMDI4IEJORi4uLgotICogPC9wPgotICogCi0gKiA8Y29kZT5ibG9jayA9ICJ7IiBjb21tYW5kcyAifSI8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrIGltcGxlbWVudHMgRXhlY3V0YWJsZSB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNoaWxyZW4gb2YgdGhlIEJsb2NrCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21tYW5kcyBmaWVsZENoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEJsb2NrLgotICAgICAqLwotICAgIHByaXZhdGUgQmxvY2soKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEJsb2NrLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21tYW5kcwotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayhDb21tYW5kcyBjb21tYW5kcykgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldENoaWxkcmVuKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENvbW1hbmRzCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRzIGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gZmllbGRDaGlsZHJlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21tYW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tbWFuZHMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb21tYW5kcyB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDaGlsZHJlbihDb21tYW5kcyBjb21tYW5kcykgewotICAgICAgICBmaWVsZENoaWxkcmVuID0gY29tbWFuZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5FeGVjdXRhYmxlI2V4ZWN1dGUoTWFpbEFkYXB0ZXIsIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKS5leGVjdXRlKG1haWwsIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQkxPQ0s6ICIgKyBnZXRDaGlsZHJlbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjgyMmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIDxwPgotICogQSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJGQzMwMjggQk5GLi4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPmNvbW1hbmQgPSBpZGVudGlmaWVyIGFyZ3VtZW50cyAoICI7IiAvIGJsb2NrICk8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kIGltcGxlbWVudHMgRXhlY3V0YWJsZSB7Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhpcyBDb21tYW5kICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGROYW1lOwotCi0gICAgLyoqIFRoZSBBcmd1bWVudHMgZm9yIHRoaXMgQ29tbWFuZCAqLwotICAgIHByaXZhdGUgQXJndW1lbnRzIGZpZWxkQXJndW1lbnRzOwotCi0gICAgLyoqIFRoZSBCbG9jayBmb3IgdGhpcyBDb21tYW5kICovCi0gICAgcHJpdmF0ZSBCbG9jayBmaWVsZEJsb2NrOwotCi0gICAgLyoqCi0gICAgICogU2NyaXB0IGNvb3JkaW5hdGUgZm9yIHRoaXMgY29tbWFuZC4gQ29tbWFuZHMgYXJlIGV4ZWN1dGVkIGFmdGVyIHRoZQotICAgICAqIGRvY3VtZW50IGhhcyBiZWVuIHBhcnNlLiBTbyB0aGlzIG11c3QgYmUgcmVjb3JkZWQgb24gY29uc3RydWN0aW9uIGFuZAotICAgICAqIHN0b3JlZCBmb3IgbGF0ZXIgdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgU2NyaXB0Q29vcmRpbmF0ZSBjb29yZGluYXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRlc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb21tYW5kKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb21tYW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kKFN0cmluZyBuYW1lLCBBcmd1bWVudHMgYXJndW1lbnRzLCBCbG9jayBibG9jaywKLSAgICAgICAgICAgIFNjcmlwdENvb3JkaW5hdGUgY29vcmRpbmF0ZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGU7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIHNldEFyZ3VtZW50cyhhcmd1bWVudHMpOwotICAgICAgICBzZXRCbG9jayhibG9jayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZpZWxkTmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkNvbW1hbmQgbmFtZTogIgotICAgICAgICAgICAgICAgICsgZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiICIKLSAgICAgICAgICAgICAgICArICgoZ2V0QXJndW1lbnRzKCkgPT0gbnVsbCkgPyAibnVsbCIgOiBnZXRBcmd1bWVudHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpICsgIiBCbG9jazogIgotICAgICAgICAgICAgICAgICsgKChnZXRCbG9jaygpID09IG51bGwpID8gIm51bGwiIDogZ2V0QmxvY2soKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBBcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJndW1lbnRzIGdldEFyZ3VtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQXJndW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJsb2NrLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQmxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0QmxvY2soKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEJsb2NrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFyZ3VtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAgICogICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0gICAgICAgIGZpZWxkQXJndW1lbnRzID0gYXJndW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJsb2NrLgotICAgICAqIAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqICAgICAgICAgICAgVGhlIGJsb2NrIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJsb2NrKEJsb2NrIGJsb2NrKSB7Ci0gICAgICAgIGZpZWxkQmxvY2sgPSBibG9jazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLkV4ZWN1dGFibGUjZXhlY3V0ZShNYWlsQWRhcHRlciwgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShNYWlsQWRhcHRlciBtYWlsLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZyBsb2cgPSBjb250ZXh0LmdldExvZygpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0b1N0cmluZygpKTsKLSAgICAgICAgICAgIGNvb3JkaW5hdGUuZGVidWdEaWFnbm9zdGljcyhsb2cpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvbW1hbmRzIGFyZSBleGVjdXRlZCBhZnRlciB0aGUgcGFyc2luZyBwaGFzZQotICAgICAgICAvLyByZWN1cnNpdmVseSBmcm9tIHRoZSB0b3AgbGV2ZWwgYmxvY2sKLSAgICAgICAgLy8gc28gbmVlZCB0byB1c2UgdGhlIGNvb3JkaW5hdGUgcmVjb3JkZWQgZnJvbSB0aGUgcGFyc2UKLSAgICAgICAgY29udGV4dC5zZXRDb29yZGluYXRlKGNvb3JkaW5hdGUpOwotICAgICAgICBmaW5hbCBFeGVjdXRhYmxlQ29tbWFuZCBleGVjdXRhYmxlID0gY29udGV4dC5nZXRDb21tYW5kTWFuYWdlcigpLmdldENvbW1hbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IGV4ZWN1dGFibGUuZXhlY3V0ZShtYWlsLCBnZXRBcmd1bWVudHMoKSwKLSAgICAgICAgICAgICAgICBnZXRCbG9jaygpLCBjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tbWFuZE1hbmFnZXIuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjVjZThjLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21tYW5kTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Mb29rdXBFeGNlcHRpb247Ci0KLS8qKgotICogPHA+TWFwcyBDb21tYW5kIG5hbWVzIHRvIGNvbmZpZ3VyZWQgQ29tbWFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvcD4KLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiB7QGxpbmsgQ29tbWFuZE1hbmFnZXJJbXBsfSBpcyBhIHRocmVhZCBzYWZlIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYW4gaW5zdGFuY2Ugb2YgYSBjb21tYW5kIGJ5IG5hbWUuPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDb21tYW5kCi0gICAgICogQHJldHVybiBjb21tYW5kLCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTG9va3VwRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGFibGVDb21tYW5kIGdldENvbW1hbmQoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNTdXBwb3J0ZWQgYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhIENvbW1hbmQgbmFtZSBpcwotICAgICAqIGNvbmZpZ3VyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgLQotICAgICAqICAgICAgICAgICAgVGhlIENvbW1hbmQgbmFtZQotICAgICAqIEByZXR1cm4gYm9vbGVhbiAtIFRydWUgaWYgdGhlIENvbW1hbmQgbmFtZSBpcyBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWFuZFN1cHBvcnRlZChTdHJpbmcgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tbWFuZE1hbmFnZXJJbXBsLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tbWFuZE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDIyY2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLkxvb2t1cEV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD5NYXBzIGNvbW1hbmQgbmFtZXMgdG8gY29tbWFuIGltcGxlbWVudGF0aW9ucy48L3A+Ci0gKiA8aDQ+VGhyZWFkIFNhZmV0eTwvaDQ+Ci0gKiA8cD4KLSAqIEluc3RhbmNlcyBtYXkgc2FmZWx5IGJlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSBieSBtdWx0aXBsZSB0aHJlYWRzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1hbmFnZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZE1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBjbGFzc05hbWVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWFuZE1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRNYW5hZ2VySW1wbChmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBjbGFzc05hbWVNYXApIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSBjbGFzc05hbWVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIGxvb2t1cCBhbnN3ZXJzIHRoZSBjbGFzcyB0byB3aGljaCBhIENvbW1hbmQgbmFtZSBpcyBtYXBwZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDb21tYW5kCi0gICAgICogQHJldHVybiBDbGFzcyAtIFRoZSBjbGFzcyBvZiB0aGUgQ29tbWFuZAotICAgICAqIEB0aHJvd3MgTG9va3VwRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBsb29rdXAoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbWRDbGFzcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbWRDbGFzcyA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQotICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKGdldENsYXNzTmFtZShuYW1lKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExvb2t1cEV4Y2VwdGlvbigiQ29tbWFuZCBuYW1lZCAnIiArIG5hbWUgKyAiJyBub3QgZm91bmQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFFeGVjdXRhYmxlQ29tbWFuZC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNtZENsYXNzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oIkNsYXNzICIgKyBjbWRDbGFzcy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgaW1wbGVtZW50ICIgKyBFeGVjdXRhYmxlQ29tbWFuZC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gY21kQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIG5ld0luc3RhbmNlIGFuc3dlcnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHRvIHdoaWNoIGEgQ29tbWFuZAotICAgICAqIG5hbWUgaXMgbWFwcGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29tbWFuZAotICAgICAqIEByZXR1cm4gQ2xhc3MgLSBUaGUgY2xhc3Mgb2YgdGhlIENvbW1hbmQKLSAgICAgKiBAdGhyb3dzIExvb2t1cEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRhYmxlQ29tbWFuZCBnZXRDb21tYW5kKFN0cmluZyBuYW1lKSB0aHJvd3MgTG9va3VwRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoRXhlY3V0YWJsZUNvbW1hbmQpIGxvb2t1cChuYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzU3VwcG9ydGVkIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYSBDb21tYW5kIG5hbWUgaXMKLSAgICAgKiBjb25maWd1cmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBDb21tYW5kIG5hbWUKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gLSBUcnVlIGlmIHRoZSBDb21tYW5kIG5hbWUgaXMgY29uZmlndXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1hbmRTdXBwb3J0ZWQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiBpc1N1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9va3VwKG5hbWUpOwotICAgICAgICAgICAgaXNTdXBwb3J0ZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChMb29rdXBFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1N1cHBvcnRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgZ2V0Q2xhc3NOYW1lIGFuc3dlcnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHdoaWNoIGEgQ29tbWFuZCBuYW1lCi0gICAgICogaXMgbWFwcGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29tbWFuZAotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHRocm93cyBMb29rdXBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIExvb2t1cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVNYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgIGlmIChudWxsID09IGNsYXNzTmFtZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oIkNvbW1hbmQgbmFtZWQgJyIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIicgbm90IG1hcHBlZC4iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tbWFuZFN0YXRlTWFuYWdlci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmRTdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlZGEzNy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tbWFuZFN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLS8qKgotICogVGhyZWFkIHNpbmdsZXRvbiBjbGFzcyBDb21tYW5kU3RhdGVNYW5hZ2VyIHJlY29yZHMgdGhlIHN0YXRlIG9mIGEgU2lldmUKLSAqIGV2YWx1YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU3RhdGVNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBldmFsdWF0ZWQgc2NyaXB0IGlzIHByb2Nlc3NpbmcgUHJvbG9nIENvbW1hbmRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpZWxkSW5Qcm9sb2cgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGV2YWx1YXRlZCBzY3JpcHQgaGFzIHJlamVjdGVkIHRoZSBtYWlsCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpZWxkUmVqZWN0ZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBldmFsdWF0ZWQgc2NyaXB0IG11c3Qga2VlcCB0aGUgbWFpbAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWVsZEltcGxpY2l0S2VlcCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXZhbHVhdGlvbiBoYXMgcHJvY2Vzc2VkIEFjdGlvbiBDb21tYW5kcwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWVsZEhhc0FjdGlvbnMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb21tYW5kU3RhdGVNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kU3RhdGVNYW5hZ2VyKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgc2V0SW5Qcm9sb2codHJ1ZSk7Ci0gICAgICAgIHNldFJlamVjdGVkKGZhbHNlKTsKLSAgICAgICAgc2V0SGFzQWN0aW9ucyhmYWxzZSk7Ci0gICAgICAgIHNldEltcGxpY2l0S2VlcCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNBY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSGFzQWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkSGFzQWN0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpblByb2xvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luUHJvbG9nKCkgewotICAgICAgICByZXR1cm4gZmllbGRJblByb2xvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpc1JlamVjdGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVqZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZFJlamVjdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhhc0FjdGlvbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhhc0FjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIFRoZSBoYXNBY3Rpb25zIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhc0FjdGlvbnMoYm9vbGVhbiBoYXNBY3Rpb25zKSB7Ci0gICAgICAgIGZpZWxkSGFzQWN0aW9ucyA9IGhhc0FjdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5Qcm9sb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluUHJvbG9nCi0gICAgICogICAgICAgICAgICBUaGUgaW5Qcm9sb2cgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5Qcm9sb2coYm9vbGVhbiBpblByb2xvZykgewotICAgICAgICBmaWVsZEluUHJvbG9nID0gaW5Qcm9sb2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaXNSZWplY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNSZWplY3RlZAotICAgICAqICAgICAgICAgICAgVGhlIGlzUmVqZWN0ZWQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVqZWN0ZWQoYm9vbGVhbiBpc1JlamVjdGVkKSB7Ci0gICAgICAgIGZpZWxkUmVqZWN0ZWQgPSBpc1JlamVjdGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0S2VlcC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0S2VlcCgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkSW1wbGljaXRLZWVwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGltcGxpY2l0S2VlcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wbGljaXRLZWVwCi0gICAgICogICAgICAgICAgICBUaGUgaW1wbGljaXRLZWVwIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0S2VlcChib29sZWFuIGltcGxpY2l0S2VlcCkgewotICAgICAgICBmaWVsZEltcGxpY2l0S2VlcCA9IGltcGxpY2l0S2VlcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21tYW5kcy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTBjN2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbW1hbmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBSRkMzMDI4IEJORi4uLgotICogPC9wPgotICogCi0gKiA8Y29kZT5jb21tYW5kcyA9ICpjb21tYW5kPC9jb2RlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kcyBpbXBsZW1lbnRzIEV4ZWN1dGFibGUgewotICAgIC8qKgotICAgICAqIEEgTGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8Q29tbWFuZD4gZmllbGRDaGlsZHJlbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb21tYW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbW1hbmRzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb21tYW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tbWFuZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZHMoTGlzdDxDb21tYW5kPiBjb21tYW5kcykgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldENoaWxkcmVuKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxDb21tYW5kPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQ2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tbWFuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbW1hbmRzCi0gICAgICogICAgICAgICAgICBUaGUgY29tbWFuZHMgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hpbGRyZW4oTGlzdDxDb21tYW5kPiBjb21tYW5kcykgewotICAgICAgICBmaWVsZENoaWxkcmVuID0gY29tbWFuZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5FeGVjdXRhYmxlI2V4ZWN1dGUoTWFpbEFkYXB0ZXIsIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBmb3IgKENvbW1hbmQgY29tbWFuZDpmaWVsZENoaWxkcmVuKSB7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUobWFpbCwgY29udGV4dCk7Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ09NTUFORFM6ICIgKyBmaWVsZENoaWxkcmVuOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbXBhcmF0b3JNYW5hZ2VyLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tcGFyYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3NjU3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tcGFyYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Mb29rdXBFeGNlcHRpb247Ci0KLS8qKgotICogPHA+TWFwcyBDb21wYXJhdG9yIG5hbWVzIHRvIGNvbmZpZ3VyZWQgQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvcD4KLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiB7QGxpbmsgQ29tcGFyYXRvck1hbmFnZXJJbXBsfSBpcyBhIHRocmVhZCBzYWZlIGltcGxlbWVudGF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBhcmF0b3JNYW5hZ2VyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgY29tcGFyYXRvciBieSBuYW1lLjwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgKGxvZ2ljYWwpIG5hbWUgb2YgdGhlIENvbXBhcmF0b3IKLSAgICAgKiBAcmV0dXJuIGEgY29tcGFyYXRvciwgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIExvb2t1cEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSXMgYW4gZXhwbGljaXQgZGVjbGFyYXRpb24gaW4gYSA8Y29kZT5yZXF1aXJlPC9jb2RlPiBzdGF0ZW1lbnQKLSAgICAgKiB1bm5lY2Vzc2FyeSBmb3IgdGhpcyBjb21wYXJhdG9yPwotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yTmFtZSBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgY29tcGFyYXRvciBuZWVkIG5vdCBiZSBkZWNsYXJlZCBieSA8Y29yZT5yZXF1aXJlPC9jb2RlPiwKLSAgICAgKiBmYWxzZSB3aGVuIGFueSB1c2FnZSBvZiB0aGlzIGNvbXBhcmF0b3IgbXVzdCBiZSBkZWNsYXJlZCBpbiBhIDxjb2RlPnJlcXVpcmU8L2NvZGU+IHN0YXRlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRseURlY2xhcmVkKGZpbmFsIFN0cmluZyBjb21wYXJhdG9yTmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSXMgdGhlIGNvbXBhcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSBzdXBwb3J0ZWQ/Ci0gICAgICogQHBhcmFtIG5hbWUgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21wYXJhdG9yTWFuYWdlckltcGwuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db21wYXJhdG9yTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxZjQ2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29tcGFyYXRvck1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5Db25zdGFudHMuQ09NUEFSQVRPUl9BU0NJSV9DQVNFTUFQX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLkNvbnN0YW50cy5DT01QQVJBVE9SX09DVEVUX05BTUU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Mb29rdXBFeGNlcHRpb247Ci0KLS8qKgotICogPHA+TWFwcyBDb21wYXJhdG9yIG5hbWVzIHRvIGNvbmZpZ3VyZWQgQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvcD4KLSAqIDxoND5UaHJlYWQgU2FmZXR5PC9oND4KLSAqIDxwPgotICogSW5zdGFuY2VzIG1heSBzYWZlbHkgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJhdG9yTWFuYWdlckltcGwgaW1wbGVtZW50cyBDb21wYXJhdG9yTWFuYWdlciB7Ci0KLSAgICAvKiogCi0gICAgICogQ29uc3RydWN0cyBhIHNldCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aG9zZSBjb21wYXJpc29ucyBmb3Igd2hpY2ggPGNvZGU+cmVxdWlyZTwvY29kZT4gCi0gICAgICogaXMgbm90IG5lY2Vzc2FyeSBiZWZvcmUgdXNhZ2UsIGFjY29yZGluZyB0byBSRkM1MjI4LgotICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MjI4I3NlY3Rpb24tMi43LjMnPlJGQzUyMjgsIDIuNy4zIENvbXBhcmF0b3JzPC9hPi4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb3B5T25Xcml0ZUFycmF5U2V0PFN0cmluZz4gc3RhbmRhcmREZWZpbmVkQ29tcGFyYXRvcnMoKSB7Ci0gICAgICAgIGZpbmFsIENvcHlPbldyaXRlQXJyYXlTZXQ8U3RyaW5nPiByZXN1bHRzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8U3RyaW5nPigpOwotICAgICAgICByZXN1bHRzLmFkZChDT01QQVJBVE9SX09DVEVUX05BTUUpOwotICAgICAgICByZXN1bHRzLmFkZChDT01QQVJBVE9SX0FTQ0lJX0NBU0VNQVBfTkFNRSk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBTdHJpbmc+IGNsYXNzTmFtZU1hcDsKLSAgICAvKiogCi0gICAgICogVGhlIG5hbWVzIG9mIHRob3NlIGNvbXBhcmlzb25zIGZvciB3aGljaCA8Y29kZT5yZXF1aXJlPC9jb2RlPiBpcyBub3QgbmVjZXNzYXJ5IGJlZm9yZSB1c2FnZS4KLSAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTIyOCNzZWN0aW9uLTIuNy4zJz5SRkM1MjI4LCAyLjcuMyBDb21wYXJhdG9yczwvYT4uIAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVBcnJheVNldDxTdHJpbmc+IGltcGxpY2l0bHlEZWNsYXJlZDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBtYW5hZ2VyIHdpdGggdGhlIHN0YW5kYXJkIGNvbXBhcmF0b3JzIGltcGxpY2l0bHkgZGVmaW5lZC4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lTWFwIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JNYW5hZ2VySW1wbChmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBjbGFzc05hbWVNYXApIHsKLSAgICAgICAgdGhpcyhjbGFzc05hbWVNYXAsIHN0YW5kYXJkRGVmaW5lZENvbXBhcmF0b3JzKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29tcGFyYXRvck1hbmFnZXIuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZU1hcCBpbmRleGVzIG5hbWVzIG9mIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYWdhaW5zdCBsb2dpY2FsIG5hbWVzLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBpbXBsaWNpdGx5RGVjbGFyZWQgbmFtZXMgb2YgdGhvc2UgY29tcGFyaXNvbnMgZm9yIHdoaWNoIDxjb2RlPnJlcXVpcmU8L2NvZGU+IGlzIG5vdCBuZWNlc3NhcnkgYmVmb3JlIHVzYWdlCi0gICAgICovCi0gICAgcHVibGljIENvbXBhcmF0b3JNYW5hZ2VySW1wbChmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBjbGFzc05hbWVNYXAsIGZpbmFsIENvcHlPbldyaXRlQXJyYXlTZXQ8U3RyaW5nPiBpbXBsaWNpdGx5RGVjbGFyZWQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVNYXAgPSBjbGFzc05hbWVNYXA7Ci0gICAgICAgIHRoaXMuaW1wbGljaXRseURlY2xhcmVkID0gaW1wbGljaXRseURlY2xhcmVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJcyBhbiBleHBsaWNpdCBkZWNsYXJhdGlvbiBpbiBhIDxjb2RlPnJlcXVpcmU8L2NvZGU+IHN0YXRlbWVudAotICAgICAqIHVubmVjZXNzYXJ5IGZvciB0aGlzIGNvbXBhcmF0b3I/Ci0gICAgICogQHBhcmFtIGNvbXBhcmF0b3JOYW1lIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhpcyBjb21wYXJhdG9yIG5lZWQgbm90IGJlIGRlY2xhcmVkIGJ5IDxjb3JlPnJlcXVpcmU8L2NvZGU+LAotICAgICAqIGZhbHNlIHdoZW4gYW55IHVzYWdlIG9mIHRoaXMgY29tcGFyYXRvciBtdXN0IGJlIGRlY2xhcmVkIGluIGEgPGNvZGU+cmVxdWlyZTwvY29kZT4gc3RhdGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdGx5RGVjbGFyZWQoZmluYWwgU3RyaW5nIGNvbXBhcmF0b3JOYW1lKSB7Ci0gICAgICAgIHJldHVybiBpbXBsaWNpdGx5RGVjbGFyZWQuY29udGFpbnMoY29tcGFyYXRvck5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBsb29rdXAgYW5zd2VycyB0aGUgY2xhc3MgdG8gd2hpY2ggYSBDb21wYXJhdG9yIG5hbWUgaXMgbWFwcGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29tcGFyYXRvcgotICAgICAqIEByZXR1cm4gQ2xhc3MgLSBUaGUgY2xhc3Mgb2YgdGhlIENvbXBhcmF0b3IKLSAgICAgKiBAdGhyb3dzIExvb2t1cEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBsb29rdXAoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjb21wYXJhdG9yQ2xhc3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29tcGFyYXRvckNsYXNzID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKG5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTG9va3VwRXhjZXB0aW9uKCJDb21wYXJhdG9yIG5hbWVkICciICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICInIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUNvbXBhcmF0b3IuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb21wYXJhdG9yQ2xhc3MpKQotICAgICAgICAgICAgdGhyb3cgbmV3IExvb2t1cEV4Y2VwdGlvbigiQ2xhc3MgIiArIGNvbXBhcmF0b3JDbGFzcy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgaW1wbGVtZW50ICIgKyBDb21wYXJhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBjb21wYXJhdG9yQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIG5ld0luc3RhbmNlIGFuc3dlcnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHRvIHdoaWNoIGEgQ29tcGFyYXRvcgotICAgICAqIG5hbWUgaXMgbWFwcGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ29tcGFyYXRvcgotICAgICAqIEByZXR1cm4gQ2xhc3MgLSBUaGUgY2xhc3Mgb2YgdGhlIENvbXBhcmF0b3IKLSAgICAgKiBAdGhyb3dzIExvb2t1cEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChDb21wYXJhdG9yKSBsb29rdXAobmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTG9va3VwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTG9va3VwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBnZXRDbGFzc05hbWUgYW5zd2VycyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gd2hpY2ggYSBDb21wYXJhdG9yCi0gICAgICogbmFtZSBpcyBtYXBwZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDb21wYXJhdG9yCi0gICAgICogQHJldHVybiBTdHJpbmcgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKiBAdGhyb3dzIExvb2t1cEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIExvb2t1cEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVNYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgIGlmIChudWxsID09IGNsYXNzTmFtZSkKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oIkNvbXBhcmF0b3IgbmFtZWQgJyIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIicgbm90IG1hcHBlZC4iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIENvbXBhcmF0b3JNYW5hZ2VyI2lzU3VwcG9ydGVkKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgbmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0Q29tcGFyYXRvcihuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChMb29rdXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbmRpdGlvbk1hbmFnZXIuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db25kaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzQ5YTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbmRpdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi0vKioKLSAqIFRocmVhZCBzaW5nbGV0b24gY2xhc3MgQ29uZGl0aW9uTWFuYWdlciBtYW5hZ2VzIENvbmRpdGlvbmFsIENvbW1hbmRzIGR1cmluZyBhCi0gKiBTaWV2ZSBldmFsdWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZGl0aW9uTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJcyBhbiBFbHNlIENvbmRpdGlvbiBhbGxvd2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpZWxkRWxzZUFsbG93ZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IFRlc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZmllbGRUZXN0UmVzdWx0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbmRpdGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbmRpdGlvbk1hbmFnZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSByZWNlaXZlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBzZXRFbHNlQWxsb3dlZChmYWxzZSk7Ci0gICAgICAgIHNldFRlc3RSZXN1bHQodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldElmVGVzdFJlc3VsdCBlbmFibGVzIGEgZm9sbG93aW5nIEVsc2UgQ29tbWFuZCBhbmQgcmVjb3JkcyB0aGUKLSAgICAgKiB0ZXN0IHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWZUZXN0UmVzdWx0KGJvb2xlYW4gcmVzdWx0KSB7Ci0gICAgICAgIHNldEVsc2VBbGxvd2VkKHRydWUpOwotICAgICAgICBzZXRUZXN0UmVzdWx0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldEVsc2lmVGVzdFJlc3VsdCBlbmFibGVzIGEgZm9sbG93aW5nIEVsc2UgQ29tbWFuZCBhbmQgcmVjb3JkcwotICAgICAqIHRoZSB0ZXN0IHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxzaWZUZXN0UmVzdWx0KGJvb2xlYW4gcmVzdWx0KSB7Ci0gICAgICAgIHNldEVsc2VBbGxvd2VkKHRydWUpOwotICAgICAgICBzZXRUZXN0UmVzdWx0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldEVsc2VUZXN0UmVzdWx0IGRpc2FibGVzIGEgZm9sbG93aW5nIEVsc2UgQ29tbWFuZCBhbmQgcmVjb3JkcwotICAgICAqIHRoZSB0ZXN0IHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxzZVRlc3RSZXN1bHQoYm9vbGVhbiByZXN1bHQpIHsKLSAgICAgICAgc2V0RWxzZUFsbG93ZWQoZmFsc2UpOwotICAgICAgICBzZXRUZXN0UmVzdWx0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzSWZBbGxvd2VkIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gSWYgQ29tbWFuZCBpcwotICAgICAqIGFsbG93ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZkFsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0Vsc2lmQWxsb3dlZCBhbnN3ZXJzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGFuIEVsc2lmIENvbW1hbmQgaXMKLSAgICAgKiBhbGxvd2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxzaWZBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gaXNFbHNlQWxsb3dlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0Vsc2VBbGxvd2VkIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gRWxzZSBDb21tYW5kIGlzCi0gICAgICogYWxsb3dlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Vsc2VBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmllbGRFbHNlQWxsb3dlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNJZlJ1bm5hYmxlIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gSWYgQ29tbWFuZCBpcwotICAgICAqIHJ1bm5hYmxlIGJhc2VkIHVwb24gdGhlIGN1cnJlbnQgZXZhbHVhdGlvbiBzdGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lmUnVubmFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0Vsc2lmUnVubmFibGUgYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhbiBFbHNpZiBDb21tYW5kCi0gICAgICogaXMgcnVubmFibGUgYmFzZWQgdXBvbiB0aGUgY3VycmVudCBldmFsdWF0aW9uIHN0YXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxzaWZSdW5uYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzRWxzZVJ1bm5hYmxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzRWxzZVJ1bm5hYmxlIGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gRWxzZSBDb21tYW5kIGlzCi0gICAgICogcnVubmFibGUgYmFzZWQgdXBvbiB0aGUgY3VycmVudCBldmFsdWF0aW9uIHN0YXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxzZVJ1bm5hYmxlKCkgewotICAgICAgICByZXR1cm4gIWlzVGVzdFJlc3VsdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlc3RSZXN1bHQuCi0gICAgICogCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXN0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gZmllbGRUZXN0UmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVsc2VBbGxvd2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbHNlQWxsb3dlZAotICAgICAqICAgICAgICAgICAgVGhlIGVsc2VBbGxvd2VkIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEVsc2VBbGxvd2VkKGJvb2xlYW4gZWxzZUFsbG93ZWQpIHsKLSAgICAgICAgZmllbGRFbHNlQWxsb3dlZCA9IGVsc2VBbGxvd2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRlc3RSZXN1bHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3RSZXN1bHQKLSAgICAgKiAgICAgICAgICAgIFRoZSB0ZXN0UmVzdWx0IHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRlc3RSZXN1bHQoYm9vbGVhbiB0ZXN0UmVzdWx0KSB7Ci0gICAgICAgIGZpZWxkVGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJkMDU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPgotICogPGNvZGU+Q29uZmlndXJhdGlvbk1hbmFnZXI8L2NvZGU+IHBhcnNlcyB0aGUgWE1MIHN0YXRlbWVudHMKLSAqIGluIHRoZSBTaWV2ZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHRyYW5zbGF0ZXMgdGhlbSB0byBKYXZhIG9iamVjdHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBTaWV2ZSBjb25maWd1cmF0aW9uIGlzIHJlYWQgZnJvbSAzIHByb3BlcnRpZXMgZmlsZXMKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzPC9jb2RlPjwvbGk+Ci0gKiA8bGk+PGNvZGU+b3JnL2FwYWNoZS9qc2lldmUvdGVzdHNtYXAucHJvcGVydGllczwvY29kZT48L2xpPgotICogPGxpPjxjb2RlPm9yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzbWFwLnByb3BlcnRpZXM8L2NvZGU+PC9saT4KLSAqIDwvdWw+Ci0gKiA8cD5UaGV5IGFyZSBsb2NhdGVkIGJ5IHNlYXJjaGluZyB0aGUgY2xhc3NwYXRoIG9mIHRoZSBjdXJyZW50IENsYXNzTG9hZGVyLgotICogPC9wPgotICogPGg0PlRocmVhZCBTYWZldHk8L2g0PgotICogPHA+Ci0gKiBFYWNoIGNvbmZpZ3VyYXRpb24gbWFuYWdlciBpbnN0YW5jZSBtYXkgYmUgc2FmZWx5IGFjY2Vzc2VkIGJ5IGNvbmN1cnJlbnQgdGhyZWFkcy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIG1hbmFnZXJzIGNvbnN0cnVjdGVkIGJ5IAotICogPC9wPgotICogPHVsPgotICogPGxpPntAbGluayAjZ2V0Q29tbWFuZE1hbmFnZXIoKX08L2xpPiAKLSAqIDxsaT57QGxpbmsgI2dldENvbXBhcmF0b3JNYW5hZ2VyKCl9PC9saT4KLSAqIDxsaT57QGxpbmsgI2dldFRlc3RNYW5hZ2VyKCl9PC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIGFuZCB0aGUge0BsaW5rIFNpZXZlRmFjdG9yeX0gYnVpbHQgYnkKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkKCl9PC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIG1heSBiZSBzYWZlbHkgc2hhcmVkIGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NPTkNVUlJFTkNZX0xFVkVMID0gODsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EU01BUF9QUk9QRVJUSUVTID0gIm9yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzbWFwLnByb3BlcnRpZXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTTUFQX1BST1BFUlRJRVMgPSAib3JnL2FwYWNoZS9qc2lldmUvdGVzdHNtYXAucHJvcGVydGllcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSQVRPUlNNQVBfUFJPUEVSVElFUyA9ICJvcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yc21hcC5wcm9wZXJ0aWVzIjsKLQotICAgIC8qKgotICAgICAqIEEgTWFwIG9mIHRoZSBDb21tYW5kIG5hbWVzIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNsYXNzIG5hbWVzLgotICAgICAqLwotICAgIHByaXZhdGUgQ29uY3VycmVudE1hcDxTdHJpbmcsIFN0cmluZz4gZmllbGRDb21tYW5kTWFwOwotCi0gICAgLyoqCi0gICAgICogQSBNYXAgb2YgdGhlIFRlc3QgbmFtZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY2xhc3MgbmFtZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBmaWVsZFRlc3RNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBBIE1hcCBvZiB0aGUgQ29tcGFyYXRvciBuYW1lcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjbGFzcyBuYW1lcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBTdHJpbmc+IGZpZWxkQ29tcGFyYXRvck1hcDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaW5pdGlhbCBzaXplIGZvciB0aGUge0BsaW5rIENvbmN1cnJlbnRIYXNoTWFwfSBjb25jdXJyZW5jeSBsZXZlbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBpbml0aWFsQ29uY3VycmVuY3lMZXZlbCA9IERFRkFVTFRfSU5JVElBTF9DT05DVVJSRU5DWV9MRVZFTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZygib3JnLmFwYWNoZS5qc2lldmUiKTsKLQotICAgIHByaXZhdGUgTG9nIGxvZyA9IExPRzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvbk1hbmFnZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXIoKSB0aHJvd3MgU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gcHJvY2Vzc2luZyBDb25maWd1cmF0aW9uOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBwcm9jZXNzaW5nIENvbmZpZ3VyYXRpb246ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgaW5pdGlhbCBzaXplIGZvciB0aGUge0BsaW5rIENvbmN1cnJlbnRIYXNoTWFwfSBjb25jdXJyZW5jeSBsZXZlbC4KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgZXN0aW1hdGVkIGZvciBpbml0aWFsIHNpemluZwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5pdGlhbENvbmN1cnJlbmN5TGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiBpbml0aWFsQ29uY3VycmVuY3lMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGluaXRpYWwgc2l6ZSBmb3IgdGhlIHtAbGluayBDb25jdXJyZW50SGFzaE1hcH0gY29uY3VycmVuY3kgbGV2ZWwuCi0gICAgICogQHBhcmFtIGluaXRpYWxDb25jdXJyZW5jeUxldmVsIG51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgZXN0aW1hdGVkIGZvciBpbml0aWFsIHNpemluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxDb25jdXJyZW5jeUxldmVsKGludCBpbml0aWFsQ29uY3VycmVuY3lMZXZlbCkgewotICAgICAgICB0aGlzLmluaXRpYWxDb25jdXJyZW5jeUxldmVsID0gaW5pdGlhbENvbmN1cnJlbmN5TGV2ZWw7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBnZXRDb25maWdTdHJlYW0gYW5zd2VycyBhbiBJbnB1dFN0cmVhbSBvdmVyIHRoZSBTaWV2ZQotICAgICAqIGNvbmZpZ3VyYXRpb24gZmlsZS4gSXQgaXMgbG9jYXRlZCBieSBzZWFyY2hpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUKLSAgICAgKiBjdXJyZW50IENsYXNzTG9hZGVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29udGV4dCBjbGFzc2xvYWRlciBpcyBzZWFyY2hlZCBmaXJzdC4gSWYgYSBzdWl0YWJseSBuYW1lZCByZXNvdXJjZQotICAgICAqIGlzIGZvdW5kIHRoZW4gdGhpcyBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgY2xhc3Nsb2FkZXIgdXNlZCB0byBsb2FkCi0gICAgICogdGhpcyBjbGFzcyBpcyBzZWFyY2hlZCBmb3IgdGhlIHJlc291cmNlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIElucHV0U3RyZWFtCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0Q29uZmlnU3RyZWFtKFN0cmluZyBjb25maWdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICAvLyBDb250ZXh0IGNsYXNzbG9hZGVyIGlzIHVzdWFsbHkgcmlnaHQgaW4gYSBKRUUgZXZpcm9ubWVudAotICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpCi0gICAgICAgICAgICAgICAgLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY29udGV4dENsYXNzTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmVhbSA9IGNvbnRleHRDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGNvbmZpZ05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU29tZXRpbWVzIGNvbnRleHQgY2xhc3Nsb2FkZXIgd2lsbCBub3QgYmUgc2V0IGNvbnZlbnRpb25hbGx5Ci0gICAgICAgIC8vIFNvLCB0cnkgY2xhc3MgY2xhc3Nsb2FkZXIKLSAgICAgICAgaWYgKG51bGwgPT0gc3RyZWFtKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBDb25maWd1cmF0aW9uTWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKGNvbmZpZ05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gc3RyZWFtKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZXNvdXJjZSBcIiIgKyBjb25maWdOYW1lICsgIlwiIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRDb21tYW5kTWFwIGFuc3dlcnMgYSBNYXAgb2YgQ29tbWFuZCBuYW1lcyBhbmQgdGhlaXIgYXNzb2NpYXRlZAotICAgICAqIGNsYXNzIG5hbWVzLCBsYXppbHkgaW5pdGlhbGl6ZWQgaWYgcmVxdWlyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBNYXAgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uY3VycmVudE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q29tbWFuZE1hcCgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gZmllbGRDb21tYW5kTWFwKSB7Ci0gICAgICAgICAgICBmaWVsZENvbW1hbmRNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpZWxkQ29tbWFuZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0VGVzdE1hcCBhbnN3ZXJzIGEgTWFwIG9mIFRlc3QgbmFtZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgY2xhc3MKLSAgICAgKiBuYW1lcywgbGF6aWx5IGluaXRpYWxpemVkIGlmIHJlcXVpcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTWFwIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFRlc3RNYXAoKSB7Ci0gICAgICAgIGlmIChudWxsID09IGZpZWxkVGVzdE1hcCkgewotICAgICAgICAgICAgZmllbGRUZXN0TWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWVsZFRlc3RNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENvbXBhcmF0b3JNYXAgYW5zd2VycyBhIE1hcCBvZiBDb21wYXJhdG9yIG5hbWVzIGFuZCB0aGVpcgotICAgICAqIGFzc29jaWF0ZWQgY2xhc3MgbmFtZXMsIGxhemlseSBpbml0aWFsaXplZCBpZiByZXF1aXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1hcCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBnZXRDb21wYXJhdG9yTWFwKCkgewotICAgICAgICBpZiAobnVsbCA9PSBmaWVsZENvbXBhcmF0b3JNYXApIHsKLSAgICAgICAgICAgIGZpZWxkQ29tcGFyYXRvck1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmllbGRDb21wYXJhdG9yTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBwYXJzZSB1c2VzIHRoZSBEaWdlc3RlciB0byBwYXJzZSB0aGUgWE1MIHN0YXRlbWVudHMgaW4gdGhlIFNpZXZlCi0gICAgICogY29uZmlndXJhdGlvbiBmaWxlIGludG8gSmF2YSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0Q29tbWFuZE1hcChsb2FkQ29uZmlndXJhdGlvbihDT01NQU5EU01BUF9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIHNldFRlc3RNYXAobG9hZENvbmZpZ3VyYXRpb24oVEVTVFNNQVBfUFJPUEVSVElFUykpOwotICAgICAgICBzZXRDb21wYXJhdG9yTWFwKGxvYWRDb25maWd1cmF0aW9uKENPTVBBUkFUT1JTTUFQX1BST1BFUlRJRVMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbmN1cnJlbnRNYXA8U3RyaW5nLFN0cmluZz4gbG9hZENvbmZpZ3VyYXRpb24oZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKG5hbWUpOwotICAgICAgICBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSAKLSAgICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ocHJvcGVydGllcy5zaXplKCksIDEuMGYsIGluaXRpYWxDb25jdXJyZW5jeUxldmVsKTsKLSAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5OiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlzID0gZ2V0Q29uZmlnU3RyZWFtKG5hbWUpOwotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwLmxvYWQoaXMpOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21tYW5kTWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21tYW5kTWFwCi0gICAgICogICAgICAgICAgICBUaGUgY29tbWFuZE1hcCB0byBzZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Q29tbWFuZE1hcChDb25jdXJyZW50TWFwPFN0cmluZywgU3RyaW5nPiBjb21tYW5kTWFwKSB7Ci0gICAgICAgIGZpZWxkQ29tbWFuZE1hcCA9IGNvbW1hbmRNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGVzdE1hcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVzdE1hcAotICAgICAqICAgICAgICAgICAgVGhlIHRlc3RNYXAgdG8gc2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFRlc3RNYXAoQ29uY3VycmVudE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdE1hcCkgewotICAgICAgICBmaWVsZFRlc3RNYXAgPSB0ZXN0TWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbXBhcmF0b3JNYXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3JNYXAKLSAgICAgKiAgICAgICAgICAgIFRoZSBjb21wYXJhdG9yTWFwIHRvIHNldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDb21wYXJhdG9yTWFwKENvbmN1cnJlbnRNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBhcmF0b3JNYXApIHsKLSAgICAgICAgZmllbGRDb21wYXJhdG9yTWFwID0gY29tcGFyYXRvck1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFyYXRvck1hbmFnZXIgZ2V0Q29tcGFyYXRvck1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGFyYXRvck1hbmFnZXJJbXBsKGZpZWxkQ29tcGFyYXRvck1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRNYW5hZ2VySW1wbChmaWVsZENvbW1hbmRNYXApOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TWFuYWdlciBnZXRUZXN0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0TWFuYWdlckltcGwoZmllbGRUZXN0TWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9nIGdldExvZygpIHsKLSAgICAgICAgcmV0dXJuIGxvZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TG9nKExvZyBsb2cpIHsKLSAgICAgICAgdGhpcy5sb2cgPSBsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIFNpZXZlRmFjdG9yeSBidWlsZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaWV2ZUZhY3RvcnkoZ2V0Q29tbWFuZE1hbmFnZXIoKSwgZ2V0Q29tcGFyYXRvck1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICBnZXRUZXN0TWFuYWdlcigpLCBnZXRMb2coKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbnN0YW50cy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzVkZDBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT01QQVJBVE9SID0gIjpjb21wYXJhdG9yIjsKLSAgICAKLSAgICAvKiogTmFtZSBvZiB0aGUgc3RhbmRhcmQgYXNjaWkgY2FzZW1hcCBjb21wYXJhdG9yLiBTZWUgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDc5MCc+UkZDNDc5MDwvYT4uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFSQVRPUl9BU0NJSV9DQVNFTUFQX05BTUUgPSAiaTthc2NpaS1jYXNlbWFwIjsKLSAgICAvKiogTmFtZSBvZiB0aGUgc3RhbmRhcmQgb2N0ZXQgY29tcGFyYXRvci4gU2VlIDxhIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ3OTAnPlJGQzQ3OTA8L2E+LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkFUT1JfT0NURVRfTkFNRSA9ICJpO29jdGV0IjsKLSAgICAvKiogUHJlZml4IHVzZWQgdG8gaWRlbnRpZnkgZXh0ZW5zaW9uIGdyb3Vwcy4gU2VlIDxhIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzUyMjgjc2VjdGlvbi02LjEnPlJGQzUyMjgsIDYuMS4gQ2FwYWJpbGl0eSBTdHJpbmc8L2E+ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFUVVJUkVfRVhURU5TSU9OX1BSRUZJWCA9ICctJzsKLSAgICAvKiogUHJlZml4IHVzZWQgdG8gaWRlbnRpZnkgY29tcGFyYXRvciBleHRlbnNpb25zLiBTZWUgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTIyOCNzZWN0aW9uLTYuMSc+UkZDNTIyOCwgNi4xLiBDYXBhYmlsaXR5IFN0cmluZzwvYT4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVJBVE9SX1BSRUZJWCA9ICJjb21wYXJhdG9yIiArIFJFUVVJUkVfRVhURU5TSU9OX1BSRUZJWDsKLSAgICAvKiogTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4ge0BsaW5rICNDT01QQVJBVE9SX1BSRUZJWH0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVJBVE9SX1BSRUZJWF9MRU5HVEggPSBDT01QQVJBVE9SX1BSRUZJWC5sZW5ndGgoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9FeGVjdXRhYmxlLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWI0NmE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9FeGVjdXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhbiBFeGVjdXRhYmxlIG9wZXJhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeGVjdXRhYmxlIHsKLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9FeGVjdXRhYmxlQ29tbWFuZC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0V4ZWN1dGFibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODhhOTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0V4ZWN1dGFibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIEV4ZWN1dGFibGVDb21tYW5kIGRlZmluZXMgdGhlIG1ldGhvZCBzaWduYXR1cmVzIGZvciBTaWV2ZSBDb21tYW5kcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeGVjdXRhYmxlQ29tbWFuZCB7Ci0gICAgLyoqCi0gICAgICogTWV0aG9kIGV4ZWN1dGUgZXhlY3V0ZXMgYSBTaWV2ZSBDb21tYW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBtYWlsIGFnYWluc3Qgd2hpY2ggdGhlIENvbW1hbmQgaXMgZXhlY3V0ZWQuCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cyAtCi0gICAgICogICAgICAgICAgICBUaGUgQ29tbWFuZCBhcmd1bWVudHMKLSAgICAgKiBAcGFyYW0gYmxvY2sgLQotICAgICAqICAgICAgICAgICAgQW4gb3B0aW9uYWwgQmxvY2sgdG8gYmUgZXZhbHVhdGVkCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNpZXZlQ29udGV4dDwvY29kZT4gY29udGFpbmluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLAotICAgICAqICAgICAgICAgICAgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIE9iamVjdCAtIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgQ29tbWFuZAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywgQmxvY2sgYmxvY2ssCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTnVtYmVyQXJndW1lbnQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9OdW1iZXJBcmd1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0MDUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9OdW1iZXJBcmd1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlRva2VuOwotCi0vKioKLSAqIDxwPgotICogQSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJGQzMwMjggQk5GLi4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPjEqRElHSVQgW1FVQU5USUZJRVJdPC9jb2RlPgotICogCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgc3RvcmVkIHZhbHVlIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhZnRlciBhcHBseWluZyB0aGUKLSAqIHF1YW50aWZpZXIuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIE51bWJlckFyZ3VtZW50IGltcGxlbWVudHMgQXJndW1lbnQgewotCi0gICAgLyoqCi0gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBudW1iZXIgYWZ0ZXIgYXBwbHlpbmcgdGhlIHF1ZW50aWZpZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGZpZWxkVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTnVtYmVyQXJndW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOdW1iZXJBcmd1bWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTnVtYmVyQXJndW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRva2VuCi0gICAgICovCi0gICAgcHVibGljIE51bWJlckFyZ3VtZW50KFRva2VuIHRva2VuKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgc2V0VmFsdWUodG9rZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZWNpdmVyIHRvIGFuIEludGVnZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bWJlcgotICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEludGVnZXIgbnVtYmVyKSB7Ci0gICAgICAgIGZpZWxkVmFsdWUgPSBudW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudCNnZXRWYWx1ZSgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldEludGVnZXIgYW5zd2VycyB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyIGFzIGFuIEludGVnZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBJbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIEludGVnZXIgZ2V0SW50ZWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVyIGZyb20gYSBUb2tlbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYVRva2VuCi0gICAgICogICAgICAgICAgICBUaGUgVG9rZW4gZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSB2YWx1ZSB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShUb2tlbiBhVG9rZW4pIHsKLSAgICAgICAgaW50IGVuZEluZGV4ID0gYVRva2VuLmltYWdlLmxlbmd0aCgpOwotICAgICAgICBpbnQgbWFnbml0dWRlID0gMTsKLSAgICAgICAgaWYgKGFUb2tlbi5pbWFnZS5lbmRzV2l0aCgiSyIpKSB7Ci0gICAgICAgICAgICBtYWduaXR1ZGUgPSAxMDI0OwotICAgICAgICAgICAgZW5kSW5kZXgtLTsKLSAgICAgICAgfSBlbHNlIGlmIChhVG9rZW4uaW1hZ2UuZW5kc1dpdGgoIk0iKSkgewotICAgICAgICAgICAgbWFnbml0dWRlID0gMTA0ODU3NjsKLSAgICAgICAgICAgIGVuZEluZGV4LS07Ci0gICAgICAgIH0gZWxzZSBpZiAoYVRva2VuLmltYWdlLmVuZHNXaXRoKCJHIikpIHsKLSAgICAgICAgICAgIG1hZ25pdHVkZSA9IDEwNzM3NDE4MjQ7Ci0gICAgICAgICAgICBlbmRJbmRleC0tOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsdWUobmV3IEludGVnZXIoSW50ZWdlci5wYXJzZUludChhVG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgZW5kSW5kZXgpKQotICAgICAgICAgICAgICAgICogbWFnbml0dWRlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKGdldFZhbHVlKCkgPT0gbnVsbCkgPyAibnVsbCIgOiBnZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2NyaXB0Q29vcmRpbmF0ZS5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NjcmlwdENvb3JkaW5hdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViODQxYS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2NyaXB0Q29vcmRpbmF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uYWwgZXh0ZW50IG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzY3JpcHQgYmVpbmcKLSAqIGV4ZWN1dGVkLiBJbiBvdGhlciB3b3JkcywgdGhpcyBnaXZlcyB0aGUgbGluZSBhbmQgY29sdW1uIGF0IHdoaWNoIHRoZSBlbG1lbnQKLSAqIHN0YXJ0cyBhbmQgYXQgd2hpY2ggaXQgZW5kcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNjcmlwdENvb3JkaW5hdGUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3RhcnRMaW5lTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3RhcnRDb2x1bW5OdW1iZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBlbmRMaW5lTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZW5kQ29sdW1uTnVtYmVyOwotCi0gICAgcHJpdmF0ZSBMb2cgbG9nOwotCi0gICAgcHVibGljIFNjcmlwdENvb3JkaW5hdGUoZmluYWwgaW50IHN0YXJ0TGluZU51bWJlciwKLSAgICAgICAgICAgIGZpbmFsIGludCBzdGFydENvbHVtbk51bWJlciwgZmluYWwgaW50IGVuZExpbmVOdW1iZXIsCi0gICAgICAgICAgICBmaW5hbCBpbnQgZW5kQ29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc3RhcnRMaW5lTnVtYmVyID0gc3RhcnRMaW5lTnVtYmVyOwotICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uTnVtYmVyID0gc3RhcnRDb2x1bW5OdW1iZXI7Ci0gICAgICAgIHRoaXMuZW5kTGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7Ci0gICAgICAgIHRoaXMuZW5kQ29sdW1uTnVtYmVyID0gZW5kQ29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2cgZ2V0TG9nKCkgewotICAgICAgICByZXR1cm4gbG9nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvZyhMb2cgbG9nZ2VyKSB7Ci0gICAgICAgIHRoaXMubG9nID0gbG9nZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aGUgY29sdW1uIHdoZXJlIHRoZSBlbGVtZW50cyBlbmRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29sdW1uIG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RW5kQ29sdW1uTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gZW5kQ29sdW1uTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aGUgbGluZSB3aGVyZSB0aGUgZWxlbWVudCBlbmRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbGluZSBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVuZExpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBlbmRMaW5lTnVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aGUgY29sdW1uIHdoZXJlIHRoZSBlbGVtZW50IHN0YXJ0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29sdW1uIG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdGFydENvbHVtbk51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgd2hlcmUgdGhlIGVsZW1lbnQgc3RhcnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbGluZSBudW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0TGluZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIHN0YXJ0TGluZU51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3ludGF4IGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gbWVzc2FnZSBjb250YWluaW5nIGRldGFpbHMKLSAgICAgKiBvZiB0aGUgc2NyaXB0IHBvc2l0aW9uLiBUaGUgbWVzc2FnZSBzaG91bGQgZW5kIHdpdGggYSBmdWxsIHN0b3AuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gY29udGFpbmluZyB0aGUgYmFzZSBtZXNzYWdlLCBub3QKLSAgICAgKiAgICAgICAgICAgIG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlN5bnRheEV4Y2VwdGlvbjwvY29kZT4gd2l0aCBkZXRhaWxzIG9mIHRoZSBzY3JpcHQKLSAgICAgKiAgICAgICAgIHBvc2l0aW9uIGFwcGVuZGVkIHRvIHRoZSBtZXNzYWdlLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24gc3ludGF4RXhjZXB0aW9uKENoYXJTZXF1ZW5jZSBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZ0RpYWdub3N0aWNzSW5mbyhsb2cpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTWVzc2FnZSA9IGFkZFN0YXJ0TGluZUFuZENvbHVtbihtZXNzYWdlKTsKLSAgICAgICAgZmluYWwgU3ludGF4RXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBTeW50YXhFeGNlcHRpb24oZnVsbE1lc3NhZ2UpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21tYW5kIGV4Y2VwdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gbWVzc2FnZSBjb250YWluaW5nIGRldGFpbHMKLSAgICAgKiBvZiB0aGUgc2NyaXB0IHBvc2l0aW9uLiBUaGUgbWVzc2FnZSBzaG91bGQgZW5kIHdpdGggYSBmdWxsIHN0b3AuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gY29udGFpbmluZyB0aGUgYmFzZSBtZXNzYWdlLCBub3QKLSAgICAgKiAgICAgICAgICAgIG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkNvbW1hbmRFeGNlcHRpb248L2NvZGU+IHdpdGggZGV0YWlscyBvZiB0aGUgc2NyaXB0Ci0gICAgICogICAgICAgICBwb3NpdGlvbiBhcHBlbmRlZCB0byB0aGUgbWVzc2FnZSwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbiBjb21tYW5kRXhjZXB0aW9uKENoYXJTZXF1ZW5jZSBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZ0RpYWdub3N0aWNzSW5mbyhsb2cpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmdWxsTWVzc2FnZSA9IGFkZFN0YXJ0TGluZUFuZENvbHVtbihtZXNzYWdlKTsKLSAgICAgICAgZmluYWwgQ29tbWFuZEV4Y2VwdGlvbiByZXN1bHQgPSBuZXcgQ29tbWFuZEV4Y2VwdGlvbihmdWxsTWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhIHN0YW5kYXJkIHBvc2l0aW9uIHBocmFzZSB0byB0aGUgZ2l2ZW4gbWVzc2FnZS4gVGhpcyBtZXNzYWdlCi0gICAgICogc2hvdWxkIGVuZCB3aXRoIGEgZnVsbCBzdG9wLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IG1lc3NhZ2UsIG5vdCBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugd2l0aAotICAgICAqICAgICAgICAgcG9zaXRpb25hbCBwaHJhc2UgYXBwZW5kZWQsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBhZGRTdGFydExpbmVBbmRDb2x1bW4oQ2hhclNlcXVlbmNlIG1lc3NhZ2UpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWZmZXI7Ci0gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgU3RyaW5nQnVpbGRlcikgewotICAgICAgICAgICAgYnVmZmVyID0gKFN0cmluZ0J1aWxkZXIpIG1lc3NhZ2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXNzYWdlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBMaW5lICIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHN0YXJ0TGluZU51bWJlcik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBjb2x1bW4gIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoc3RhcnRDb2x1bW5OdW1iZXIpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIGRpYWdub3RpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2NyaXB0IGNvb3JkaW5hdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxvZ2dlcgotICAgICAqICAgICAgICAgICAgPGNvZGU+TG9nPC9jb2RlPiwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2dEaWFnbm9zdGljc0luZm8oTG9nIGxvZ2dlcikgewotICAgICAgICBpZiAobG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkV4cHJlc3Npb24gc3RhcnRzIGxpbmUgIiArIHN0YXJ0TGluZU51bWJlcgotICAgICAgICAgICAgICAgICAgICArICIgY29sdW1uICIgKyBzdGFydENvbHVtbk51bWJlcik7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRXhwcmVzc2lvbiBlbmRzIGxpbmUgIiArIGVuZExpbmVOdW1iZXIgKyAiIGNvbHVtbiAiCi0gICAgICAgICAgICAgICAgICAgICsgZW5kQ29sdW1uTnVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvZ3MgZGlhZ25vdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzY3JpcHQgY29vcmRpbmF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9nZ2VyCi0gICAgICogICAgICAgICAgICA8Y29kZT5Mb2c8L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYnVnRGlhZ25vc3RpY3MoTG9nIGxvZ2dlcikgewotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRXhwcmVzc2lvbiBzdGFydHMgbGluZSAiICsgc3RhcnRMaW5lTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICsgIiBjb2x1bW4gIiArIHN0YXJ0Q29sdW1uTnVtYmVyKTsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRXhwcmVzc2lvbiBlbmRzIGxpbmUgIiArIGVuZExpbmVOdW1iZXIgKyAiIGNvbHVtbiAiCi0gICAgICAgICAgICAgICAgICAgICsgZW5kQ29sdW1uTnVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZmZWNlOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIDxjb2RlPlNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGVzIGFuIGV4Y2VwdGlvbmFsCi0gKiBjb25kaXRpb24gZW5jb3VudGVyZWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgU2lldmUgY29uZmlndXJhdGlvbi4KLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVDb250ZXh0LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTZjZmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NpZXZlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLQotLyoqCi0gKiBDb250ZXh0IGZvciBzaWV2ZSBvcGVyYXRpb25zLgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaWV2ZUNvbnRleHQgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2NyaXB0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG9wZXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlNjcmlwdENvb3JkaW5hdGU8L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTY3JpcHRDb29yZGluYXRlIGdldENvb3JkaW5hdGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNjcmlwdCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBvcGVyYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkaW5hdGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNjcmlwdENvb3JkaW5hdGU8L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvb3JkaW5hdGUoU2NyaXB0Q29vcmRpbmF0ZSBjb29yZGluYXRlKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbW1hbmQgc3RhdGUgbWFuYWdlci4KLSAgICAgKiBAcmV0dXJuIGNvbW1hbmQgc3RhdGUgbWFuYWdlLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBDb21tYW5kU3RhdGVNYW5hZ2VyIGdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbmRpdGlvbiBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uIG1hbmFnZXIsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENvbmRpdGlvbk1hbmFnZXIgZ2V0Q29uZGl0aW9uTWFuYWdlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29uZGl0aW9uIG1hbmFnZXIuCi0gICAgICogQHBhcmFtIG1hbmFnZXIgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb25kaXRpb25NYW5hZ2VyKGZpbmFsIENvbmRpdGlvbk1hbmFnZXIgbWFuYWdlcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb21tYW5kIG1hbmFnZXIuCi0gICAgICogQHJldHVybiBjb21tYW5kIG1hbmFnZXIsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29tcGFyYXRvciBtYW5hZ2VyLgotICAgICAqIEByZXR1cm4gbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29tcGFyYXRvck1hbmFnZXIgZ2V0Q29tcGFyYXRvck1hbmFnZXIoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0ZXN0IG1hbmFnZXIuCi0gICAgICogQHJldHVybiB0ZXN0IG1hbmFnZXIsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFRlc3RNYW5hZ2VyIGdldFRlc3RNYW5hZ2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2cuCi0gICAgICogQHJldHVybiBsb2csIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IExvZyBnZXRMb2coKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZUZhY3RvcnkuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZmUzNy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TdG9wRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uS2VlcDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2lldmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5TaWV2ZVBhcnNlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5TaW1wbGVOb2RlOwotCi0vKioKLSAqIDxwPgotICogU2lldmVGYWN0b3J5IGlzIHRoZSBwcmltYXJ5IGludm9jYXRpb24gcG9pbnQgZm9yIGFsbCBTaWV2ZQotICogb3BlcmF0aW9ucy4gVGhlc2UgYXJlLi4uCi0gKiA8ZGw+Ci0gKiA8ZHQ+e0BsaW5rICNwYXJzZShJbnB1dFN0cmVhbSl9PC9kdD4KLSAqIDxkZD4gUGFyc2UgYSBTaWV2ZSBzY3JpcHQgaW50byBhIGhpZXJhcmNoeSBvZiBwYXJzZWQgbm9kZXMuIEEgc3VjY2VzZnVsIHBhcnNlCi0gKiBtZWFucyB0aGUgc2NyaXB0IGlzIGxleGljYWxseSBhbmQgZ3JhbWF0aWNhbGx5IHZhbGlkIGFjY29yZGluZyB0byBSRkMgMzAyOCwKLSAqIHNlY3Rpb24gOC4gVGhlIHJlc3VsdCBpcyB0aGUgc3RhcnQgbm9kZSBvZiB0aGUgcGFyc2VkIFNpZXZlIHNjcmlwdC4gVGhlIHN0YXJ0Ci0gKiBub2RlIGlzIHJlc3VhYmxlLiBUeXBpY2FsbHkgaXQgaXMgc3RvcmVkIGZvciByZXVzZSBpbiBhbGwgc3Vic2VxdWVudAotICogZXZhbHVhdGlvbnMgb2YgdGhlIHNjcmlwdC4gPC9kZD4KLSAqIDxkdD57QGxpbmsgI2V2YWx1YXRlKE1haWxBZGFwdGVyLCBOb2RlKX08L2R0PgotICogPGRkPiBFdmFsdWF0ZSBhbiBSRkMgODIyIGNvbXBsaWFudCBtYWlsIG1lc3NhZ2Ugd3JhcHBlZCBpbiBhIHtAbGluayBNYWlsQWRhcHRlcn0KLSAqIGFnYWluc3QgdGhlIHBhcnNlIHJlc3VsdCByZWZlcmVuY2VkIGJ5IHRoZSBzdGFydCBub2RlIGZyb20gdGhlIFBhcnNlCi0gKiBvcGVyYXRpb24gYWJvdmUuIEFzIGV2YWx1YXRpb24gcHJvY2VlZHMgYSBMaXN0IG9mIHtAbGluayBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbn1zIAotICogaXMgYWRkZWQgdG8gdGhlIE1haWxBZGFwdGVyLiBBdCB0aGUgZW5kIG9mIGV2YWx1YXRpb24sIGVhY2ggQWN0aW9uIGluIHRoZSBMaXN0IGlzIGV4ZWN1dGVkIGluCi0gKiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFkZGVkLiA8L2RkPgotICogPGR0PntAbGluayAjaW50ZXJwcmV0KE1haWxBZGFwdGVyLCBJbnB1dFN0cmVhbSl9PC9kdD4KLSAqIDxkZD5BIGNvbmNhdGVuYXRpb24gb2YgcGFyc2UgYW5kIGV2YWx1YXRlLiBVc2VmdWwgZm9yIHRlc3RpbmcsIGJ1dCBnZW5lcmFsbHkKLSAqIHRoZSBwYXJzZSByZXN1bHQgc2hvdWxkIGJlIHN0b3JlZCBmb3IgcmV1c2UgaW4gc3Vic2VxdWVudCBldmFsdWF0aW9ucy4gPC9kZD4KLSAqIDwvZGw+Ci0gKiA8L3A+Ci0gKiA8aDQ+VGhyZWFkIFNhZmV0eTwvaDQ+Ci0gKiA8cD4KLSAqIEFuIGluc3RhbmNlIGNhbiBiZSBzYWZlbHkgYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIG1hbmFnZXJzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZSAKLSAqICh3aGVuIHtAbGluayAjU2lldmVGYWN0b3J5KENvbW1hbmRNYW5hZ2VyLCBDb21wYXJhdG9yTWFuYWdlciwgVGVzdE1hbmFnZXIsIExvZyl9IAotICogaXMgY2FsbGVkKSBhcmUgdGhyZWFkIHNhZmUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaWV2ZUZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvck1hbmFnZXIgY29tcGFyYXRvck1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFRlc3RNYW5hZ2VyIHRlc3RNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2cgbG9nOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlRmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVGYWN0b3J5KGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyLAotICAgICAgICAgICAgZmluYWwgQ29tcGFyYXRvck1hbmFnZXIgY29tcGFyYXRvck1hbmFnZXIsCi0gICAgICAgICAgICBmaW5hbCBUZXN0TWFuYWdlciB0ZXN0TWFuYWdlciwgZmluYWwgTG9nIGxvZykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvck1hbmFnZXIgPSBjb21wYXJhdG9yTWFuYWdlcjsKLSAgICAgICAgdGhpcy50ZXN0TWFuYWdlciA9IHRlc3RNYW5hZ2VyOwotICAgICAgICB0aGlzLmxvZyA9IGxvZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgcGFyc2UgcGFyc2VzIGEgU2lldmUgc2NyaXB0IGludG8gYSBoaWVyYXJjaHkgb2YgcGFyc2VkIG5vZGVzLiBBCi0gICAgICogc3VjY2Vzc2Z1bCBwYXJzZSBtZWFucyB0aGUgc2NyaXB0IGlzIGxleGljYWxseSBhbmQgZ3JhbW1hdGljYWxseSB2YWxpZAotICAgICAqIGFjY29yZGluZyB0byBSRkMgMzAyOCwgc2VjdGlvbiA4LiBUaGUgcmVzdWx0IGlzIHRoZSBzdGFydCBub2RlIG9mIHRoZQotICAgICAqIHBhcnNlZCBTaWV2ZSBzY3JpcHQuIFRoZSBzdGFydCBub2RlIGlzIHJldXNhYmxlLiBUeXBpY2FsbHkgaXQgaXMgc3RvcmVkCi0gICAgICogZm9yIHJldXNlIGluIHN1YnNlcXVlbnQgZXZhbHVhdGlvbnMgb2YgdGhlIHNjcmlwdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIE5vZGUKLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTaW1wbGVOb2RlIG5vZGUgPSBuZXcgU2lldmVQYXJzZXIoaW5wdXRTdHJlYW0sICJVVEYtOCIpCi0gICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOwotICAgICAgICAgICAgU2lldmVWYWxpZGF0aW9uVmlzaXRvciB2aXNpdG9yID0gbmV3IFNpZXZlVmFsaWRhdGlvblZpc2l0b3IoCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYW5hZ2VyLCB0ZXN0TWFuYWdlciwgY29tcGFyYXRvck1hbmFnZXIpOwotICAgICAgICAgICAgbm9kZS5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlBhcnNlIGZhaWxlZC4gUmVhc29uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNlIGZhaWxlZC4iLCBleCk7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlBhcnNlIGZhaWxlZC4gUmVhc29uOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNlIGZhaWxlZC4iLCBleCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBldmFsdWF0ZSBldmFsdWF0ZXMgYW4gUkZDIDgyMiBjb21wbGlhbnQgbWFpbCBtZXNzYWdlIHdyYXBwZWQgaW4gYQotICAgICAqIE1haWxBZGFwdGVyIGJ5IHZpc3RpbmcgZWFjaCBub2RlIG9mIHRoZSBwYXJzZWQgc2NyaXB0IGJlZ2lubmluZyBhdCB0aGUKLSAgICAgKiBwYXNzZWQgc3RhcnQgbm9kZS4gQXMgZXZhbHVhdGlvbiBwcm9jZWVkcyBhIExpc3Qgb2YgQWN0aW9ucyBpcyBhZGRlZCB0bwotICAgICAqIHRoZSBNYWlsQWRhcHRlci4KLSAgICAgKiA8cD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBdCB0aGUgc3RhcnQgb2YgZXZhbHVhdGlvbiBhbiAnaW1wbGljaXRLZWVwJyBzdGF0ZSBpcyBzZXQuIFRoaXMgY2FuIGJlCi0gICAgICogY2FuY2VsbGVkIGJ5IGEgQ29tbWFuZCBkdXJpbmcgZXZhbHVhdGlvbi4gSWYgJ2ltcGxpY2l0S2VlcCcgaXMgc3RpbGwgc2V0Ci0gICAgICogYXQgdGhlIGVuZCBvZiBldmFsdWF0aW9uLCBhIEtlZXAgQWN0aW9uIGlzIGFkZGVkIHRvIHRoZSBMaXN0IG9mIEFjdGlvbnMuCi0gICAgICogRmluYWxseSwgZWFjaCBBY3Rpb24gaW4gdGhlIExpc3QgaXMgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZQotICAgICAqIGFkZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFpbAotICAgICAqIEBwYXJhbSBzdGFydE5vZGUKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXZhbHVhdGUoTWFpbEFkYXB0ZXIgbWFpbCwgTm9kZSBzdGFydE5vZGUpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTaWV2ZUNvbnRleHQgY29udGV4dCA9IG5ldyBCYXNlU2lldmVDb250ZXh0KGNvbW1hbmRNYW5hZ2VyLAotICAgICAgICAgICAgICAgIGNvbXBhcmF0b3JNYW5hZ2VyLCB0ZXN0TWFuYWdlciwgbG9nKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGlzIHNldCBvbiB0aGUgbWFpbAotICAgICAgICAgICAgbWFpbC5zZXRDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTaWV2ZVBhcnNlclZpc2l0b3IgdmlzaXRvciA9IG5ldyBTaWV2ZVBhcnNlclZpc2l0b3JJbXBsKGNvbnRleHQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgTm9kZXMKLSAgICAgICAgICAgICAgICBzdGFydE5vZGUuamp0QWNjZXB0KHZpc2l0b3IsIG1haWwpOwotICAgIAotICAgICAgICAgICAgfSBjYXRjaCAoU3RvcEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgaXMgT0sKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV2YWx1YXRpb24gZmFpbGVkLiBSZWFzb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFdmFsdWF0aW9uIGZhaWxlZC4iLCBleCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAvLyBJZiBhZnRlciBldmFsdWF0aW5nIGFsbCBvZiB0aGUgbm9kZXMgb3Igc3RvcHBpbmcsIGltcGxpY2l0S2VlcCBpcwotICAgICAgICAgICAgLy8gc3RpbGwKLSAgICAgICAgICAgIC8vIGluIGVmZmVjdCwgYWRkIGEgS2VlcCB0byB0aGUgbGlzdCBvZiBBY3Rpb25zLgotICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q29tbWFuZFN0YXRlTWFuYWdlcigpLmlzSW1wbGljaXRLZWVwKCkpCi0gICAgICAgICAgICAgICAgbWFpbC5hZGRBY3Rpb24obmV3IEFjdGlvbktlZXAoKSk7Ci0gICAgCi0gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBMaXN0IG9mIEFjdGlvbnMKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWFpbC5leGVjdXRlQWN0aW9ucygpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXZhbHVhdGlvbiBmYWlsZWQuIFJlYXNvbjogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV2YWx1YXRpb24gZmFpbGVkLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIFRpZHkgdXAgYnkgZW5zdXJpbmcgdGhhdCBhIHJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBpcyBub3QgaGVsZCBieSB0aGUgYWRhcHRlci4KLSAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgbGVha3Mgd2hlbiB0aGUgYWRhcHRlciBzdG9yZXMgdGhlIGNvbnRleHQgaW4gYSB0aHJlYWQgbG9jYWwgdmFyaWFibGUuCi0gICAgICAgICAgICBtYWlsLnNldENvbnRleHQobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW50ZXJwcmV0IHBhcnNlcyBhIFNpZXZlIHNjcmlwdCBhbmQgdGhlbiBldmFsdWF0ZXMgdGhlIHJlc3VsdAotICAgICAqIGFnYWluc3QgYSBtYWlsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIGlucHV0U3RyZWFtCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXQoTWFpbEFkYXB0ZXIgbWFpbCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZXZhbHVhdGUobWFpbCwgcGFyc2UoaW5wdXRTdHJlYW0pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVQYXJzZXJWaXNpdG9ySW1wbC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NpZXZlUGFyc2VyVmlzaXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmNTlmOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVQYXJzZXJWaXNpdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUYXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rhcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RibG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rjb21tYW5kczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0YXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nX2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1R0ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUdGVzdF9saXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2lldmVQYXJzZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2ltcGxlTm9kZTsKLQotLyoqCi0gKiA8cD4KLSAqIENsYXNzIFNpZXZlUGFyc2VyVmlzaXRvckltcGwgZGVmaW5lcyB0aGUgYmVoYXZpb3VyIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSBpbgotICogdGhlIFNpZXZlIGdyYW1tYXIuIEVhY2ggbWV0aG9kIGNvcnJlc3BvbmRzIHRvIGEgbm9kZSB0eXBlIGFuZCBpcyBpbnZva2VkIHdoZW4KLSAqIGEgbm9kZSBvZiB0aGF0IHR5cGUgaXMgZXZhbHVhdGVkLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEluIGVzc2VuY2UsIHRoaXMgY2xhc3MgdHJhbnNsYXRlcyBiZXR3ZWVuIHRoZSBub2RlcyBvcGVyYXRlZCBvbiBieSB0aGUgSmF2YUNDCi0gKiBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgdGhlIFNpZXZlIGNsYXNzZXMgb3BlcmF0ZWQgdXBvbiBieSB0aGUgQ29tbWFuZHMsIFRlc3RzCi0gKiBhbmQgQ29tcGFyYXRvcnMuIEEgdmlzaXQgdG8gdGhlIHN0YXJ0IG5vZGUsIEFTVHN0YXJ0LCB0cmlnZ2VycyBldmFsdWF0aW9uIG9mCi0gKiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFNlZSBodHRwczovL2phdmFjYy5kZXYuamF2YS5uZXQvZG9jL0pKVHJlZS5odG1sIGZvciBpbmRlcHRoIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBWaXNpdG9yIHN1cHBvcnQuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUuIEl0J3MgdXNlIHNob3VsZCBiZQotICogcmVzdHJpY3RlZCB0byBhIHNpbmdsZSB0aHJlYWQgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHZpc2l0LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU2lldmVQYXJzZXJWaXNpdG9ySW1wbCBpbXBsZW1lbnRzIFNpZXZlUGFyc2VyVmlzaXRvciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTaWV2ZUNvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBOb2RlVmlzaXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVQYXJzZXJWaXNpdG9ySW1wbChmaW5hbCBTaWV2ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB2aXNpdENoaWxkcmVuIGFkZHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIHRvIHRoZSBwYXNzZWQgTGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBkYXRhIC0KLSAgICAgKiAgICAgICAgICAgIEFzc3VtZXMgYSBMaXN0Ci0gICAgICogQHJldHVybiBPYmplY3QgLSBBIExpc3QKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIE9iamVjdCB2aXNpdENoaWxkcmVuKFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChub2RlLmpqdEdldE51bUNoaWxkcmVuKCkpOwotICAgICAgICBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGNoaWxkcmVuKTsKLSAgICAgICAgKChMaXN0KSBkYXRhKS5hZGRBbGwoY2hpbGRyZW4pOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFNpZXZlUGFyc2VyVmlzaXRvciN2aXNpdChBU1Rhcmd1bWVudCwgT2JqZWN0KQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYXJndW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihub2RlLmpqdEdldE51bUNoaWxkcmVuKCkpOwotICAgICAgICBBcmd1bWVudCBhcmd1bWVudCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gbm9kZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBhcmd1bWVudCA9IChBcmd1bWVudCkgbm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgU3RyaW5nTGlzdEFyZ3VtZW50KCgoTGlzdCkgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLAotICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbikpKTsKLSAgICAgICAgfQotICAgICAgICAoKExpc3QpIGRhdGEpLmFkZChhcmd1bWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBTaWV2ZVBhcnNlclZpc2l0b3IjdmlzaXQoQVNUYXJndW1lbnRzLCBPYmplY3QpCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Rhcmd1bWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSk7Ci0gICAgICAgIGNoaWxkcmVuID0gKChMaXN0KSBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGNoaWxkcmVuKSk7Ci0KLSAgICAgICAgLy8gRXh0cmFjdCBUZXN0cyBhbmQgVGVzdExpc3QgZnJvbSB0aGUgY2hpbGRyZW4KLSAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgVGVzdExpc3QgdGVzdExpc3QgPSBudWxsOwotICAgICAgICBMaXN0PEFyZ3VtZW50PiBhcmdMaXN0ID0gbmV3IEFycmF5TGlzdDxBcmd1bWVudD4oY2hpbGRyZW4uc2l6ZSgpKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkcmVuSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBuZXh0ID0gY2hpbGRyZW5JdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVGVzdCkKLSAgICAgICAgICAgICAgICB0ZXN0TGlzdCA9IG5ldyBUZXN0TGlzdCgoVGVzdCkgbmV4dCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgVGVzdExpc3QpCi0gICAgICAgICAgICAgICAgdGVzdExpc3QgPSAoVGVzdExpc3QpIG5leHQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgQXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBhcmdMaXN0LmFkZCgoQXJndW1lbnQpbmV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9nKCkuZXJyb3IoIkV4cGVjdGVkIGFuICdBcmd1bWVudCcgYnV0IHdhcyAiICsgbmV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50cyhhcmdMaXN0LCB0ZXN0TGlzdCk7Ci0gICAgICAgICgoTGlzdCkgZGF0YSkuYWRkKGFyZ3VtZW50cyk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVQYXJzZXJWaXNpdG9yI3Zpc2l0KEFTVGJsb2NrLCBPYmplY3QpCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1RibG9jayBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaWYgKG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSAhPSAxKQotICAgICAgICAvLyB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkV4cGVjdGluZyBleGFjdGx5IG9uZSAxIGNoaWxkIik7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSk7Ci0gICAgICAgIENvbW1hbmRzIGNvbW1hbmRzID0gKENvbW1hbmRzKSAoKExpc3QpIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywKLSAgICAgICAgICAgICAgICBjaGlsZHJlbikpLmdldCgwKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBuZXcgQmxvY2soY29tbWFuZHMpOwotICAgICAgICAoKExpc3QpIGRhdGEpLmFkZChibG9jayk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVQYXJzZXJWaXNpdG9yI3Zpc2l0KEFTVGNvbW1hbmQsIE9iamVjdCkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGNvbW1hbmQgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSk7Ci0gICAgICAgIGNoaWxkcmVuID0gKChMaXN0KSBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGNoaWxkcmVuKSk7Ci0KLSAgICAgICAgLy8gRXh0cmFjdCB0aGUgQXJndW1lbnRzIGFuZCBCbG9jayBmcm9tIHRoZSBjaGlsZHJlbgotICAgICAgICBJdGVyYXRvciBjaGlsZHJlbkl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOwotICAgICAgICBBcmd1bWVudHMgYXJndW1lbnRzID0gbnVsbDsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBudWxsOwotICAgICAgICB3aGlsZSAoY2hpbGRyZW5JdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBjaGlsZHJlbkl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBBcmd1bWVudHMpCi0gICAgICAgICAgICAgICAgYXJndW1lbnRzID0gKEFyZ3VtZW50cykgbmV4dDsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgaW5zdGFuY2VvZiBCbG9jaykKLSAgICAgICAgICAgICAgICBibG9jayA9IChCbG9jaykgbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRleHQuc2V0Q29vcmRpbmF0ZShub2RlLmdldENvb3JkaW5hdGUoKSk7Ci0gICAgICAgIGZpbmFsIFNjcmlwdENvb3JkaW5hdGUgY29vcmRpbmF0ZSA9IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpOwotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tbWFuZChub2RlLmdldE5hbWUoKSwgYXJndW1lbnRzLCBibG9jaywKLSAgICAgICAgICAgICAgICBjb29yZGluYXRlKTsKLSAgICAgICAgKChMaXN0KSBkYXRhKS5hZGQoY29tbWFuZCk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVQYXJzZXJWaXNpdG9yI3Zpc2l0KEFTVGNvbW1hbmRzLCBPYmplY3QpCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Rjb21tYW5kcyBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxDb21tYW5kPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Q29tbWFuZD4obm9kZS5qanRHZXROdW1DaGlsZHJlbigpKTsKLSAgICAgICAgQ29tbWFuZHMgY29tbWFuZHMgPSBuZXcgQ29tbWFuZHMoKChMaXN0KSBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4pKSk7Ci0gICAgICAgICgoTGlzdCkgZGF0YSkuYWRkKGNvbW1hbmRzKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBTaWV2ZVBhcnNlclZpc2l0b3IjdmlzaXQoQVNUc3RhcnQsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVHN0YXJ0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBUaGUgZGF0YSBvYmplY3QgbXVzdCBiZSB0aGUgTWFpbEFkYXB0ZXIgdG8gcHJvY2VzcwotICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgTWFpbEFkYXB0ZXIpKQotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlRXhjZXB0aW9uKCJFeHBlY3RpbmcgYW4gaW5zdGFuY2Ugb2YgIgotICAgICAgICAgICAgICAgICAgICArIE1haWxBZGFwdGVyLmNsYXNzLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgYXMgZGF0YSwgcmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgIgotICAgICAgICAgICAgICAgICAgICArIChkYXRhID09IG51bGwgPyAiPG51bGw+IiA6IGRhdGEuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICsgIi4iKTsKLQotICAgICAgICAvLyBTdGFydCBpcyBhbiBpbXBsaWNpdCBCbG9jawotICAgICAgICAvLyBUaGVyZSB3aWxsIGJlIG9uZSBjaGlsZCwgYW4gaW5zdGFuY2Ugb2YgQ29tbWFuZHMKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qobm9kZS5qanRHZXROdW1DaGlsZHJlbigpKTsKLSAgICAgICAgQ29tbWFuZHMgY29tbWFuZHMgPSAoQ29tbWFuZHMpICgoTGlzdCkgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLAotICAgICAgICAgICAgICAgIGNoaWxkcmVuKSkuZ2V0KDApOwotICAgICAgICBCbG9jayBibG9jayA9IG5ldyBCbG9jayhjb21tYW5kcyk7Ci0gICAgICAgIGNvbnRleHQuc2V0Q29vcmRpbmF0ZShub2RlLmdldENvb3JkaW5hdGUoKSk7Ci0gICAgICAgIC8vIEFuc3dlciB0aGUgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgQmxvY2sKLSAgICAgICAgcmV0dXJuIGJsb2NrLmV4ZWN1dGUoKE1haWxBZGFwdGVyKSBkYXRhLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFNpZXZlUGFyc2VyVmlzaXRvciN2aXNpdChBU1RzdHJpbmdfbGlzdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RyaW5nX2xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB2aXNpdENoaWxkcmVuKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVQYXJzZXJWaXNpdG9yI3Zpc2l0KEFTVHN0cmluZywgT2JqZWN0KQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RyaW5nIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIC8vIFN0cmluZ3MgYXJlIGFsd2F5cyBzdXJyb3VuZCBieSBkb3VibGUtcXVvdGVzCi0gICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgLy8gQSBTdHJpbmcgaXMgdGVybWluYWwsIGFkZCBpdAotICAgICAgICAoKExpc3QpIGRhdGEpLmFkZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgU2lldmVQYXJzZXJWaXNpdG9yI3Zpc2l0KEFTVHRlc3RfbGlzdCwgT2JqZWN0KQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUdGVzdF9saXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyByZXR1cm4gdmlzaXRDaGlsZHJlbihub2RlLCBkYXRhKTsKLSAgICAgICAgTGlzdDxUZXN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VGVzdD4obm9kZS5qanRHZXROdW1DaGlsZHJlbigpKTsKLSAgICAgICAgVGVzdExpc3QgdGVzdExpc3QgPSBuZXcgVGVzdExpc3QoKChMaXN0PFRlc3Q+KSBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4pKSk7Ci0gICAgICAgICgoTGlzdCkgZGF0YSkuYWRkKHRlc3RMaXN0KTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBTaWV2ZVBhcnNlclZpc2l0b3IjdmlzaXQoQVNUdGVzdCwgT2JqZWN0KQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUdGVzdCBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qobm9kZS5qanRHZXROdW1DaGlsZHJlbigpKTsKLSAgICAgICAgY2hpbGRyZW4gPSAoKExpc3QpIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgY2hpbGRyZW4pKTsKLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBBcmd1bWVudHMgZnJvbSB0aGUgY2hpbGRyZW4KLSAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5JdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLSAgICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cyA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChjaGlsZHJlbkl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbmV4dCA9IGNoaWxkcmVuSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEFyZ3VtZW50cykKLSAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSAoQXJndW1lbnRzKSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRDb29yZGluYXRlKG5vZGUuZ2V0Q29vcmRpbmF0ZSgpKTsKLSAgICAgICAgVGVzdCB0ZXN0ID0gbmV3IFRlc3Qobm9kZS5nZXROYW1lKCksIGFyZ3VtZW50cyk7Ci0gICAgICAgICgoTGlzdCkgZGF0YSkuYWRkKHRlc3QpOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIFNpZXZlUGFyc2VyVmlzaXRvciN2aXNpdChTaW1wbGVOb2RlLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXRDaGlsZHJlbihub2RlLCBkYXRhKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZVZhbGlkYXRpb25WaXNpdG9yLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2lldmVWYWxpZGF0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFjYTU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZVZhbGlkYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Mb29rdXBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUYXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rhcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RibG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rjb21tYW5kczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0YXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nX2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1R0ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUdGVzdF9saXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2lldmVQYXJzZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2ltcGxlTm9kZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5Db25zdGFudHMuKjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBWYWxpZGF0ZXMgbm9kZXMgdmlzaXRlZC4gU29tZSBjaGVja3MgYXJlIG1vcmUgY29udmVuaWVudGx5IGNhcnJpZWQgb3V0IHdoYXQKLSAqIHRoZW4gdHJlZSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN0cnVjdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU2lldmVWYWxpZGF0aW9uVmlzaXRvciBpbXBsZW1lbnRzIFNpZXZlUGFyc2VyVmlzaXRvciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgVGVzdE1hbmFnZXIgdGVzdE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yTWFuYWdlciBjb21wYXJhdG9yTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gZGVjbGFyZWRDb21wYXJhdG9yczsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZUFsbG93ZWQgPSB0cnVlOwotICAgIC8qKiBJcyB0aGUgdmlzaXRvciB3aXRoaW4gYSA8Y29kZT5yZXF1aXJlPC9jb2RlPj8gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJblJlcXVpcmUgPSBmYWxzZTsKLSAgICAvKiogSXMgdGhlIG5leHQgYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYSBjb21wYXJhdG9yIG5hbWU/ICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5leHRBcmd1bWVudElzQ29tcGFyYXRvck5hbWUgPSBmYWxzZTsKLSAgICAvKiogSXMgdGhlIHZpc2l0b3Igd2l0aGluIGEgY29tcGFyYXRvciBuYW1lIGFyZ3VtZW50PyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luQ29tcGFyYXRvck5hbWVBcmd1bWVudCA9IGZhbHNlOwotICAgIAotICAgIHByb3RlY3RlZCBTaWV2ZVZhbGlkYXRpb25WaXNpdG9yKGZpbmFsIENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyLAotICAgICAgICAgICAgZmluYWwgVGVzdE1hbmFnZXIgdGVzdE1hbmFnZXIsIGZpbmFsIENvbXBhcmF0b3JNYW5hZ2VyIGNvbXBhcmF0b3JNYW5hZ2VyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29tbWFuZE1hbmFnZXIgPSBjb21tYW5kTWFuYWdlcjsKLSAgICAgICAgdGhpcy50ZXN0TWFuYWdlciA9IHRlc3RNYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbXBhcmF0b3JNYW5hZ2VyID0gY29tcGFyYXRvck1hbmFnZXI7Ci0gICAgICAgIGRlY2xhcmVkQ29tcGFyYXRvcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IHZpc2l0Tm9kZShTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qobm9kZS5qanRHZXROdW1DaGlsZHJlbigpKTsKLSAgICAgICAgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBjaGlsZHJlbik7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RhcnQgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB2aXNpdE5vZGUobm9kZSwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Rjb21tYW5kcyBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZGVjbGFyZWRDb21wYXJhdG9ycy5jbGVhcigpOwotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUY29tbWFuZCBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBub2RlLmdldE5hbWUoKTsKLSAgICAgICAgY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChuYW1lKTsKLSAgICAgICAgaWYgKCJyZXF1aXJlIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWlyZUFsbG93ZWQpIHsKLSAgICAgICAgICAgICAgICBpc0luUmVxdWlyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICIncmVxdWlyZScgaXMgb25seSBhbGxvd2VkIGJlZm9yZSBvdGhlciBjb21tYW5kcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVxdWlyZUFsbG93ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlzSW5SZXF1aXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpc2l0Tm9kZShub2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGJsb2NrIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBSZXNldCB0ZXN0IGZvciBleHBsaWNpdGx5IHJlcXVpcmVkIGNvbXBhcmF0b3IgdHlwZXMKLSAgICAgICAgbmV4dEFyZ3VtZW50SXNDb21wYXJhdG9yTmFtZSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYXJndW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IG5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsgCi0gICAgICAgICAgICBpZiAobmV4dEFyZ3VtZW50SXNDb21wYXJhdG9yTmFtZSkgewotICAgICAgICAgICAgICAgIC8vIE1hcmsgZW5jbG9zZWQgc3RyaW5nIGZvciBjaGVjayBhZ2FpbnN0IHJlcXVpcmVkIGxpc3QKLSAgICAgICAgICAgICAgICBpc0luQ29tcGFyYXRvck5hbWVBcmd1bWVudCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0QXJndW1lbnRJc0NvbXBhcmF0b3JOYW1lID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUYWdBcmd1bWVudCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFRhZ0FyZ3VtZW50IHRhZyA9IChUYWdBcmd1bWVudCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgbmV4dEFyZ3VtZW50SXNDb21wYXJhdG9yTmFtZSA9IHRhZy5pc0NvbXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV4dEFyZ3VtZW50SXNDb21wYXJhdG9yTmFtZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQgPSB2aXNpdE5vZGUobm9kZSwgZGF0YSk7Ci0gICAgICAgIGlzSW5Db21wYXJhdG9yTmFtZUFyZ3VtZW50ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1R0ZXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUdGVzdF9saXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RyaW5nIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNJblJlcXVpcmUpIHsKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cyhub2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbkNvbXBhcmF0b3JOYW1lQXJndW1lbnQpIHsKLSAgICAgICAgICAgIGNvbXBhcmF0b3JOYW1lQXJndW1lbnQobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpc2l0Tm9kZShub2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyYXRvck5hbWVBcmd1bWVudChBU1RzdHJpbmcgbm9kZSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIC8vIENvbXBhcmF0b3JzIG11c3QgZWl0aGVyIGJlIGRlY2xhcmVkIChlaXRoZXIgaW1wbGljaXRseSBvciBleHBsaWNpdGx5KQotICAgICAgICAgICAgaWYgKCFjb21wYXJhdG9yTWFuYWdlci5pc0ltcGxpY2l0bHlEZWNsYXJlZChuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICghZGVjbGFyZWRDb21wYXJhdG9ycy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggYmV0dGVyIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVFeGNlcHRpb24oIkNvbXBhcmF0b3IgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkIGluIGEgcmVxdWlyZSBzdGF0ZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVtZW50cyhBU1RzdHJpbmcgbm9kZSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoQ09NUEFSQVRPUl9QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhcmF0b3JOYW1lID0gbmFtZS5zdWJzdHJpbmcoQ09NUEFSQVRPUl9QUkVGSVhfTEVOR1RIKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyYXRvck1hbmFnZXIuaXNTdXBwb3J0ZWQoY29tcGFyYXRvck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkQ29tcGFyYXRvcnMuYWRkKGNvbXBhcmF0b3JOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgICBUT0RPOiBSZXBsYWNlIHdpdGggbW9yZSBmaW5lbHkgZ3JhaW5lZCBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlRXhjZXB0aW9uKCJDb21wYXJhdG9yICIgKyBjb21wYXJhdG9yTmFtZSArICIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZChuYW1lKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChMb29rdXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjYXRjaGluZyBpcyBpbmVmZmljaWVudCwgc2hvdWxkIGp1c3QgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgdGVzdE1hbmFnZXIuZ2V0VGVzdChuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVHN0cmluZ19saXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUsIGRhdGEpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1N0cmluZ0xpc3RBcmd1bWVudC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1N0cmluZ0xpc3RBcmd1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhkOGQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TdHJpbmdMaXN0QXJndW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBDbGFzcyBTdHJpbmdMaXN0QXJndW1lbnQgaXMgYSBwYXJzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJGQzMwMjggQk5GLi4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPnN0cmluZy1saXN0ID0gIlsiIHN0cmluZyAqKCIsIiBzdHJpbmcpICJdIiAvIHN0cmluZzwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0xpc3RBcmd1bWVudCBpbXBsZW1lbnRzIEFyZ3VtZW50IHsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBmaWVsZExpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nTGlzdEFyZ3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nTGlzdEFyZ3VtZW50KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTdHJpbmdMaXN0QXJndW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ0xpc3RBcmd1bWVudChMaXN0PFN0cmluZz4gc3RyaW5nTGlzdCkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldExpc3Qoc3RyaW5nTGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCwgbGF6eSBpbml0aWFsaXNlZCBpZiByZXF1aXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldExpc3QoKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgPT0gKGxpc3QgPSBnZXRMaXN0QmFzaWMoKSkpIHsKLSAgICAgICAgICAgIHVwZGF0ZUxpc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRMaXN0QmFzaWMoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZExpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gY29tcHV0ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICogICAgICAgICAgICBUaGUgbGlzdCB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0gICAgICAgIGZpZWxkTGlzdCA9IGxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMaXN0KCkgewotICAgICAgICBzZXRMaXN0KGNvbXB1dGVMaXN0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnQjZ2V0VmFsdWUoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKGdldFZhbHVlKCkgPT0gbnVsbCkgPyAibnVsbCIgOiBnZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvVGFnQXJndW1lbnQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UYWdBcmd1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE4MWMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UYWdBcmd1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuQ29uc3RhbnRzLlRBR19DT01QQVJBVE9SOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ub2tlbjsKLQotLyoqCi0gKiA8cD4KLSAqIEEgcGFyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGFuIFJGQzMwMjggVEFHIGFyZ3VtZW50Li4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPnRhZyA9ICI6IiBpZGVudGlmaWVyPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgVGFnQXJndW1lbnQgaW1wbGVtZW50cyBBcmd1bWVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVGFnCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRUYWc7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnQXJndW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWdBcmd1bWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnQXJndW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRva2VuCi0gICAgICovCi0gICAgcHVibGljIFRhZ0FyZ3VtZW50KFRva2VuIHRva2VuKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgc2V0VGFnKHRva2VuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0VGFnLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b2tlbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFRhZyhUb2tlbiB0b2tlbikgewotICAgICAgICBzZXRUYWcodG9rZW4uaW1hZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRhZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgewotICAgICAgICByZXR1cm4gZmllbGRUYWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG9lcyB0aGlzIGFyZ3VtZW50IG1hdGNoIHRoZSBnaXZlbiB0YWc/Ci0gICAgICogQHBhcmFtIHRhZyBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB0YWcgaWRlbnRpZmllciBlcXVhbHMgdGhhdCBnaXZlbiwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpcyhTdHJpbmcgdGFnKSB7Ci0gICAgICAgcmV0dXJuIHRhZy5lcXVhbHMoZmllbGRUYWcpOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyBhIGNvbXBhcmF0b3IgdGFnPwotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGlkZW50aWZpZXIgbWF0Y2hlcyB7QGxpbmsgQ29uc3RhbnRzI1RBR19DT01QQVJBVE9SfSwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlzKFRBR19DT01QQVJBVE9SKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGFnLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YWcKLSAgICAgKiAgICAgICAgICAgIFRoZSB0YWcgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGFnKFN0cmluZyB0YWcpIHsKLSAgICAgICAgZmllbGRUYWcgPSB0YWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudCNnZXRWYWx1ZSgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRhZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIChnZXRWYWx1ZSgpID09IG51bGwpID8gIm51bGwiIDogZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGMzNGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Mb29rdXBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuRXhlY3V0YWJsZVRlc3Q7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHBhcnNlZCByZXByZXNlbnRhdGlvbiBvZiBhbiBSRkMzMDI4IHRlc3QgYXJndW1lbnQuLi4KLSAqIDwvcD4KLSAqIAotICogPGNvZGU+dGVzdCA9IGlkZW50aWZpZXIgYXJndW1lbnRzPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgVGVzdCBpbXBsZW1lbnRzIEV4ZWN1dGFibGUgewotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgVGVzdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZTsKLQotICAgIC8qKiBUaGUgYXJndW1lbnRzIGZvciB0aGlzIFRlc3QgKi8KLSAgICBwcml2YXRlIEFyZ3VtZW50cyBmaWVsZEFyZ3VtZW50czsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZSNleGVjdXRlKE1haWxBZGFwdGVyLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKE1haWxBZGFwdGVyIG1haWwsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGlzVGVzdFBhc3NlZChtYWlsLCBjb250ZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyB0ZXN0IHBhc3NlZCBmb3IgdGhlIGdpdmVuIG1haWw/Ci0gICAgICogQHBhcmFtIG1haWwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB0ZXN0IHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBMb29rdXBFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZXN0UGFzc2VkKE1haWxBZGFwdGVyIG1haWwsIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgTG9va3VwRXhjZXB0aW9uLCBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZyBsb2cgPSBjb250ZXh0LmdldExvZygpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgZmluYWwgRXhlY3V0YWJsZVRlc3QgdGVzdCA9IGNvbnRleHQuZ2V0VGVzdE1hbmFnZXIoKS5nZXRUZXN0KG5hbWUpOwotICAgICAgICByZXR1cm4gdGVzdC5leGVjdXRlKG1haWwsIGdldEFyZ3VtZW50cygpLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIFRlc3QoU3RyaW5nIG5hbWUsIEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICBzZXRBcmd1bWVudHMoYXJndW1lbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBBcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJndW1lbnRzIGdldEFyZ3VtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQXJndW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJndW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMpIHsKLSAgICAgICAgZmllbGRBcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmaWVsZE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJUZXN0IG5hbWU6ICIgKyBnZXROYW1lKCkgKyAiICIKLSAgICAgICAgICAgICAgICArIChnZXRBcmd1bWVudHMoKSA9PSBudWxsID8gIm51bGwiIDogZ2V0QXJndW1lbnRzKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvVGVzdExpc3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UZXN0TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDU4ODE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UZXN0TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBBIHBhcnNlZCByZXByZXNlbnRhdGlvbiBvZiBhbiBSRkMzMDI4IHRlc3RsaXN0IGFyZ3VtZW50Li4uCi0gKiA8L3A+Ci0gKiAKLSAqIDxjb2RlPnRlc3QtbGlzdCA9ICIoIiB0ZXN0ICooIiwiIHRlc3QpICIpIjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RMaXN0IGltcGxlbWVudHMgRXhlY3V0YWJsZSB7Ci0gICAgLyoqCi0gICAgICogTGlzdCBvZiBUZXN0cwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxUZXN0PiBmaWVsZFRlc3RzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRlc3RMaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgVGVzdExpc3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRlc3RMaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGlsZHJlbiAtCi0gICAgICogICAgICAgICAgICBBIExpc3Qgb2YgVGVzdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdExpc3QoTGlzdDxUZXN0PiBjaGlsZHJlbikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldFRlc3RzKGNoaWxkcmVuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdExpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoaWxkIC0KLSAgICAgKiAgICAgICAgICAgIEEgVGVzdAotICAgICAqLwotICAgIHB1YmxpYyBUZXN0TGlzdChUZXN0IGNoaWxkKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgTGlzdDxUZXN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VGVzdD4oKTsKLSAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgc2V0VGVzdHMoY2hpbGRyZW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZSNleGVjdXRlKE1haWxBZGFwdGVyLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKE1haWxBZGFwdGVyIG1haWwsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGFsbFRlc3RzUGFzcyhtYWlsLCBjb250ZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gYWxsIHRlc3RzIHBhc3MgZm9yIHRoZSBnaXZlbiBtYWlsPwotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGZhbHNlIHdoZW4gYW55IHRlc3QgaW4gdGhlIGxpc3QgZmFpbHMgd2hlbiBydW4gYWdhaW5zdCB0aGUgZ2l2ZW4gbWFpbCwKLSAgICAgKiB0cnVlIHdoZW4gbm8gdGVzdHMgZmFpbAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhbGxUZXN0c1Bhc3MoTWFpbEFkYXB0ZXIgbWFpbCwgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChUZXN0IHRlc3Q6Z2V0VGVzdHMoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gdGVzdC5pc1Rlc3RQYXNzZWQobWFpbCwgY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gYW55IHRlc3RzIHBhc3MgZm9yIHRoZSBnaXZlbiBtYWlsPwotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBhbnkgdGVzdCBpbiB0aGlzIGxpc3QgcGFzc2VzLAotICAgICAqIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhbnlUZXN0c1Bhc3MoTWFpbEFkYXB0ZXIgbWFpbCwgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoVGVzdCB0ZXN0OmdldFRlc3RzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRlc3QuaXNUZXN0UGFzc2VkKG1haWwsIGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFRlc3Q+IGdldFRlc3RzKCkgewotICAgICAgICByZXR1cm4gZmllbGRUZXN0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGlsZHJlbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hpbGRyZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBjaGlsZHJlbiB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXN0cyhMaXN0PFRlc3Q+IGNoaWxkcmVuKSB7Ci0gICAgICAgIGZpZWxkVGVzdHMgPSBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlRFU1QgTElTVDogIiArIGZpZWxkVGVzdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXMgdGhpcyB0ZXN0IGxpc3QgZW1wdHk/Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gZW1wdHksCi0gICAgICogZmFsc2Ugd2hlbiB0ZXN0cyBleGlzdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZFRlc3RzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UZXN0TWFuYWdlci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1Rlc3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjdiZDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1Rlc3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLkxvb2t1cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5FeGVjdXRhYmxlVGVzdDsKLQotLyoqCi0gKiA8cD5NYXBzIFRlc3QgbmFtZXMgdG8gY29uZmlndXJlZCBUZXN0IGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC9wPgotICogPGg0PlRocmVhZCBTYWZldHk8L2g0PgotICogPHA+Ci0gKiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIHtAbGluayBUZXN0TWFuYWdlckltcGx9IGlzIGEgdGhyZWFkIHNhZmUgaW1wbGVtZW50YXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdE1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHRlc3QgaW5zdGFuY2UgYnkgbmFtZS48L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgLQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFRlc3QKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0LCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTG9va3VwRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGFibGVUZXN0IGdldFRlc3QoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvVGVzdE1hbmFnZXJJbXBsLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvVGVzdE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTIxMWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1Rlc3RNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLkxvb2t1cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5FeGVjdXRhYmxlVGVzdDsKLQotLyoqCi0gKiA8cD5NYXBzIFRlc3QgbmFtZXMgdG8gY29uZmlndXJlZCBUZXN0IGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC9wPgotICogPGg0PlRocmVhZCBTYWZldHk8L2g0PgotICogPHA+Ci0gKiBJbnN0YW5jZXMgbWF5IHNhZmVseSBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkgYnkgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIFRlc3RNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFN0cmluZz4gY2xhc3NOYW1lTWFwOwotCi0gICAgLyoqCi0gICAgICogVGVzdE1hbmFnZXIgaXMgaW5zdGFuY2lhdGVkIHdpdGggZ2V0SW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdE1hbmFnZXJJbXBsKGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBTdHJpbmc+IGNsYXNzTmFtZU1hcCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNsYXNzTmFtZU1hcCA9IGNsYXNzTmFtZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgbG9va3VwIGFuc3dlcnMgdGhlIGNsYXNzIHRvIHdoaWNoIGEgVGVzdCBuYW1lIGlzIG1hcHBlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgLQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFRlc3QKLSAgICAgKiBAcmV0dXJuIENsYXNzIC0gVGhlIGNsYXNzIG9mIHRoZSBUZXN0Ci0gICAgICogQHRocm93cyBMb29rdXBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgbG9va3VwKFN0cmluZyBuYW1lKSB0aHJvd3MgTG9va3VwRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdENsYXNzID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NOYW1lKG5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTG9va3VwRXhjZXB0aW9uKCJUZXN0IG5hbWVkICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUV4ZWN1dGFibGVUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdENsYXNzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBMb29rdXBFeGNlcHRpb24oIkNsYXNzICIgKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBtdXN0IGltcGxlbWVudCAiICsgRXhlY3V0YWJsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHRlc3RDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgbmV3SW5zdGFuY2UgYW5zd2VycyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgdG8gd2hpY2ggYSBUZXN0IG5hbWUKLSAgICAgKiBpcyBtYXBwZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIC0KLSAgICAgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBUZXN0Ci0gICAgICogQHJldHVybiBDbGFzcyAtIFRoZSBjbGFzcyBvZiB0aGUgVGVzdAotICAgICAqIEB0aHJvd3MgTG9va3VwRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dGFibGVUZXN0IGdldFRlc3QoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChFeGVjdXRhYmxlVGVzdCkgbG9va3VwKG5hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExvb2t1cEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExvb2t1cEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgZ2V0Q2xhc3NOYW1lIGFuc3dlcnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHdoaWNoIGEgVGVzdCBuYW1lIGlzCi0gICAgICogbWFwcGVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSAtCi0gICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgVGVzdAotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHRocm93cyBMb29rdXBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lTWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICBpZiAobnVsbCA9PSBjbGFzc05hbWUpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTG9va3VwRXhjZXB0aW9uKCJUZXN0IG5hbWVkICciICsgbmFtZSArICInIG5vdCBtYXBwZWQuIik7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0QWN0aW9uQ29tbWFuZC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0QWN0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGJkZTIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdEFjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlN0cmluZ0xpc3RBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY3Rpb25Db21tYW5kIGRlZmluZXMgdGhlIGNvbW1vbiBzdGF0ZSB2YWxpZGF0aW9uIGFuZAotICogc3RhdGUgdXBkYXRlIGJlaGF2aW9yIGZvciBBY3Rpb24gQ29tbWFuZHMgYXMgcGVyIFJGQyAzMDI4LCBzZWN0aW9uIDguCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFjdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEJvZHlDb21tYW5kIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdEFjdGlvbkNvbW1hbmQuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0QWN0aW9uQ29tbWFuZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgdXBkYXRlU3RhdGUoKSB1cGRhdGVzIHRoZSBDb21tYW5kU3RhdGVNYW5hZ2VyIHRvIGluZGljYXRlIGFuCi0gICAgICogQWN0aW9uIENvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCB0byBjYW5jZWwgaW1wbGljaXQga2VlcC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQW5kIGFsc28KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjdXBkYXRlU3RhdGUoU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZVN0YXRlKGNvbnRleHQpOwotICAgICAgICBjb250ZXh0LmdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKS5zZXRIYXNBY3Rpb25zKHRydWUpOwotICAgICAgICBjb250ZXh0LmdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKS5zZXRJbXBsaWNpdEtlZXAoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCB2YWxpZGF0ZVN0YXRlKCkgdmFsaWRhdGVzIHZpYSB0aGUgQ29tbWFuZFN0YXRlTWFuYWdlciB0aGF0IGFuCi0gICAgICogQWN0aW9uIENvbW1hbmQgaXMgbGVnYWwgYXQgdGhpcyB0aW1lLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCN2YWxpZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKS5pc1JlamVjdGVkKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5jb21tYW5kRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBlcmZvcm0gQWN0aW9ucyBvbiBhIHJlamVjdGVkIG1lc3NhZ2UuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhbiB1dGlsaXR5IG1ldGhvZCBmb3Igc3ViY2xhc3NlcwotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuUmVkaXJlY3QKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLkZpbGVJbnRvCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbC5SZWplY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNpbmdsZVN0cmluZ0FyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QXJndW1lbnQ+IGFyZ3MgPSBhcmd1bWVudHMuZ2V0QXJndW1lbnRMaXN0KCk7Ci0gICAgICAgIGlmIChhcmdzLnNpemUoKSAhPSAxKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhhY3RseSAxIGFyZ3VtZW50IHBlcm1pdHRlZC4gRm91bmQgIiArIGFyZ3Muc2l6ZSgpKTsKLQotICAgICAgICBBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3MuZ2V0KDApOwotICAgICAgICBpZiAoIShhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZ0xpc3RBcmd1bWVudCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFeHBlY3RpbmcgYSBzdHJpbmctbGlzdCIpOwotCi0gICAgICAgIGlmICgxICE9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudCkuZ2V0TGlzdCgpLnNpemUoKSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0Qm9keUNvbW1hbmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdEJvZHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTI0NmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0Qm9keUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCb2R5Q29tbWFuZCBkZWZpbmVzIHRoZSBjb21tb24gc3RhdGUgdXBkYXRlIGJlaGF2aW9yCi0gKiBmb3IgQm9keSBDb21tYW5kcy4gQWxsIENvbW1hbmRzIHdoaWNoIGFyZSBub3QgUHJvbG9nQ29tbWFuZHMgYXJlIEJvZHkKLSAqIENvbW1hbmRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCb2R5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RCb2R5Q29tbWFuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RCb2R5Q29tbWFuZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgdXBkYXRlU3RhdGUoKSB1cGRhdGVzIHRoZSBDb21tYW5kU3RhdGVNYW5hZ2VyIHRvIGluZGljYXRlIGEgQm9keQotICAgICAqIENvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3VwZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0ZShmaW5hbCBTaWV2ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBjb250ZXh0LmdldENvbW1hbmRTdGF0ZU1hbmFnZXIoKS5zZXRJblByb2xvZyhmYWxzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvQWJzdHJhY3RDb21tYW5kLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvQWJzdHJhY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2JmMDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tbWFuZCBkZWZpbmVzIGEgZnJhbWV3b3JrIG9mIGNvbW1vbiBiZWhhdmlvciBmb3IKLSAqIFNpZXZlIENvbW1hbmRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgRXhlY3V0YWJsZUNvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0Q29tbWFuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21tYW5kKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyYW1ld29yayBtZXRob2QgdmFsaWRhdGVTdGF0ZSBpcyBpbnZva2VkIGJlZm9yZSBhIFNpZXZlIENvbW1hbmQgaXMKLSAgICAgKiBleGVjdXRlZCB0byB2YWxpZGF0ZSBpdHMgc3RhdGUuIFN1YmNsYXNzIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlCi0gICAgICogb3IgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhlaXIgb3duIHZhbGlkYXRpb24gYXMgYXBwcm9wcmlhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNpZXZlQ29udGV4dDwvY29kZT4gZ2l2aW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24sIG5vdAotICAgICAqICAgICAgICAgICAgbnVsbAotICAgICAqIEB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3RhdGUoU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmFtZXdvcmsgbWV0aG9kIHVwZGF0ZVN0YXRlIGlzIGludm9rZWQgYWZ0ZXIgYSBTaWV2ZSBDb21tYW5kIGhhcwotICAgICAqIGV4ZWN1dGVkIHRvIHVwZGF0ZSB0aGUgU2lldmUgc3RhdGUuIFN1YmNsYXNzIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvCi0gICAgICogb3ZlcnJpZGUgb3IgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHVwZGF0ZSBzdGF0ZSBhcyBhcHByb3ByaWF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJhbWV3b3JrIG1ldGhvZCB2YWxpZGF0ZUFyZ3VtZW50cyBpcyBpbnZva2VkIGJlZm9yZSBhIFNpZXZlIENvbW1hbmQgaXMKLSAgICAgKiBleGVjdXRlZCB0byB2YWxpZGF0ZSBpdHMgYXJndW1lbnRzLiBTdWJjbGFzcyBtZXRob2RzIGFyZSBleHBlY3RlZCB0bwotICAgICAqIG92ZXJyaWRlIG9yIGV4dGVuZCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIHRoZWlyIG93biB2YWxpZGF0aW9uIGFzCi0gICAgICogYXBwcm9wcmlhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICA8Y29kZT5TaWV2ZUNvbnRleHQ8L2NvZGU+IGdpdmluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLCBub3QKLSAgICAgKiAgICAgICAgICAgIG51bGwKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAoIWFyZ3VtZW50cy5nZXRBcmd1bWVudExpc3QoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGb3VuZCB1bmV4cGVjdGVkIGFyZ3VtZW50cyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyYW1ld29yayBtZXRob2QgdmFsaWRhdGVCbG9jayBpcyBpbnZva2VkIGJlZm9yZSBhIFNpZXZlIENvbW1hbmQgaXMKLSAgICAgKiBleGVjdXRlZCB0byB2YWxpZGF0ZSBpdHMgQmxvY2suIFN1YmNsYXNzIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIG92ZXJyaWRlCi0gICAgICogb3IgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhlaXIgb3duIHZhbGlkYXRpb24gYXMgYXBwcm9wcmlhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNjcmlwdENvb3JkaW5hdGU8L2NvZGU+IGdpdmluZyBwb3NpdGlvbmFsIGluZm9ybWF0aW9uLAotICAgICAqICAgICAgICAgICAgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCbG9jayhCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAobnVsbCAhPSBibG9jaykKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgQmxvY2suIE1pc3NpbmcgJzsnPyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBleGVjdXRlIGV4ZWN1dGVzIGEgYmFzaWMgU2lldmUgQ29tbWFuZCBhZnRlciBmaXJzdCBpbnZva2luZwotICAgICAqIGZyYW1ld29yayBtZXRob2RzIHRvIHZhbGlkYXRlIHRoYXQgU2lldmUgaXMgaW4gYSBsZWdhbCBzdGF0ZSB0byBpbnZva2UKLSAgICAgKiB0aGUgQ29tbWFuZCBhbmQgdGhhdCB0aGUgQ29tbWFuZCBhcmd1bWVudHMgYXJlIGxlZ2FsLiBBZnRlciBpbnZvY2F0aW9uLCBhCi0gICAgICogZnJhbWV3b3JrIG1ldGhvZCBpcyBpbnZva2VkIHRvIHVwZGF0ZSB0aGUgc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZSNleGVjdXRlKE1haWxBZGFwdGVyLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBleGVjdXRlKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsIEJsb2NrIGJsb2NrLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlU3RhdGUoY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlQmxvY2soYmxvY2ssIGNvbnRleHQpOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZXhlY3V0ZUJhc2ljKG1haWwsIGFyZ3VtZW50cywgYmxvY2ssIGNvbnRleHQpOwotICAgICAgICB1cGRhdGVTdGF0ZShjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYnN0cmFjdCBtZXRob2QgZXhlY3V0ZUJhc2ljIGludm9rZXMgYSBTaWV2ZSBDb21tYW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICA8Y29kZT5TaWV2ZUNvbnRleHQ8L2NvZGU+IGdpdmluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLCBub3QKLSAgICAgKiAgICAgICAgICAgIG51bGwKLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgT2JqZWN0IGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLAotICAgICAgICAgICAgQXJndW1lbnRzIGFyZ3VtZW50cywgQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvQWJzdHJhY3RDb25kaXRpb25hbENvbW1hbmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdENvbmRpdGlvbmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTcyN2EyLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdENvbmRpdGlvbmFsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkNvbmRpdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29uZGl0aW9uYWxDb21tYW5kIGRlZmluZXMgYSBmcmFtZXdvcmsgb2YgY29tbW9uCi0gKiBiZWhhdmlvciBmb3IgY29uZGl0aW9uYWwgQ29tbWFuZHMgKGlmLCBlbHNpZiwgZWxzZSkuIENvbmRpdGlvbmFsIGNvbW1hbmRzIHVzZQotICogYSBDb25kaXRpb25NYW5hZ2VyIHRvIHJlbGF0ZSBhbmQgdmFsaWRhdGUgQ29tbWFuZHMgd2l0aGluIHRoZWlyIEJsb2Nrcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29uZGl0aW9uYWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sQ29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RDb25kaXRpb25hbENvbW1hbmQuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0Q29uZGl0aW9uYWxDb21tYW5kKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBleGVjdXRlIGV4ZWN1dGVzIGEgQmxvY2sgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgbmV3Ci0gICAgICogQ29uZGl0aW9uTWFuYWdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFpbCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBibG9jayBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICogQHJldHVybiBPYmplY3QgCi0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZShNYWlsQWRhcHRlciBtYWlsLCBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBTd2l0Y2ggdG8gYSBuZXcgQ29uZGl0aW9uTWFuYWdlcgotICAgICAgICBDb25kaXRpb25NYW5hZ2VyIG9sZE1hbmFnZXIgPSBjb250ZXh0LmdldENvbmRpdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgY29udGV4dC5zZXRDb25kaXRpb25NYW5hZ2VyKG5ldyBDb25kaXRpb25NYW5hZ2VyKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBCbG9jawotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGJsb2NrLmV4ZWN1dGUobWFpbCwgY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gQWx3YXlzIHJlc3RvcmUgdGhlIG9sZCBDb25kaXRpb25NYW5hZ2VyCi0gICAgICAgICAgICBjb250ZXh0LnNldENvbmRpdGlvbk1hbmFnZXIob2xkTWFuYWdlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCN2YWxpZGF0ZUJsb2NrKEJsb2NrLAotICAgICAqICAgICAgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQmxvY2soQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG51bGwgPT0gYmxvY2spCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oIkV4cGVjdGluZyBhIEJsb2NrLiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0Q29udHJvbENvbW1hbmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdENvbnRyb2xDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTY4YjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Fic3RyYWN0Q29udHJvbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250cm9sQ29tbWFuZCBkZWZpbmVzIGEgZnJhbWV3b3JrIG9mIGNvbW1vbiBiZWhhdmlvcgotICogZm9yIGNvbnRyb2wgQ29tbWFuZHMgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiAzLgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRyb2xDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RCb2R5Q29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RDb250cm9sQ29tbWFuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RDb250cm9sQ29tbWFuZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdFByb2xvZ0NvbW1hbmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9BYnN0cmFjdFByb2xvZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzN2MzYS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvQWJzdHJhY3RQcm9sb2dDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Db21tYW5kRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPgotICogQWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9sb2dDb21tYW5kIGRlZmluZXMgdGhlIGNvbW1vbiBzdGF0ZSB2YWxpZGF0aW9uCi0gKiBiZWhhdmlvciBmb3IgUHJvbG9nIENvbW1hbmRzLiBJbiBSRkMgMzAyOCB0aGUgb25seSBQcm9sb2cgQ29tbWFuZCBpcwotICogJ3JlcXVpcmVzJywgaG93ZXZlciwgdGhlIHNwZWNpZmljYXRpb24gbWF5IGV2b2x2ZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvbG9nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RQcm9sb2dDb21tYW5kLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFByb2xvZ0NvbW1hbmQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIHZhbGlkYXRlU3RhdGUoKSBlbnN1cmVzLCB2aWEgdGhlIENvbW1hbmRTdGF0ZU1hbmFnZXIsIHRoYXQgYQotICAgICAqIFByb2xvZyBDb21tYW5kIGlzIHBlcm1pc3NpYmxlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCN2YWxpZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVN0YXRlKFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnZhbGlkYXRlU3RhdGUoY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKCEoY29udGV4dC5nZXRDb21tYW5kU3RhdGVNYW5hZ2VyKCkuaXNJblByb2xvZygpKSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLmNvbW1hbmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0YXRlIGZvciBhIHByb2xvZyBjb21tYW5kLiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Rpc2NhcmQuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9EaXNjYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWNmOWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Rpc2NhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIERpc2NhcmQgaW1wbGVtZW50cyB0aGUgRGlzY2FyZCBDb21tYW5kIGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24KLSAqIDQuNS4KLSAqLwotcHVibGljIGNsYXNzIERpc2NhcmQgZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbkNvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIERpc2NhcmQuCi0gICAgICovCi0gICAgcHVibGljIERpc2NhcmQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRGlzY2FyZCBzaWxlbnRseSBkaXNjYXJkcyBhIE1haWwgYnkgY2FuY2VsbGluZyB0aGUgaW1wbGljaXQga2VlcCBhcwotICAgICAqIHNwZWNpZmllZCBpbiBSRkMgMzAyOCwgU2VjdGlvbiA0LjUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgQmxvY2ssIFNpZXZlQ29udGV4dCkKLSAgICAgKiAgICAgIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBKdXN0IGNhbmNlbHMgdGhlIGltcGxpY2l0IGtlZXAKLSAgICAgICAgLy8gU2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzUyMjgjc2VjdGlvbi00LjQKLSAgICAgICAgY29udGV4dC5nZXRDb21tYW5kU3RhdGVNYW5hZ2VyKCkuc2V0SW1wbGljaXRLZWVwKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvRWxzZS5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0Vsc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzYWI4MC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvRWxzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgRWxzZSBpbXBsZW1lbnRzIHRoZSBFbHNlIENvbW1hbmQgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiAzLjEuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbHNlIGV4dGVuZHMgQWJzdHJhY3RDb25kaXRpb25hbENvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEVsc2UuCi0gICAgICovCi0gICAgcHVibGljIEVsc2UoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ29uZGl0aW9uYWxseSBlZXhlY3V0ZSBhIEJsb2NrIGlmIGFuIEVsc2UgQ29uZGl0aW9uIGlzIHJ1bm5hYmxlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgQmxvY2ssIFNpZXZlQ29udGV4dCkKLSAgICAgKiAgICAgIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBDaGVjayBTeW50YXgKLSAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmRpdGlvbk1hbmFnZXIoKS5pc0Vsc2VBbGxvd2VkKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5jb21tYW5kRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBDb21tYW5kOiBcImVsc2VcIi4iKTsKLQotICAgICAgICAvLyBDaGVjayBSdW5uYWJsZQotICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZGl0aW9uTWFuYWdlcigpLmlzRWxzZVJ1bm5hYmxlKCkpCi0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQotICAgICAgICAvLyBFeGVjdXRlIHRoZSBCbG9jawotICAgICAgICBleGVjdXRlKG1haWwsIGJsb2NrLCBjb250ZXh0KTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIENvbmRpdGlvbk1hbmFnZXIKLSAgICAgICAgLy8gJ0Vsc2UnIGlzIGFsd2F5cyB0cnVlCi0gICAgICAgIGNvbnRleHQuZ2V0Q29uZGl0aW9uTWFuYWdlcigpLnNldEVsc2VUZXN0UmVzdWx0KHRydWUpOwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvRWxzaWYuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9FbHNpZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBlYmIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9FbHNpZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGVzdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgRWxzaWYgaW1wbGVtZW50cyB0aGUgRWxzaWYgQ29tbWFuZCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LCBzZWN0aW9uIDMuMS4KLSAqLwotcHVibGljIGNsYXNzIEVsc2lmIGV4dGVuZHMgQWJzdHJhY3RDb25kaXRpb25hbENvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEVsc2lmLgotICAgICAqLwotICAgIHB1YmxpYyBFbHNpZigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25kaXRpb25hbGx5IGVleGVjdXRlIGEgQmxvY2sgaWYgYW4gRWxzaWYgQ29uZGl0aW9uIGlzIGFsbG93ZWQgYW5kCi0gICAgICogcnVubmFibGUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBCbG9jaywgU2lldmVDb250ZXh0KQotICAgICAqICAgICAgPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIFN5bnRheAotICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZGl0aW9uTWFuYWdlcigpLmlzRWxzaWZBbGxvd2VkKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5jb21tYW5kRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBDb21tYW5kOiBcImVsc2lmXCIuIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgUnVubmFibGUKLSAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmRpdGlvbk1hbmFnZXIoKS5pc0Vsc2lmUnVubmFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotCi0gICAgICAgIC8vIFJ1biB0aGUgdGVzdHMKLSAgICAgICAgQm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSAoQm9vbGVhbikgYXJndW1lbnRzLmdldFRlc3RMaXN0KCkuZXhlY3V0ZShtYWlsLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotCi0gICAgICAgIC8vIElmIHRoZSB0ZXN0cyBhbnN3ZXJlZCBUUlVFLCBleGVjdXRlIHRoZSBCbG9jawotICAgICAgICBpZiAoaXNUZXN0UGFzc2VkLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgZXhlY3V0ZShtYWlsLCBibG9jaywgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBDb25kaXRpb25NYW5hZ2VyCi0gICAgICAgIGNvbnRleHQuZ2V0Q29uZGl0aW9uTWFuYWdlcigpLnNldEVsc2lmVGVzdFJlc3VsdCgKLSAgICAgICAgICAgICAgICBpc1Rlc3RQYXNzZWQuYm9vbGVhblZhbHVlKCkpOwotCi0gICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0Ci0gICAgICAgIHJldHVybiBpc1Rlc3RQYXNzZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzLAotICAgICAqICAgICAgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdExpc3QgdGVzdExpc3QgPSBhcmd1bWVudHMuZ2V0VGVzdExpc3QoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdGVzdExpc3QgfHwgdGVzdExpc3QuZ2V0VGVzdHMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oIkV4cGVjdGluZyBhIFRlc3QiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9JZi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0lmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTY4ZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL0lmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyBJZiBpbXBsZW1lbnRzIHRoZSBJZiBDb21tYW5kIGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24gMy4xLgotICovCi1wdWJsaWMgY2xhc3MgSWYgZXh0ZW5kcyBBYnN0cmFjdENvbmRpdGlvbmFsQ29tbWFuZCB7Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIElmLgotICAgICAqLwotICAgIHB1YmxpYyBJZigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBDb25kaXRpb25hbGx5IGVleGVjdXRlIGEgQmxvY2sgaWYgYW4gSWYgQ29uZGl0aW9uIGlzIGFsbG93ZWQgYW5kCi0gICAgICogcnVubmFibGUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBCbG9jaywgU2lldmVDb250ZXh0KQotICAgICAqICAgICAgPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIFN5bnRheAotICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZGl0aW9uTWFuYWdlcigpLmlzSWZBbGxvd2VkKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5jb21tYW5kRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBDb21tYW5kOiBcImlmXCIuIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgUnVubmFibGUKLSAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmRpdGlvbk1hbmFnZXIoKS5pc0lmUnVubmFibGUoKSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotCi0gICAgICAgIC8vIFJ1biB0aGUgdGVzdHMKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBhcmd1bWVudHMuZ2V0VGVzdExpc3QoKS5hbGxUZXN0c1Bhc3MobWFpbCxjb250ZXh0KTsKLQotICAgICAgICAvLyBJZiB0aGUgdGVzdHMgYW5zd2VyZWQgVFJVRSwgZXhlY3V0ZSB0aGUgQmxvY2sKLSAgICAgICAgaWYgKGlzVGVzdFBhc3NlZCkKLSAgICAgICAgICAgIGV4ZWN1dGUobWFpbCwgYmxvY2ssIGNvbnRleHQpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgQ29uZGl0aW9uTWFuYWdlcgotICAgICAgICBjb250ZXh0LmdldENvbmRpdGlvbk1hbmFnZXIoKS5zZXRJZlRlc3RSZXN1bHQoaXNUZXN0UGFzc2VkKTsKLQotICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdAotICAgICAgICByZXR1cm4gaXNUZXN0UGFzc2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3ZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cywKLSAgICAgKiAgICAgIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghYXJndW1lbnRzLmhhc1Rlc3RzKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oIkV4cGVjdGluZyBhIFRlc3QiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9LZWVwLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvS2VlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTVlNTQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9LZWVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25LZWVwOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgS2VlcCBpbXBsZW1lbnRzIHRoZSBLZWVwIENvbW1hbmQgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiA0LjQuCi0gKi8KLXB1YmxpYyBjbGFzcyBLZWVwIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb25Db21tYW5kIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBLZWVwLgotICAgICAqLwotICAgIHB1YmxpYyBLZWVwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFkZCBhbiBBY3Rpb25LZWVwIHRvIHRoZSBMaXN0IG9mIEFjdGlvbnMgdG8gYmUgcGVyZm9ybWVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgQmxvY2ssIFNpZXZlQ29udGV4dCkKLSAgICAgKiAgICAgIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBtYWlsLmFkZEFjdGlvbihuZXcgQWN0aW9uS2VlcCgpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvUmVkaXJlY3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9SZWRpcmVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjhiOTk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9SZWRpcmVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU3RyaW5nTGlzdEFyZ3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlZGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgUmVkaXJlY3QgaW1wbGVtZW50cyB0aGUgUmVkaXJlY3QgQ29tbWFuZCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LAotICogc2VjdGlvbiA0LjMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWRpcmVjdCBleHRlbmRzIEFic3RyYWN0QWN0aW9uQ29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVkaXJlY3QuCi0gICAgICovCi0gICAgcHVibGljIFJlZGlyZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFkZCBhbiBBY3Rpb25SZWRpcmVjdCB0byB0aGUgTGlzdCBvZiBBY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCBwYXNzaW5nIHRoZQotICAgICAqIHNvbGUgU3RyaW5nTGlzdCBhcmd1bWVudCBhcyB0aGUgcmVjaXBpZW50LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHNvLAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgQmxvY2ssIFNpZXZlQ29udGV4dCkKLSAgICAgKiAgICAgIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgQmxvY2sgYmxvY2ssIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVjaXBpZW50ID0gKChTdHJpbmdMaXN0QXJndW1lbnQpIGFyZ3VtZW50cwotICAgICAgICAgICAgICAgIC5nZXRBcmd1bWVudExpc3QoKS5nZXQoMCkpLmdldExpc3QoKS5nZXQoMCk7Ci0KLSAgICAgICAgbWFpbC5hZGRBY3Rpb24obmV3IEFjdGlvblJlZGlyZWN0KHJlY2lwaWVudCkpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3ZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cywKLSAgICAgKiAgICAgIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlU2luZ2xlU3RyaW5nQXJndW1lbnRzKGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvUmVxdWlyZS5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL1JlcXVpcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMjRlOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvUmVxdWlyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuQ29uc3RhbnRzLkNPTVBBUkFUT1JfUFJFRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5Db25zdGFudHMuQ09NUEFSQVRPUl9QUkVGSVhfTEVOR1RIOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlN0cmluZ0xpc3RBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uRmVhdHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uTG9va3VwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIFJlcXVpcmUgaW1wbGVtZW50cyB0aGUgUmVxdWlyZSBDb21tYW5kIGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24KLSAqIDMuMi4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmUgZXh0ZW5kcyBBYnN0cmFjdFByb2xvZ0NvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFJlcXVpcmUuCi0gICAgICovCi0gICAgcHVibGljIFJlcXVpcmUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRW5zdXJlIHRoZSByZXF1aXJlZCBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBCbG9jaywgU2lldmVDb250ZXh0KQotICAgICAqICAgICAgPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBzdHJpbmdBcmd1bWVudExpc3QgPSAoKFN0cmluZ0xpc3RBcmd1bWVudCkgYXJndW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBcmd1bWVudExpc3QoKS5nZXQoMCkpLmdldExpc3QoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc3RyaW5nQXJndW1lbnQ6IHN0cmluZ0FyZ3VtZW50TGlzdCkgewotICAgICAgICAgICAgdmFsaWRhdGVGZWF0dXJlKHN0cmluZ0FyZ3VtZW50LCBtYWlsLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdmFsaWRhdGVGZWF0dXJlIHZhbGlkYXRlcyB0aGUgcmVxdWlyZWQgZmVhdHVyZSBpcyBjb25maWd1cmVkIGFzCi0gICAgICogZWl0aGVyIGEgQ29tbWFuZCBvciBhIFRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gbWFpbAotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWwKLSAgICAgKiBAdGhyb3dzIEZlYXR1cmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZlYXR1cmUoU3RyaW5nIG5hbWUsIE1haWxBZGFwdGVyIG1haWwsCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEZlYXR1cmVFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKENPTVBBUkFUT1JfUFJFRklYKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhcmF0b3JOYW1lID0gbmFtZS5zdWJzdHJpbmcoQ09NUEFSQVRPUl9QUkVGSVhfTEVOR1RIKTsKLSAgICAgICAgICAgIGlmICghY29udGV4dC5nZXRDb21wYXJhdG9yTWFuYWdlcigpLmlzU3VwcG9ydGVkKGNvbXBhcmF0b3JOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGZWF0dXJlRXhjZXB0aW9uKCJDb21wYXJhdG9yIFwiIiArIGNvbXBhcmF0b3JOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcIiBpcyBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVmFsaWRhdGUgYXMgYSBDb21tYW5kCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29tbWFuZChuYW1lLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGNhdGNoIChMb29rdXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vdCBhIGNvbW1hbmQKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIC8vIFZhbGlkYXRlIGFzIGEgVGVzdAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRlc3QobmFtZSwgY29udGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChMb29rdXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGZWF0dXJlRXhjZXB0aW9uKCJGZWF0dXJlIFwiIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdmFsaWRhdGVDb21tYW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHRocm93cyBMb29rdXBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbW1hbmQoU3RyaW5nIG5hbWUsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIExvb2t1cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRleHQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRDb21tYW5kKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB2YWxpZGF0ZVRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgTG9va3VwRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUZXN0KFN0cmluZyBuYW1lLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBMb29rdXBFeGNlcHRpb24gewotICAgICAgICBjb250ZXh0LmdldFRlc3RNYW5hZ2VyKCkuZ2V0VGVzdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCN2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMsCi0gICAgICogICAgICBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBMaXN0PEFyZ3VtZW50PiBhcmdzID0gYXJndW1lbnRzLmdldEFyZ3VtZW50TGlzdCgpOwotICAgICAgICBpZiAoYXJncy5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIkV4YWN0bHkgMSBhcmd1bWVudCBwZXJtaXR0ZWQuIEZvdW5kICIpLmFwcGVuZCgoaW50KWFyZ3Muc2l6ZSgpKSk7Ci0KLSAgICAgICAgQXJndW1lbnQgYXJndW1lbnQgPSBhcmdzLmdldCgwKTsKLSAgICAgICAgaWYgKCEoYXJndW1lbnQgaW5zdGFuY2VvZiBTdHJpbmdMaXN0QXJndW1lbnQpKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGEgc3RyaW5nLWxpc3QiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9TdG9wLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvU3RvcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2VmNjY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9TdG9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN0b3BFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyBTdG9wIGltcGxlbWVudHMgdGhlIFN0b3AgQ29tbWFuZCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LCBzZWN0aW9uIDMuMy4KLSAqLwotcHVibGljIGNsYXNzIFN0b3AgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2xDb21tYW5kIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBSZXF1aXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdG9wKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRocm93cyBhIFN0b3BFeGNlcHRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBCbG9jaywgU2lldmVDb250ZXh0KQotICAgICAqICAgICAgPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBTdG9wRXhjZXB0aW9uKCJTdG9wIHJlcXVlc3RlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL2V4dGVuc2lvbnMvTG9nLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvZXh0ZW5zaW9ucy9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MWE2NS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvZXh0ZW5zaW9ucy9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuZXh0ZW5zaW9ucy5Mb2dMZXZlbFRhZ3MuREVCVUdfVEFHOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5leHRlbnNpb25zLkxvZ0xldmVsVGFncy5FUlJPUl9UQUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnMuTG9nTGV2ZWxUYWdzLkZBVEFMX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuZXh0ZW5zaW9ucy5Mb2dMZXZlbFRhZ3MuSU5GT19UQUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnMuTG9nTGV2ZWxUYWdzLlRSQUNFX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuZXh0ZW5zaW9ucy5Mb2dMZXZlbFRhZ3MuV0FSTl9UQUc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TdHJpbmdMaXN0QXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGFnQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBDbGFzcyBMb2cgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgaW1wbGVtZW50cyBhIENvbW1hbmQgdG8gd3JpdGUgbWVzc2FnZXMgdG8gdGhlCi0gKiBTaWV2ZSBMb2cuIFRoZSBCTkYgc3ludGF4IGlzLi4uCi0gKiA8L3A+Ci0gKiA8Y29kZT5sb2cgWyg6ZmF0YWwgLyA6ZXJyb3IgLyA6d2FybiAvIDppbmZvIC8gOmRlYnVnIC8gOnRyYWNlKV0gc3RyaW5nPC9jb2RlPgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCBsb2cgbGV2ZWwgaXMgOmluZm8uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2cgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBMb2cuCi0gICAgICovCi0gICAgcHVibGljIExvZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIsCi0gICAgICogICAgICBBcmd1bWVudHMsIEJsb2NrLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrLCBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxvZ0xldmVsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCi0gICAgICAgIC8vIEZpcnN0IE1BWSBiZSBhIHRhZyBhcmd1bWVudCBvZiBmYXRhbCwgZXJyb3IsIHdhcm4sIGluZm8sIGRlYnVnIG9yCi0gICAgICAgIC8vIHRyYWNlLgotICAgICAgICAvLyBkZWZhdWx0IGlzIGluZm8uCi0gICAgICAgIGZpbmFsIExpc3RJdGVyYXRvcjxBcmd1bWVudD4gYXJndW1lbnRzSXRlciA9IGFyZ3VtZW50cy5nZXRBcmd1bWVudExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGFnIHByb2Nlc3NpbmcKLSAgICAgICAgd2hpbGUgKCFzdG9wICYmIGFyZ3VtZW50c0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBBcmd1bWVudCBhcmd1bWVudCA9IGFyZ3VtZW50c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgVGFnQXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFnID0gKChUYWdBcmd1bWVudCkgYXJndW1lbnQpLmdldFRhZygpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9nTGV2ZWw/Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbG9nTGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICh0YWcuZXF1YWxzKEZBVEFMX1RBRykgfHwgdGFnLmVxdWFscyhFUlJPUl9UQUcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhZy5lcXVhbHMoV0FSTl9UQUcpIHx8IHRhZy5lcXVhbHMoSU5GT19UQUcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhZy5lcXVhbHMoREVCVUdfVEFHKSB8fCB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhUUkFDRV9UQUcpKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWwgPSB0YWc7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgVGFnQXJndW1lbnQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcCB3aGVuIGEgbm9uLXRhZyBhcmd1bWVudCBpcyBlbmNvdW50ZXJlZAotICAgICAgICAgICAgICAgIGFyZ3VtZW50c0l0ZXIucHJldmlvdXMoKTsKLSAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5leHQgTVVTVCBiZSBhIFN0cmluZwotICAgICAgICBpZiAoYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBTdHJpbmdMaXN0QXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3RyaW5ncyA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudCkuZ2V0TGlzdCgpOwotICAgICAgICAgICAgICAgIGlmICgxID09IHN0cmluZ3Muc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gc3RyaW5ncy5nZXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgPT0gbWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigiRXhwZWN0aW5nIGEgU3RyaW5nIik7Ci0KLSAgICAgICAgLy8gRXZlcnRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKLSAgICAgICAgaWYgKGFyZ3VtZW50c0l0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRm91bmQgdW5leHBlY3RlZCBhcmd1bWVudHMiKTsKLQotICAgICAgICBsb2cobnVsbCA9PSBsb2dMZXZlbCA/ICI6aW5mbyIgOiBsb2dMZXZlbCwgbWVzc2FnZSwgY29udGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9nTGV2ZWwKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBsb2dMZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2dMZXZlbC5lcXVhbHMoSU5GT19UQUcpKQotICAgICAgICAgICAgbG9nSW5mbyhtZXNzYWdlLCBjb250ZXh0KTsKLSAgICAgICAgZWxzZSBpZiAobG9nTGV2ZWwuZXF1YWxzKEVSUk9SX1RBRykpCi0gICAgICAgICAgICBsb2dFcnJvcihtZXNzYWdlLCBjb250ZXh0KTsKLSAgICAgICAgZWxzZSBpZiAobG9nTGV2ZWwuZXF1YWxzKFdBUk5fVEFHKSkKLSAgICAgICAgICAgIGxvZ1dhcm4obWVzc2FnZSwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UgaWYgKGxvZ0xldmVsLmVxdWFscyhERUJVR19UQUcpKQotICAgICAgICAgICAgbG9nRGVidWcobWVzc2FnZSwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UgaWYgKGxvZ0xldmVsLmVxdWFscyhGQVRBTF9UQUcpKQotICAgICAgICAgICAgbG9nRmF0YWwobWVzc2FnZSwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UgaWYgKGxvZ0xldmVsLmVxdWFscyhUUkFDRV9UQUcpKQotICAgICAgICAgICAgbG9nVHJhY2UobWVzc2FnZSwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIlVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWw6ICIpLmFwcGVuZCAobG9nTGV2ZWwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbG9nRmF0YWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2Ugbm90IG51bGwKLSAgICAgKiBAcGFyYW0gc2lldmVDb250ZXh0IG5vdCBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nRmF0YWwoU3RyaW5nIG1lc3NhZ2UsIFNpZXZlQ29udGV4dCBzaWV2ZUNvbnRleHQpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IHNpZXZlQ29udGV4dC5nZXRMb2coKTsKLSAgICAgICAgaWYgKGxvZy5pc0ZhdGFsRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nLmZhdGFsKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBsb2dXYXJuLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dXYXJuKFN0cmluZyBtZXNzYWdlLCBTaWV2ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gY29udGV4dC5nZXRMb2coKTsKLSAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCi0gICAgICAgICAgICBsb2cud2FybihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbG9nSW5mby4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgU2lldmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IGNvbnRleHQuZ2V0TG9nKCk7Ci0gICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nLmluZm8obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGxvZ0RlYnVnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgU2lldmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IGNvbnRleHQuZ2V0TG9nKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbG9nVHJhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2Ugbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ1RyYWNlKFN0cmluZyBtZXNzYWdlLCBTaWV2ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0gY29udGV4dC5nZXRMb2coKTsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBsb2dFcnJvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFNpZXZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSBjb250ZXh0LmdldExvZygpOwotICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2cuZXJyb3IobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzLAotICAgICAqICAgICAgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgaW4gZXhlY3V0ZUJhc2ljKCkKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9leHRlbnNpb25zL0xvZ0xldmVsVGFncy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL2V4dGVuc2lvbnMvTG9nTGV2ZWxUYWdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzlmZGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL2V4dGVuc2lvbnMvTG9nTGV2ZWxUYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnM7Ci0KLS8qKgotICogSW50ZXJmYWNlIExvZ0xldmVsVGFncyBkZWZpbmVzIHRoZSBTdHJpbmcgY29uc3RhbnRzIGZvciB0aGUgdGFncyB1c2VkIHRvCi0gKiBzcGVjaWZ5IHRoZSBsb2dnaW5nIGxldmVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ0xldmVsVGFncyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVEFHID0gIjpkZWJ1ZyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9UQUcgPSAiOmVycm9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVEFMX1RBRyA9ICI6ZmF0YWwiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19UQUcgPSAiOmluZm8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VfVEFHID0gIjp0cmFjZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX1RBRyA9ICI6d2FybiI7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9vcHRpb25hbC9GaWxlSW50by5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL29wdGlvbmFsL0ZpbGVJbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDI1M2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL29wdGlvbmFsL0ZpbGVJbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TdHJpbmdMaXN0QXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RBY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgRmlsZUludG8gaW1wbGVtZW50cyB0aGUgRmlsZUludG8gQ29tbWFuZCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LAotICogc2VjdGlvbiA0LjIuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlSW50byBleHRlbmRzIEFic3RyYWN0QWN0aW9uQ29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVxdWlyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZUludG8oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQWRkIGFuIEFjdGlvbkZpbGVJbnRvIHRvIHRoZSBMaXN0IG9mIEFjdGlvbnMgdG8gYmUgcGVyZm9ybWVkIHBhc3NpbmcgdGhlCi0gICAgICogc29sZSBTdHJpbmdMaXN0IGFyZ3VtZW50IGFzIHRoZSBkZXN0aW5hdGlvbi4gUkZDIDMwMjggbWFuZGF0ZXMgdGhhdCB0aGVyZQotICAgICAqIHNob3VsZCBiZSBvbmx5IG9uZSBGaWxlSW50byBwZXIgZGVzdGluYXRpb24uIElmIHRoaXMgaXMgYSBkdXBsaWNhdGUsIHRoaXMKLSAgICAgKiBDb21tYW5kIGlzIHNpbGVudGx5IGlnbm9yZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFsc28sCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBCbG9jaywgU2lldmVDb250ZXh0KQotICAgICAqICAgICAgPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBCbG9jayBibG9jaywgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbiA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudHMKLSAgICAgICAgICAgICAgICAuZ2V0QXJndW1lbnRMaXN0KCkuZ2V0KDApKS5nZXRMaXN0KCkuZ2V0KDApOwotCi0gICAgICAgIC8vIE9ubHkgb25lIGZpbGVpbnRvIHBlciBkZXN0aW5hdGlvbiBhbGxvd2VkLCBvdGhlcnMgc2hvdWxkIGJlCi0gICAgICAgIC8vIGRpc2NhcmRlZAotICAgICAgICBib29sZWFuIGlzRHVwbGljYXRlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoZmluYWwgQWN0aW9uIGFjdGlvbjogbWFpbC5nZXRBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgIGlzRHVwbGljYXRlID0gKGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkZpbGVJbnRvKQotICAgICAgICAgICAgICAgICAgICAmJiAoKChBY3Rpb25GaWxlSW50bykgYWN0aW9uKS5nZXREZXN0aW5hdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhkZXN0aW5hdGlvbikpOwotICAgICAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzRHVwbGljYXRlKQotICAgICAgICAgICAgbWFpbC5hZGRBY3Rpb24obmV3IEFjdGlvbkZpbGVJbnRvKGRlc3RpbmF0aW9uKSk7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzLAotICAgICAqICAgICAgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVTaW5nbGVTdHJpbmdBcmd1bWVudHMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9vcHRpb25hbC9SZWplY3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9vcHRpb25hbC9SZWplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2OTEzZi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvb3B0aW9uYWwvUmVqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU3RyaW5nTGlzdEFyZ3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0QWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25SZWplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyB8IEludGVyZmFjZSBFbnRlciBkZXNjcmlwdGlvbiBoZXJlCi0gKiAKLSAqIENyZWF0aW9uIERhdGU6IDExLUphbi0wNAotICogCi0gKiBAYXV0aG9yIHNicmV3aW4KLSAqIAotICogQ29weXJpZ2h0IDIwMDMsIFN5bmVyZ3kgU3lzdGVtcyBMaW1pdGVkCi0gKi8KLS8qKgotICogQ2xhc3MgUmVqZWN0IGltcGxlbWVudHMgdGhlIFJlamVjdCBDb21tYW5kIGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24KLSAqIDQuMS4KLSAqLwotcHVibGljIGNsYXNzIFJlamVjdCBleHRlbmRzIEFic3RyYWN0QWN0aW9uQ29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUmVqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBSZWplY3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQWRkIGFuIEFjdGlvblJlamVjdCB0byB0aGUgTGlzdCBvZiBBY3Rpb25zIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQWxzbywKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIsCi0gICAgICogICAgICBBcmd1bWVudHMsIEJsb2NrLCBTaWV2ZUNvbnRleHQpCi0gICAgICogICAgICA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrLCBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAoKFN0cmluZ0xpc3RBcmd1bWVudCkgYXJndW1lbnRzCi0gICAgICAgICAgICAgICAgLmdldEFyZ3VtZW50TGlzdCgpLmdldCgwKSkuZ2V0TGlzdCgpLmdldCgwKTsKLQotICAgICAgICBtYWlsLmFkZEFjdGlvbihuZXcgQWN0aW9uUmVqZWN0KG1lc3NhZ2UpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjdmFsaWRhdGVTdGF0ZShTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTdGF0ZShmaW5hbCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudmFsaWRhdGVTdGF0ZShjb250ZXh0KTsKLQotICAgICAgICBpZiAoY29udGV4dC5nZXRDb21tYW5kU3RhdGVNYW5hZ2VyKCkuaXNIYXNBY3Rpb25zKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDb29yZGluYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNvbW1hbmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBcInJlamVjdFwiIGNvbW1hbmQgaXMgbm90IGFsbG93ZWQgd2l0aCBvdGhlciBBY3Rpb24gQ29tbWFuZHMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCN1cGRhdGVTdGF0ZShTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoU2lldmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIudXBkYXRlU3RhdGUoY29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQuZ2V0Q29tbWFuZFN0YXRlTWFuYWdlcigpLnNldFJlamVjdGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI3ZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cywKLSAgICAgKiAgICAgIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlU2luZ2xlU3RyaW5nQXJndW1lbnRzKGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQXNjaWlDYXNlbWFwLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQXNjaWlDYXNlbWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjMyMmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0FzY2lpQ2FzZW1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZVBhdHRlcm5FeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgQXNjaWlDYXNlbWFwIGltcGxlbWVudHMgdGhlIEVRVUFMSVRZIG9wZXJhdGlvbiBvZiB0aGUgaTthc2NpaS1jYXNlbWFwCi0gKiBjb21wYXJhdG9yIGFzIGRlZmluZWQgYnkgUkZDMjI0NCwgc2VjdGlvbiAzLjQgLSAiV2l0aCB0aGlzIGZ1bmN0aW9uIHRoZQotICogdmFsdWVzICJoZWxsbyIgYW5kICJIRUxMTyIgaGF2ZSB0aGUgc2FtZSBvcmRpbmFsIHZhbHVlIGFuZCBhcmUgY29uc2lkZXJlZAotICogZXF1YWwiLgotICovCi1wdWJsaWMgY2xhc3MgQXNjaWlDYXNlbWFwIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNjaWlDYXNlbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBBc2NpaUNhc2VtYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5FcXVhbHMjZXF1YWxzKFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLSAgICAgICAgcmV0dXJuIENvbXBhcmF0b3JVdGlscy5lcXVhbHMoc3RyaW5nMS50b1VwcGVyQ2FzZSgpLCBzdHJpbmcyCi0gICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuQ29udGFpbnMjY29udGFpbnMoU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIENvbXBhcmF0b3JVdGlscy5jb250YWlucyhjb250YWluZXIudG9VcHBlckNhc2UoKSwgY29udGVudAotICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk1hdGNoZXMjbWF0Y2hlcyhTdHJpbmcsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcsIFN0cmluZyBnbG9iKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlUGF0dGVybkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBDb21wYXJhdG9yVXRpbHMKLSAgICAgICAgICAgICAgICAubWF0Y2hlcyhzdHJpbmcudG9VcHBlckNhc2UoKSwgZ2xvYi50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9Bc2NpaU51bWVyaWMuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9Bc2NpaU51bWVyaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkY2EzMy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQXNjaWlOdW1lcmljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9yczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLkZlYXR1cmVFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgQXNjaWlOdW1lcmljIGltcGxlbWVudHMgdGhlIEVRVUFMSVRZIG9wZXJhdGlvbiBvZiB0aGUgaTthc2NpaS1udW1lcmljCi0gKiBjb21wYXJhdG9yIGFzIGRlZmluZWQgYnkgUkZDMjI0NCwgc2VjdGlvbiAzLjQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc2NpaU51bWVyaWMgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBc2NpaU51bWVyaWMuCi0gICAgICovCi0gICAgcHVibGljIEFzY2lpTnVtZXJpYygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkVxdWFscyNlcXVhbHMoU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgaWYgKGlzUG9zaXRpdmVJbmZpbml0eShzdHJpbmcxKSkgewotICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmVJbmZpbml0eShzdHJpbmcyKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmVJbmZpbml0eShzdHJpbmcyKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIGludGVnZXIxID0gdG9JbnRlZ2VyKHN0cmluZzEpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgaW50ZWdlcjIgPSB0b0ludGVnZXIoc3RyaW5nMik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW50ZWdlcjEuZXF1YWxzKGludGVnZXIyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgdG9JbnRlZ2VyKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpPTA7aTx2YWx1ZS5sZW5ndGgoKTtpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgbmV4dCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICghaXNEaWdpdChuZXh0KSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgcmVzdWx0ID0gbmV3IEJpZ0ludGVnZXIodmFsdWUuc3Vic3RyaW5nKDAsaSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEb2VzIHRoZSBnaXZlbiBzdHJpbmcgdG8gYmUgaGFuZGxlZCBhcyBwb3NpdGl2ZSBpbmZpbml0eT8KLSAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDc5MCNzZWN0aW9uLTkuMS4xJz5SRkM0NzkwPC9hPgotICAgICAqIEBwYXJhbSB2YWx1ZSBub3QgbnVsbAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB2YWx1ZSBzaG91bGQgcmVwcmVzZW50IHBvc2l0aXZlIGluZmluaXR5LAotICAgICAqIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Bvc2l0aXZlSW5maW5pdHkoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgZmluYWwgY2hhciBpbml0aWFsQ2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KDApOwotICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gIWlzRGlnaXQoaW5pdGlhbENoYXJhY3Rlcik7Ci0gICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuIEFTQ0lJIGRpZ2l0PwotICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgY2hhcmFjdGVyIHRvIGJlIHRlc3RlZAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgZGlnaXQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RpZ2l0KGZpbmFsIGNoYXIgY2hhcmFjdGVyKSB7Ci0gICAgICAgIHJldHVybiBjaGFyYWN0ZXI+PTB4MzAgJiYgY2hhcmFjdGVyPD0weDM5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRDb21wYXJlU3RyaW5nIGFuc3dlcnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGluIHdoaWNoIGFsbAotICAgICAqIG5vbi1kaWdpdCBjaGFyYWN0ZXJzIGFyZSB0cmFuc2xhdGVkIHRvIHRoZSBjaGFyYWN0ZXIgMHhmZi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVDb21wYXJlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY2hhcltdIGNoYXJzID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBjaGFycy5sZW5ndGg7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChjaGFyc1tpXSkpCi0gICAgICAgICAgICAgICAgY2hhcnNbaV0gPSAweGZmOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnN1cHBvcnRlZCwgc2VlIDxhIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ3OTAjc2VjdGlvbi05LjEuMSc+UkZDNDc5MDwvYT4uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5Db250YWlucyNjb250YWlucyhTdHJpbmcsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIEZlYXR1cmVFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBmaW5lciBncmFpbmVkIGV4Y2VwdGlvbgotICAgICAgICB0aHJvdyBuZXcgRmVhdHVyZUV4Y2VwdGlvbigiU3Vic3RyaW5nIG1hdGNoIHVuc3VwcG9ydGVkIGJ5IGFzY2lpLW51bWVyaWMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnN1cHBvcnRlZCBvcGVyYXRpb24uCi0gICAgICogPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTIyOCNzZWN0aW9uLTIuNy4xJz5SRkM1MjI4PC9hPiBsaW1pdHMKLSAgICAgKiBzdXBwb3J0IHRvIGNvbXBhcmF0b3JzIHRoYXQgc3VwcG9ydCA8Y29kZT46Y29udGFpbnM8L2NvZGU+LiAKLSAgICAgKiA8YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NzkwI3NlY3Rpb24tOS4xLjEnPlJGQzQ3OTA8L2E+IHN0YXRlcwotICAgICAqIHRoYXQgc3Vic3RyaW5nIG1hdGNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5NYXRjaGVzI21hdGNoZXMoU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZ2xvYikKLSAgICAgICAgICAgIHRocm93cyBGZWF0dXJlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgdXNpbmcgZmluZXIgZ3JhaW5lZCBleGNlcHRpb24KLSAgICAgICAgdGhyb3cgbmV3IEZlYXR1cmVFeGNlcHRpb24oIlN1YnN0cmluZyBtYXRjaCB1bnN1cHBvcnRlZCBieSBhc2NpaS1udW1lcmljIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQ29tcGFyYXRvci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZWNmYy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9yczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgQ29tcGFyYXRvciBkZWZpbmVzIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyBmb3IgU2lldmUgY29tcGFyYXRvcnMuIEl0Ci0gKiBjb25zaXN0cyBvZiBFcXVhbHMsIENvbnRhaW5zIGFuZCBNYXRjaGVzIENvbXBhcmlzb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBhcmF0b3IgZXh0ZW5kcyBFcXVhbHMsIENvbnRhaW5zLCBNYXRjaGVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JOYW1lcy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTAxZWViLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9Db21wYXJhdG9yTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLS8qKgotICogSW50ZXJmYWNlIENvbXBhcmF0b3JOYW1lcyBkZWZpbmVzIHRoZSBTdHJpbmcgY29uc3RhbnRzIHVzZWQgdG8gc3BlY2lmeSBhCi0gKiBDT01QQVJBVE9SIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGFyYXRvck5hbWVzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ1RFVF9DT01QQVJBVE9SID0gImk7b2N0ZXQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNDSUlfQ0FTRU1BUF9DT01QQVJBVE9SID0gImk7YXNjaWktY2FzZW1hcCI7Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQ29tcGFyYXRvclV0aWxzLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQ29tcGFyYXRvclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTZhNmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0NvbXBhcmF0b3JVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uTG9va3VwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVQYXR0ZXJuRXhjZXB0aW9uOwotCi1pbXBvcnQgc3RhdGljICBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5NYXRjaFR5cGVUYWdzLio7Ci0KLS8qKgotICogQ2xhc3MgQ29tcGFyYXRvclV0aWxzIGltcGxlbWVudHMgdXRpbGl0eSBtZXRob2RzIHVzZWQgYnkgQ29tcGFyYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYXJhdG9yVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbXBhcmF0b3JVdGlscy4KLSAgICAgKi8KLSAgICBwcml2YXRlIENvbXBhcmF0b3JVdGlscygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgPGNvZGU+bWF0Y2g8L2NvZGU+IGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPm1hdGNoVGFyZ2V0PC9jb2RlPiBjb21wYXJlcyB0byBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5tYXRjaEFyZ3VtZW50PC9jb2RlPiBpcyBhIG1hdGNoIG9mIDxjb2RlPm1hdGNoVHlwZTwvY29kZT4gdXNpbmcKLSAgICAgKiB0aGUgY29tcGFyYXRvciA8Y29kZT5jb21wYXJhdG9yTmFtZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBhcmF0b3JOYW1lIG5vdCBudWxsCi0gICAgICogQHBhcmFtIG1hdGNoVHlwZSBub3QgbnVsbAotICAgICAqIEBwYXJhbSBtYXRjaFRhcmdldCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBtYXRjaEFyZ3VtZW50IG5vdCBudWxsCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIGNvbXBhcmF0b3JOYW1lLCBTdHJpbmcgbWF0Y2hUeXBlLAotICAgICAgICAgICAgU3RyaW5nIG1hdGNoVGFyZ2V0LCBTdHJpbmcgbWF0Y2hBcmd1bWVudCwgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzTWF0Y2hlZCA9IGZhbHNlOwotICAgICAgICBpZiAobWF0Y2hUeXBlLmVxdWFscyhJU19UQUcpKQotICAgICAgICAgICAgaXNNYXRjaGVkID0gaXMoY29tcGFyYXRvck5hbWUsIG1hdGNoVGFyZ2V0LCBtYXRjaEFyZ3VtZW50LCBjb250ZXh0KTsKLSAgICAgICAgZWxzZSBpZiAobWF0Y2hUeXBlLmVxdWFscyhDT05UQUlOU19UQUcpKQotICAgICAgICAgICAgaXNNYXRjaGVkID0gY29udGFpbnMoY29tcGFyYXRvck5hbWUsIG1hdGNoVGFyZ2V0LCBtYXRjaEFyZ3VtZW50LAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgZWxzZSBpZiAobWF0Y2hUeXBlLmVxdWFscyhNQVRDSEVTX1RBRykpCi0gICAgICAgICAgICBpc01hdGNoZWQgPSBtYXRjaGVzKGNvbXBhcmF0b3JOYW1lLCBtYXRjaFRhcmdldCwgbWF0Y2hBcmd1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIDxjb2RlPm1hdGNoZXM8L2NvZGU+IGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlCi0gICAgICogcGFyYW1ldGVyIDxjb2RlPnN0cmluZzwvY29kZT4gbWF0Y2hlcyB0aGUgZ2xvYiBwYXR0ZXJuIGRlc2NyaWJlZCBieQotICAgICAqIHBhcmFtZXRlciA8Y29kZT5nbG9iPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHBhcmFtIGdsb2IKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAdGhyb3dzIFNpZXZlUGF0dGVybkV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcsIFN0cmluZyBnbG9iKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlUGF0dGVybkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVnZXggPSBzaWV2ZVRvSmF2YVJlZ2V4KGdsb2IpOwotICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKHJlZ2V4KS5tYXRjaGVyKHN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaGVzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlUGF0dGVybkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlCi0gICAgICogcGFyYW1ldGVyIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4gY29udGFpbnMgdGhlIHBhcmFtZXRlcgotICAgICAqIDxjb2RlPmNvbnRlbnRzPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRhaW5lcgotICAgICAqIEBwYXJhbSBjb250ZW50cwotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgY29udGVudHMpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbmRleE9mKGNvbnRlbnRzKSA+IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlCi0gICAgICogcGFyYW1ldGVyIDxjb2RlPnN0cmluZzE8L2NvZGU+IGlzIGVxdWFsIHRvIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHJpbmcyPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmluZzEKLSAgICAgKiBAcGFyYW0gc3RyaW5nMgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmcxLmVxdWFscyhzdHJpbmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXIgaXMgYSBzcGVjaWFsIGNoYXIgZm9yIHJlZ2V4Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlZ2V4U3BlY2lhbENoYXIoY2hhciBjaCkgewotICAgICAgICByZXR1cm4gKGNoID09ICcqJyB8fCBjaCA9PSAnPycgfHwgY2ggPT0gJysnIHx8IGNoID09ICdbJyB8fCBjaCA9PSAnXScKLSAgICAgICAgICAgICAgICB8fCBjaCA9PSAnKCcgfHwgY2ggPT0gJyknIHx8IGNoID09ICd8JyB8fCBjaCA9PSAnXicKLSAgICAgICAgICAgICAgICB8fCBjaCA9PSAnJCcgfHwgY2ggPT0gJy4nIHx8IGNoID09ICd7JyB8fCBjaCA9PSAnfScgfHwgY2ggPT0gJ1xcJyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyIGlzIGEgc3BlY2lhbCBjaGFyIGZvciBzaWV2ZSBtYXRjaGluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaWV2ZU1hdGNoZXJTcGVjaWFsQ2hhcihjaGFyIGNoKSB7Ci0gICAgICAgIHJldHVybiAoY2ggPT0gJyonIHx8IGNoID09ICc/JyB8fCBjaCA9PSAnXFwnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIFNpZXZlIHBhdHRlcm4gaW4gYSBqYXZhIHJlZ2V4IHBhdHRlcm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaWV2ZVRvSmF2YVJlZ2V4KFN0cmluZyBwYXR0ZXJuKSB7Ci0gICAgICAgIGludCBjaDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMiAqIHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBib29sZWFuIGxhc3RDaGFyV2FzU3RhciA9IGZhbHNlOwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBwYXR0ZXJuLmxlbmd0aCgpOyBjaCsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIG5leHRDaGFyID0gcGF0dGVybi5jaGFyQXQoY2gpOwotICAgICAgICAgICAgc3dpdGNoIChuZXh0Q2hhcikgewotICAgICAgICAgICAgY2FzZSAnKic6Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBKYXZhIE1hdGNoZXIgaGFzIGlzc3VlcyB3aXRoIHJlcGVhdGVkIHN0YXJzCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpZiAoIWxhc3RDaGFyV2FzU3RhcikgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIuKiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSBwYXR0ZXJuLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1NpZXZlTWF0Y2hlclNwZWNpYWxDaGFyKHBhdHRlcm4uY2hhckF0KGNoICsgMSkpKQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHBhdHRlcm4uY2hhckF0KCsrY2gpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChpc1JlZ2V4U3BlY2lhbENoYXIobmV4dENoYXIpKQotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobmV4dENoYXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaXNzdWUgd2l0aCBKYXZhIE1hdGNoZXIKLSAgICAgICAgICAgIGxhc3RDaGFyV2FzU3RhciA9ICcqJyA9PSBuZXh0Q2hhcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIDxjb2RlPmNvbnRhaW5zPGNvZGU+IGFuc3dlcnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHBhcmFtZXRlciAKLSAgICAgKiA8Y29kZT5jb250YWluZXI8L2NvZGU+IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgPGNvZGU+Y29udGVudHM8L2NvZGU+IHVzaW5nIGFuCi0gICAgICogaW5zdGFuY2Ugb2YgPGNvZGU+Y29tcGFyYXRvck5hbWU8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yTmFtZSBub3QgbnVsbAotICAgICAqIEBwYXJhbSBjb250YWluZXIgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGVudHMgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgY29tcGFyYXRvck5hbWUsIFN0cmluZyBjb250YWluZXIsCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBDb250YWlucyBjb21wYXJhdG9yT2JqID0gY29udGV4dC5nZXRDb21wYXJhdG9yTWFuYWdlcigpLmdldENvbXBhcmF0b3IoY29tcGFyYXRvck5hbWUpOwotICAgICAgICByZXR1cm4gY29tcGFyYXRvck9iai5jb250YWlucyhjb250YWluZXIsIGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgPGNvZGU+aXM8Y29kZT4gYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcGFyYW1ldGVyIAotICAgICAqIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4gaXMgZXF1YWwgdG8gdGhlIHBhcmFtZXRlciA8Y29kZT5jb250ZW50czwvY29kZT4gdXNpbmcgCi0gICAgICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+Y29tcGFyYXRvck5hbWU8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yTmFtZQotICAgICAqIEBwYXJhbSBzdHJpbmcxIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHN0cmluZzIgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhTdHJpbmcgY29tcGFyYXRvck5hbWUsIFN0cmluZyBzdHJpbmcxLAotICAgICAgICAgICAgU3RyaW5nIHN0cmluZzIsIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgTG9va3VwRXhjZXB0aW9uIHsKLSAgICAgICAgRXF1YWxzIGNvbXBhcmF0b3JPYmogPSBjb250ZXh0LmdldENvbXBhcmF0b3JNYW5hZ2VyKCkuZ2V0Q29tcGFyYXRvcihjb21wYXJhdG9yTmFtZSk7Ci0gICAgICAgIHJldHVybiBjb21wYXJhdG9yT2JqLmVxdWFscyhzdHJpbmcxLCBzdHJpbmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgPGNvZGU+bWF0Y2hlczwvY29kZT4gYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUKLSAgICAgKiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHJpbmcvY29kZT4gaXMgbWF0Y2hlZCBieSB0aGUgcGF0dGVybSA8Y29kZT5nbG9iPC9jb2RlPiB1c2luZyBhbgotICAgICAqIGluc3RhbmNlIG9mIDxjb2RlPmNvbXBhcmF0b3JOYW1lPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvck5hbWUgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gc3RyaW5nIG5vdCBudWxsCi0gICAgICogQHBhcmFtIGdsb2Igbm90IG51bGwKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBjb21wYXJhdG9yTmFtZSwgU3RyaW5nIHN0cmluZywKLSAgICAgICAgICAgIFN0cmluZyBnbG9iLCBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgTWF0Y2hlcyBjb21wYXJhdG9yT2JqID0gY29udGV4dC5nZXRDb21wYXJhdG9yTWFuYWdlcigpLmdldENvbXBhcmF0b3IoY29tcGFyYXRvck5hbWUpOwotICAgICAgICByZXR1cm4gY29tcGFyYXRvck9iai5tYXRjaGVzKHN0cmluZywgZ2xvYik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQ29udGFpbnMuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9Db250YWlucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgyNzI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9Db250YWlucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5GZWF0dXJlRXhjZXB0aW9uOwotCi0KLS8qKgotICogSW50ZXJmYWNlIENvbnRhaW5zIGRlZmluZXMgdGhlIG1ldGhvZCBzaWduYXR1cmVzIGZvciBjb250YWlucyBjb21wYXJhdG9ycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWlucyB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY29udGFpbnMgYW5zd2VycyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IGluZGljYXRpbmcgaWYgcGFyYW1ldGVyCi0gICAgICogPGNvZGU+Y29udGFpbmVyPC9jb2RlPiBjb250YWlucyBwYXJhbWV0ZXIgPGNvZGU+Y29udGVudDwvY29kZT4gdXNpbmcKLSAgICAgKiB0aGUgY29tcGFyaXNvbiBydWxlcyBkZWZpbmQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250YWluZXIKLSAgICAgKiBAcGFyYW0gY29udGVudAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEB0aHJvd3MgRmVhdHVyZUV4Y2VwdGlvbiB3aGVuIHN1YnN0cmluZyBpcyB1bnN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBjb250YWluZXIsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRmVhdHVyZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0VxdWFscy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0VxdWFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE5OTY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9FcXVhbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLS8qKgotICogSW50ZXJmYWNlIEVxdWFscyBkZWZpbmVzIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyBmb3IgZXF1YWxzIGNvbXBhcmF0b3JzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVxdWFscyB7Ci0gICAgLyoqCi0gICAgICogTWV0aG9kIGVxdWFscyBhbnN3ZXJzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyBpZiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHJpbmcxPC9jb2RlPiBpcyBlcXVhbCB0byBwYXJhbWV0ZXIgPGNvZGU+c3RyaW5nMjwvY29kZT4gdXNpbmcKLSAgICAgKiB0aGUgY29tcGFyaXNvbiBydWxlcyBkZWZpbmQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJpbmcxCi0gICAgICogQHBhcmFtIHN0cmluZzIKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9NYXRjaFR5cGVUYWdzLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvTWF0Y2hUeXBlVGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMzNTcxLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9ycy9NYXRjaFR5cGVUYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzOwotCi0vKioKLSAqIEludGVyZmFjZSBNYXRjaFR5cGVUYWdzIGRlZmluZXMgdGhlIFN0cmluZyBjb25zdGFudHMgdXNlZCB0byBzcGVjaWZ5IGFuCi0gKiBNQVRDSC1UWVBFIHRhZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXRjaFR5cGVUYWdzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19UQUcgPSAiOmlzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5TX1RBRyA9ICI6Y29udGFpbnMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hFU19UQUcgPSAiOm1hdGNoZXMiOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvTWF0Y2hlcy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL01hdGNoZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjZDZmYS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvTWF0Y2hlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgTWF0Y2hlcyBkZWZpbmVzIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyBmb3IgbWF0Y2hlcyBjb21wYXJhdG9ycy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXRjaGVzIHsKLSAgICAvKioKLSAgICAgKiBNZXRob2QgbWF0Y2hlcyBhbnN3ZXJzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyBpZiBwYXJhbWV0ZXIKLSAgICAgKiA8Y29kZT5zdHJpbmcxPC9jb2RlPiBtYXRjaGVzIHRoZSBwYXR0ZXJuIGluIHBhcmFtZXRlciA8Y29kZT5nbG9iPC9jb2RlPgotICAgICAqIHVzaW5nIHRoZSBtYXRjaGluZyBydWxlcyBkZWZpbmQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gZ2xvYgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZywgU3RyaW5nIGdsb2IpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL09jdGV0LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvT2N0ZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZjdhOS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvT2N0ZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVQYXR0ZXJuRXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIE9jdGV0IGltcGxlbWVudHMgdGhlIEVRVUFMSVRZIG9wZXJhdGlvbiBvZiB0aGUgaTtvY3RldCBjb21wYXJhdG9yIGFzCi0gKiBkZWZpbmVkIGJ5IFJGQzIyNDQsIHNlY3Rpb24gMy40IC0gIkZvciB0aGUgZXF1YWxpdHkgZnVuY3Rpb24sIHR3byBzdHJpbmdzIGFyZQotICogZXF1YWwgaWYgdGhleSBhcmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCBjb250YWluIHRoZSBzYW1lIG9jdGV0cyBpbiB0aGUgc2FtZQotICogb3JkZXIuIE5JTCBpcyBlcXVhbCBvbmx5IHRvIGl0c2VsZiIuCi0gKi8KLXB1YmxpYyBjbGFzcyBPY3RldCBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE9jdGV0LgotICAgICAqLwotICAgIHB1YmxpYyBPY3RldCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkVxdWFscyNlcXVhbHMoU3RyaW5nLCBTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgewotICAgICAgICByZXR1cm4gQ29tcGFyYXRvclV0aWxzLmVxdWFscyhzdHJpbmcxLCBzdHJpbmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkNvbnRhaW5zI2NvbnRhaW5zKFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBjb250YWluZXIsIFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBDb21wYXJhdG9yVXRpbHMuY29udGFpbnMoY29udGFpbmVyLCBjb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk1hdGNoZXMjbWF0Y2hlcyhTdHJpbmcsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcsIFN0cmluZyBnbG9iKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlUGF0dGVybkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBDb21wYXJhdG9yVXRpbHMubWF0Y2hlcyhzdHJpbmcsIGdsb2IpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9Db21tYW5kRXhjZXB0aW9uLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL0NvbW1hbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNTBjNy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL0NvbW1hbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIDxjb2RlPkNvbW1hbmRFeGNlcHRpb248L2NvZGU+IGluZGljYXRlcyBhbiBleGNlcHRpb25hbCBjb25kaXRpb24KLSAqIGVuY291bnRlcmVkIHdoaWxlIGV4ZWN1dGluZyBhIENvbW1hbmQuCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEV4Y2VwdGlvbiBleHRlbmRzIE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWFuZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWFuZEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDb21tYW5kRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb21tYW5kRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbW1hbmRFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vRmVhdHVyZUV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9GZWF0dXJlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzNkMmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9GZWF0dXJlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBGZWF0dXJlRXhjZXB0aW9uIGluZGljYXRlcyBhbiBleGNlcHRpb25hbCBjb25kaXRpb24gZW5jb3VudGVyZWQgd2hpbGUKLSAqIGV2YWx1YXRpbmcgYSBmZWF0dXJlIG9mIFNpZXZlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBGZWF0dXJlRXhjZXB0aW9uIGV4dGVuZHMgU2lldmVFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEZlYXR1cmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRmVhdHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRmVhdHVyZUV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBGZWF0dXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBGZWF0dXJlRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBGZWF0dXJlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL0ludGVybmV0QWRkcmVzc0V4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9JbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3NjIwNy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL0ludGVybmV0QWRkcmVzc0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uIGluZGljYXRlcyBhbiBleGNlcHRpb25hbCBjb25kaXRpb24gZW5jb3VudGVyZWQKLSAqIHdoaWxlIGV2YWx1YXRpbmcgYW4gSW50ZXJuZXQgQWRkcmVzcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1wdWJsaWMgY2xhc3MgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uIGV4dGVuZHMgU2lldmVFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEludGVybmV0QWRkcmVzc0V4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEludGVybmV0QWRkcmVzc0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9Mb29rdXBFeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vTG9va3VwRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGUxMTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9Mb29rdXBFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIExvb2t1cEV4Y2VwdGlvbiBpbmRpY2F0ZXMgYW4gZXhjZXB0aW9uYWwgY29uZGl0aW9uIGVuY291bnRlcmVkIHdoaWxlCi0gKiBsb2NhdGluZyBhIFNpZXZlIHJlc291cmNlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBMb29rdXBFeGNlcHRpb24gZXh0ZW5kcyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTG9va3VwRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBMb29rdXBFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIExvb2t1cEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBMb29rdXBFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIExvb2t1cEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBMb29rdXBFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIExvb2t1cEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9va3VwRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL09wZXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9PcGVyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhOGEwNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL09wZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgPGNvZGU+T3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBpbmRpY2F0ZXMgYW4gZXhjZXB0aW9uYWwgY29uZGl0aW9uCi0gKiBlbmNvdW50ZXJlZCB3aGlsZSBleGVjdXRpbmcgYW4gT3BlcmF0aW9uLgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFNpZXZlRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBPcGVyYXRpb25FeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgT3BlcmF0aW9uRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgT3BlcmF0aW9uRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgT3BlcmF0aW9uRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vU2lldmVFeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vU2lldmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlOGIxMC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL1NpZXZlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5TaWV2ZUV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGVzIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbgotICogZW5jb3VudGVyZWQgd2l0aGluIFNpZXZlLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBTaWV2ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2lldmVFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZUV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2lldmVFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9TaWV2ZVBhdHRlcm5FeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vU2lldmVQYXR0ZXJuRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjVhMGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9TaWV2ZVBhdHRlcm5FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIDxjb2RlPlNpZXZlUGF0dGVybkV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGVzIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbgotICogZW5jb3VudGVyZWQgd2hpbGUgZXZhbHVhdGluZyBhIGdsb2IgZXhwcmVzc2lvbi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1wdWJsaWMgY2xhc3MgU2lldmVQYXR0ZXJuRXhjZXB0aW9uIGV4dGVuZHMgU2lldmVFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlUGF0dGVybkV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVQYXR0ZXJuRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZVBhdHRlcm5FeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVQYXR0ZXJuRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZVBhdHRlcm5FeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVQYXR0ZXJuRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZVBhdHRlcm5FeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlUGF0dGVybkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9TdG9wRXhjZXB0aW9uLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL1N0b3BFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMzZlZC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL1N0b3BFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIDxjb2RlPlN0b3BFeGNlcHRpb248L2NvZGU+IGluZGljYXRlcyB0aGF0IGV2YWx1YXRpb24gc2hvdWxkIGJlCi0gKiB0ZXJtaW5hdGVkLiBUeXBpY2FsbHksIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgU3RvcCBDb21tYW5kIGlzCi0gKiBlbmNvdW50ZXJlZC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1wdWJsaWMgY2xhc3MgU3RvcEV4Y2VwdGlvbiBleHRlbmRzIFNpZXZlRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTdG9wRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdG9wRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTdG9wRXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0b3BFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFN0b3BFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RvcEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3RvcEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RvcEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9TeW50YXhFeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vU3ludGF4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTdhNDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2V4Y2VwdGlvbi9TeW50YXhFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uOwotCi0vKioKLSAqIENsYXNzIDxjb2RlPlN5bnRheEV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGVzIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbgotICogZW5jb3VudGVyZWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgb3BlcmFuZHMgb2YgYSBTaWV2ZSBvcGVyYXRpb24sIHN1Y2ggYXMgYQotICogQ29tbWFuZCwgVGVzdCBvciBDb21wYXJhdG9yLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBTeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3ludGF4RXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFN5bnRheEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFN5bnRheEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFN5bnRheEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3ludGF4RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvZXhjZXB0aW9uL1Rlc3RFeGNlcHRpb24uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vVGVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjExM2M5Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9leGNlcHRpb24vVGVzdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgPGNvZGU+VGVzdEV4Y2VwdGlvbjwvY29kZT4gaW5kaWNhdGVzIGFuIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbgotICogZW5jb3VudGVyZWQgd2hpbGUgZXhlY3V0aW5nIGEgVGVzdC4KLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLXB1YmxpYyBjbGFzcyBUZXN0RXhjZXB0aW9uIGV4dGVuZHMgT3BlcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXN0RXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXN0RXhjZXB0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRlc3RFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdEV4Y2VwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvQWN0aW9uLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyN2EwOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgPGNvZGU+QWN0aW9uPC9jb2RlPiBkZWZpbmVzIHRoZSBmaW5hbCBzdGF0ZSBvZiBhCi0gKiA8Y29kZT5NYWlsQWRhcHRlcjwvY29kZT4gaW5zdGFuY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvQWN0aW9uRmlsZUludG8uamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FjdGlvbkZpbGVJbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YWU3YjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvQWN0aW9uRmlsZUludG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbDsKLQotLyoqCi0gKiBDbGFzcyBBY3Rpb25GaWxlSW50byBlbmNhcHN1bGF0ZXMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGZpbGUgYSBtYWlsCi0gKiBpbnRvIGEgbG9jYXRpb24uIFNlZSBSRkMgMzAyOCwgU2VjdGlvbiA0LjIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25GaWxlSW50byBpbXBsZW1lbnRzIEFjdGlvbiB7Ci0gICAgLyoqCi0gICAgICogQSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBtZXNzYWdlIHNob3VsZCBiZQotICAgICAqIG1vdmVkLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkRGVzdGluYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWN0aW9uRmlsZUludG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBY3Rpb25GaWxlSW50bygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWN0aW9uRmlsZUludG8uCi0gICAgICovCi0gICAgcHVibGljIEFjdGlvbkZpbGVJbnRvKFN0cmluZyBkZXN0aW5hdGlvbikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzdGluYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZERlc3RpbmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBY3Rpb246ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIsIGRlc3RpbmF0aW9uOiAiCi0gICAgICAgICAgICAgICAgKyBnZXREZXN0aW5hdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewotICAgICAgICBmaWVsZERlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb25LZWVwLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb25LZWVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZmFiMjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvQWN0aW9uS2VlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsOwotCi0vKioKLSAqIENsYXNzIEFjdGlvbktlZXAgZW5jYXBzdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBrZWVwIGEgbWFpbC4gU2VlCi0gKiBSRkMgMzAyOCwgU2VjdGlvbiA0LjQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25LZWVwIGltcGxlbWVudHMgQWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBY3Rpb25LZWVwLgotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25LZWVwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBY3Rpb246ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FjdGlvblJlZGlyZWN0LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb25SZWRpcmVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjFkODNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FjdGlvblJlZGlyZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWw7Ci0KLS8qKgotICogQ2xhc3MgQWN0aW9uUmVkaXJlY3QgZW5jYXBzdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byByZWRpcmVjdCBhCi0gKiBtYWlsLiBTZWUgUkZDIDMwMjgsIFNlY3Rpb24gNC4zLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uUmVkaXJlY3QgaW1wbGVtZW50cyBBY3Rpb24gewotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkQWRkcmVzczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBY3Rpb25SZWRpcmVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFjdGlvblJlZGlyZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBBY3Rpb25SZWRpcmVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWN0aW9uUmVkaXJlY3QoU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXRBZGRyZXNzKGFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBY3Rpb246ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIsIGFkZHJlc3M6ICIgKyBnZXRBZGRyZXNzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhZGRyZXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICogICAgICAgICAgICBUaGUgYWRkcmVzcyB0byBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIGZpZWxkQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BY3Rpb25SZWplY3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FjdGlvblJlamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWM0NDBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FjdGlvblJlamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsOwotCi0vKioKLSAqIENsYXNzIEFjdGlvblJlamVjdCBlbmNhcHN1bGF0ZXMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHJlamVjdCBhIG1haWwuCi0gKiBTZWUgUkZDIDMwMjgsIFNlY3Rpb24gNC4xLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uUmVqZWN0IGltcGxlbWVudHMgQWN0aW9uIHsKLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZE1lc3NhZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWN0aW9uUmVqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBBY3Rpb25SZWplY3QoU3RyaW5nIGFNZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgc2V0TWVzc2FnZShhTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgQWN0aW9uUmVqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgQWN0aW9uUmVqZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBY3Rpb246ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIHJlYXNvbiBmb3IgcmVqZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZmllbGRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgcmVhc29uIGZvciByZWplY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZmllbGRNZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FkZHJlc3NJbXBsLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9BZGRyZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZhM2FmLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL0FkZHJlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWw7Ci0KLS8qKgotICogU2ltcGxlIGltbXV0YWJsZSBhZGRyZXNzIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkcmVzc0ltcGwgaW1wbGVtZW50cyBNYWlsQWRhcHRlci5BZGRyZXNzIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2FsUGFydDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRvbWFpbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogICAgICAgICAgICB0aGUgbG9jYWwgcGFydCBvZiB0aGUgYWRkcmVzcwotICAgICAqIEBwYXJhbSBkb21haW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBkb21haW4gcGFydCBvZiB0aGUgYWRkcmVzcwotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzSW1wbChmaW5hbCBTdHJpbmcgbG9jYWxQYXJ0LCBmaW5hbCBTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubG9jYWxQYXJ0ID0gbG9jYWxQYXJ0OwotICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkb21haW4gb2YgdGhlIGFkZHJlc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiBkb21haW4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKLSAgICAgICAgcmV0dXJuIGRvbWFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgewotICAgICAgICByZXR1cm4gbG9jYWxQYXJ0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvTWFpbEFkYXB0ZXIuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL01haWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTA5MDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvTWFpbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIEludGVyZmFjZSA8Y29kZT5NYWlsQWRhcHRlcjwvY29kZT4gZGVmaW5lcyB0aGUgbWluaW11bSBmdW5jdGlvbmFsaXR5Ci0gKiByZXF1aXJlZCBvZiBvZiBhIGNsYXNzIGltcGxlbWVudGluZyBhIG1haWwgbWVzc2FnZS4gVGhpcyBpcyB0aGUgZnVuY3Rpb25hbGl0eQotICogbmVjY2VzYXJ5IHRvIGltcGxlbWVudCB0aGUgQ29tbWFuZHMgYW5kIFRlc3RzIHRoYXQgUkZDMzIwMjggbWFuZGF0ZXMgTVVTVCBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVHlwaWNhbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbCB3cmFwIGFuIGFwcGxpY2F0aW9uJ3MgcHJlLWV4aXN0aW5nIG1haWwKLSAqIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24uIEl0IGlzIGV4cGVjdGVkIHRoYXQgaW1wbGVtZW50YXRpb25zIHdpbGwgZXh0ZW5kIHRoZQotICogbWluaW11bSBsZXZlbCBvZiBmdW5jdGlvbmFsaXR5IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgQ29tbWFuZCBhbmQgVGVzdAotICogZXh0ZW5zaW9ucyB0aGF0IGV4cGxvaXQgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIDxoND5JbXBsZW1lbnRpbmcgcGFyc2VBZGRyZXNzZXM8L2g0PgotICogPHA+Ci0gKiA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9taW1lNGonPkFwYWNoZSBNaW1lNEo8L2E+IGlzIGEgcGFyc2VyIGZvcgotICogPGFiYnIgdGl0bGU9J011bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMnPiA8YQotICogaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzIwNDUuaHRtbCc+TUlNRTwvYT48L2FiYnI+LiBJdCBjYW4gZWFzaWx5Ci0gKiBiZSB1c2VkIHRvIHBhcnNlIGFuIGFkZHJlc3Mgc3RyaW5nIGludG8gYWRkcmVzc2VzLiBGb3IgZXhhbXBsZToKLSAqIDwvcD4KLSAqIDxjb2RlPjxwcmU+Ci0gKiAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5BZGRyZXNzTGlzdDsKLSAqICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLk1haWxib3g7Ci0gKiAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94TGlzdDsKLSAqICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKLSAqICAgICAgIC4uLgotICogICAgICAgcHVibGljIEFkZHJlc3NbXSBwYXJzZUFkZHJlc3NlcyhTdHJpbmcgYXJnKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uLCBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24gewotICogICAgICAgICAgIHRyeSB7Ci0gKiAgICAgICAgICAgICAgIGZpbmFsIE1haWxib3hMaXN0IGxpc3QgPSBBZGRyZXNzTGlzdC5wYXJzZShhcmcpLmZsYXR0ZW4oKTsKLSAqICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAqICAgICAgICAgICAgICAgZmluYWwgQWRkcmVzc1tdIHJlc3VsdHMgPSBuZXcgQWRkcmVzc1tzaXplXTsKLSAqICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2kmbHQ7c2l6ZTtpKyspIHsKLSAqICAgICAgICAgICAgICAgICAgIGZpbmFsIE1haWxib3ggbWFpbGJveCA9IGxpc3QuZ2V0KGkpOwotICogICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IG5ldyBBZGRyZXNzSW1wbChtYWlsYm94LmdldExvY2FsUGFydCgpLCBtYWlsYm94LmdldERvbWFpbigpKTsKLSAqICAgICAgICAgICAgICAgfQotICogICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAqICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gKiAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24oZSk7Ci0gKiAgICAgICAgICAgfQotICogICAgICAgfQotICogPC9wcmU+PC9jb2RlPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1haWxBZGFwdGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5TZXRzIHRoZSBjb250ZXh0IGZvciB0aGUgY3VycmVudCBzaWV2ZSBzY3JpcHQgZXhlY3V0aW9uLjwvcD4KLSAgICAgKiA8cD5TaWV2ZSBlbmdpbmVzIDxjb2RlPk1VU1Q8L2NvZGU+IHNldCB0aGlzIHByb3BlcnR5IGJlZm9yZSBhbnkgY2FsbHMKLSAgICAgKiByZWxhdGVkIHRvIHRoZSBleGVjdXRpb24gb2YgYSBzY3JpcHQgYXJlIG1hZGUuPC9wPgotICAgICAqIDxwPkltcGxlbWVudGF0aW9ucyBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYmV0d2VlbiBzZXBhcmF0ZSB0aHJlYWRzIG9mCi0gICAgICogZXhlY3V0aW9uIDxjb2RlPk1VU1Q8L2NvZGU+IGVuc3VyZSB0aGF0IHRoZXkgbWFuYWdlIGNvbmN1cnJlbmN5IGNvbnRleHRzLAotICAgICAqIGZvciBleGFtcGxlIGJ5IHN0b3JhZ2UgaW4gYSB0aHJlYWQgbG9jYWwgdmFyaWFibGUuIEVuZ2luZXMgPGNvZGU+TVVTVDwvY29kZT4KLSAgICAgKiAtIGZvciBhIHNjcmlwdCBleGVjdXRpb24gLSBlbnN1cmUgdGhhdCBhbGwgY2FsbHMgYXJlIG1hZGUgd2l0aGluIHRoZQotICAgICAqIHNhbWUgdGhyZWFkIG9mIGV4ZWN1dGlvbi48L3A+Ci0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGN1cnJlbnQgY29udGV4dCwgCi0gICAgICogb3IgbnVsbCB0byBjbGVhciB0aGUgY29udGVzdCBvbmNlIHRoZSBleGVjdXRpb24gb2YgYSBzY3JpcHQgaGFzIGNvbXBsZXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFNpZXZlQ29udGV4dCBjb250ZXh0KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0QWN0aW9ucyBhbnN3ZXJzIHRoZSBMaXN0IG9mIEFjdGlvbnMgYWNjdW11bGF0ZWQgYnkgdGhlCi0gICAgICogcmVjZWl2ZXIuIEltcGxlbWVudGF0aW9ucyBtYXkgZWxlY3QgdG8gc3VwcGx5IGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIEFjdGlvbn0ncywgbm90IG51bGwsIHBvc3NpYmx5Ci0gICAgICogICAgICAgICB1bm1vZGlmaWFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBY3Rpb24+IGdldEFjdGlvbnMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGVhZGVyIGFuc3dlcnMgYSBMaXN0IG9mIGFsbCBvZiB0aGUgaGVhZGVycyBpbiB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aG9zZSBuYW1lIGlzIGVxdWFsIHRvIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gaGVhZGVycyBhcmUgZm91bmQgYW4gZW1wdHkKLSAgICAgKiBMaXN0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiBub3QgbnVsbCwgcG9zc2libHkgZW1wdHksIHBvc3NpYmxlCi0gICAgICogICAgICAgICB1bm1vZGlmaWFibGUKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIGdldE1hdGNoaW5nSGVhZGVyIGFuc3dlcnMgYSBMaXN0IG9mIGFsbCBvZiB0aGUgaGVhZGVycyBpbiB0aGUKLSAgICAgKiByZWNlaXZlciB3aXRoIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gaGVhZGVycyBhcmUgZm91bmQgYW4gZW1wdHkgTGlzdCBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gZ2V0SGVhZGVyKFN0cmluZykgaW4gdGhhdCBpdCBpZ25vcmVzIGNhc2UgYW5kCi0gICAgICogdGhlIHdoaXRlc3BhY2UgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIG9mIGEgaGVhZGVyIG5hbWUgd2hlbiBwZXJmb3JtaW5nIHRoZQotICAgICAqIG1hdGNoLCBhcyByZXF1aXJlZCBieSBSRkMgMzAyOC4gVGh1cyAiRnJvbSIsICJmcm9tICIsICIgRnJvbSIgYW5kICIgZnJvbSAiCi0gICAgICogYXJlIGNvbnNpZGVyZWQgZXF1YWwuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiwgbm90IG51bGwgcG9zc2libHkgZW1wdHksIHBvc3NpYmxlCi0gICAgICogICAgICAgICB1bm1vZGlmaWFibGUKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGVhZGVyTmFtZXMgYW5zd2VycyBhIExpc3Qgb2YgYWxsIG9mIHRoZSBoZWFkZXJzIGluIHRoZQotICAgICAqIHJlY2VpdmVyLiBObyBkdXBsaWNhdGVzIGFyZSBhbGxvd2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4sIG5vdCBudWxsIHBvc3NpYmxlIGVtcHR5LCBwb3NzaWJsZQotICAgICAqICAgICAgICAgdW5tb2RpZmlhYmxlCi0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhlYWRlck5hbWVzKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBhZGRBY3Rpb24gYWRkcyBhbiBBY3Rpb24gdG8gdGhlIExpc3Qgb2YgQWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgYnkKLSAgICAgKiB0aGUgcmVjZWl2ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEFjdGlvbihBY3Rpb24gYWN0aW9uKTsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBleGVjdXRlQWN0aW9ucy4gQXBwbGllcyB0aGUgQWN0aW9ucyBhY2N1bXVsYXRlZCBieSB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZUFjdGlvbnMoKSB0aHJvd3MgU2lldmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0U2l6ZSBhbnN3ZXJzIHRoZSByZWNlaXZlcidzIG1lc3NhZ2Ugc2l6ZSBpbiBvY3RldHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBpbnQKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIGludCBnZXRTaXplKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRDb250ZW50VHlwZSByZXR1cm5zIHN0cmluZy9taW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlCi0gICAgICogdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGUgZ2l2ZW4gcGhyYXNlIGZvdW5kIGluIHRoZSBib2R5IHRleHQgb2YgdGhpcyBtYWlsPwotICAgICAqIFRoaXMgc2VhcmNoIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlLgotICAgICAqIEBwYXJhbSBwaHJhc2VDYXNlSW5zZW5zaXRpdmUgdGhlIHBocmFzZSB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGUgbWFpbCBoYXMgYSB0ZXh0dWFsIGJvZHkgYW5kIGNvbnRhaW5zIHRoZSBwaHJhc2UKLSAgICAgKiAoY2FzZSBpbnNlbnNpdGl2ZSksIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHdoZW4gdGhlIHNlYXJjaCBjYW5ub3QgYmUgY29tcGxldGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkJvZHlUZXh0KGZpbmFsIFN0cmluZyBwaHJhc2VDYXNlSW5zZW5zaXRpdmUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogUGFyc2VzIHRoZSBuYW1lZCBoZWFkZXIgdmFsdWUgaW50byBpbmRpdmlkdWFsIGFkZHJlc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSGVhZGVycyBzaG91bGQgYmUgbWF0Y2hlZCBpbiBhIHdheSB0aGF0IGlnbm9yZXMgY2FzZSBhbmQgdGhlIHdoaXRlc3BhY2UKLSAgICAgKiBwcmVmaXhlcyBhbmQgc3VmZml4ZXMgb2YgYSBoZWFkZXIgbmFtZSB3aGVuIHBlcmZvcm1pbmcgdGhlIG1hdGNoLCBhcwotICAgICAqIHJlcXVpcmVkIGJ5IFJGQyAzMDI4LiBUaHVzICJGcm9tIiwgImZyb20gIiwgIiBGcm9tIiBhbmQgIiBmcm9tICIgYXJlCi0gICAgICogY29uc2lkZXJlZCBlcXVhbC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGhlYWRlciB3aG9zZSB2YWx1ZSBpcyB0byBiZSBzcGxpdAotICAgICAqIEByZXR1cm4gYWRkcmVzc2VzIGxpc3RlZCBpbiB0aGUgZ2l2ZW4gaGVhZGVyIG5vdCBudWxsLCBwb3NzaWJseSBlbXB0eQotICAgICAqIEB0aHJvd3MgSW50ZXJuZXRBZGRyZXNzRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgaGVhZGVyIHZhbHVlIGlzIG5vdCBhbiBhZGRyZXNzIG9yIGxpc3Qgb2YgYWRkcmVzc2VzLgotICAgICAqICAgICAgICAgICAgIEltcGxlbWV0YXRpb25zIG1heSBlbGVjdCB0byBzdXBwb3J0IG9ubHkgc3RhbmRhcmQgaGVhZGVycwotICAgICAqICAgICAgICAgICAgIGtub3duIHRvIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgYWRkcmVzc2VzIHJhdGhlciB0aGFuIHBhcnNpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgdmFsdWUgY29udGVudAotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgaGVhZGVyIHZhbHVlIGNhbm5vdCBiZSByZWFkCi0gICAgICovCi0gICAgcHVibGljIEFkZHJlc3NbXSBwYXJzZUFkZHJlc3NlcyhTdHJpbmcgaGVhZGVyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24sIEludGVybmV0QWRkcmVzc0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnRhaW5zIGFkZHJlc3MgZGF0YSByZXF1aXJlZCBmb3IgU0lFVkUgcHJvY2Vzc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3MgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBlbWFpbCBhZGRyZXNzLiBTcGVjaWZpZWQgaW4gPGEKLSAgICAgICAgICogaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcvc2VydmVyL3JmY2xpc3QvYmFzaWMvcmZjMDgyMi50eHQnPlJGQzgyMjwvYT4uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIGxvY2FsIHBhcnQsIG5vdCBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsUGFydCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBkb21haW4gcGFydCBvZiB0aGUgZW1haWwgYWRkcmVzcy4gU3BlY2lmaWVkIGluIDxhCi0gICAgICAgICAqIGhyZWY9J2h0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL3NlcnZlci9yZmNsaXN0L2Jhc2ljL3JmYzA4MjIudHh0Jz5SRkM4MjI8L2E+LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBkb21haW4sIG5vdCBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL01haWxVdGlscy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvTWFpbFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWE3NzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvTWFpbFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLm1haWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIENsYXNzIE1haWxVdGlscyBpbXBsZW1lbnRzIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSB1c2VmdWwgd2hlbiBwcm9jZXNzaW5nCi0gKiBTaWV2ZSBtYWlsLgotICovCi1wdWJsaWMgY2xhc3MgTWFpbFV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNYWlsVXRpbHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1haWxVdGlscygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgZ2V0TWF0Y2hpbmdIZWFkZXIgYW5zd2VycyBhIExpc3Qgb2YgYWxsIG9mIHRoZSBoZWFkZXJzIGluIHRoZSBtYWlsCi0gICAgICogd2l0aCB0aGUgcGFzc2VkIG5hbWUuIElmIG5vIGhlYWRlcnMgYXJlIGZvdW5kIGFuIGVtcHR5IExpc3QgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBNYWlsQWRhcHRlci5nZXRIZWFkZXIoU3RyaW5nKSBpbiB0aGF0IGl0IGlnbm9yZXMKLSAgICAgKiBjYXNlIGFuZCB3aGl0ZXNwYWNlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB0byBhIGhlYWRlciBuYW1lIHdoZW4KLSAgICAgKiBwZXJmb3JtaW5nIHRoZSBtYXRjaCwgYXMgcmVxdWlyZWQgYnkgUkZDIDMwMjguIFRodXMgIkZyb20iLCAiZnJvbSAiLCAiCi0gICAgICogRnJvbSIgYW5kICIgZnJvbSAiIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gTGlzdAotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXIoTWFpbEFkYXB0ZXIgbWFpbCwgU3RyaW5nIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHs7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtYXRjaGVkSGVhZGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMyKTsKLSAgICAgICAgZm9yIChTdHJpbmcgaGVhZGVyTmFtZTogbWFpbC5nZXRIZWFkZXJOYW1lcygpKSB7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLSAgICAgICAgICAgICAgICBtYXRjaGVkSGVhZGVyVmFsdWVzLmFkZEFsbChtYWlsLmdldEhlYWRlcihoZWFkZXJOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoZWRIZWFkZXJWYWx1ZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvU2lldmVNYWlsRXhjZXB0aW9uLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9TaWV2ZU1haWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlOThkNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvbWFpbC9TaWV2ZU1haWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5TaWV2ZU1haWxFeGNlcHRpb248L2NvZGU+IGluZGljYXRlcyBhbiBleGNlcHRpb25hbCBjb25kaXRpb24KLSAqIGVuY291bnRlcmVkIHdoaWxlIHByb2Nlc3NpbmcgU2lldmUgTWFpbC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi1wdWJsaWMgY2xhc3MgU2lldmVNYWlsRXhjZXB0aW9uIGV4dGVuZHMgU2lldmVFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlTWFpbEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVNYWlsRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZU1haWxFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVNYWlsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZU1haWxFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVNYWlsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZU1haWxFeGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlTWFpbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvb3B0aW9uYWwvRW52ZWxvcGVBY2Nlc3NvcnMuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9tYWlsL29wdGlvbmFsL0VudmVsb3BlQWNjZXNzb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzJhNGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL21haWwvb3B0aW9uYWwvRW52ZWxvcGVBY2Nlc3NvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIEVudmVsb3BlQWNjZXNzb3JzIHNwZWNpZmllcyB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgcmVxdWlyZWQgdG8KLSAqIHN1cHBvcnQgdGhlIEVudmVsb3BlIFRlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW52ZWxvcGVBY2Nlc3NvcnMgewotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRFbnZlbG9wZSBhbnN3ZXJzIGEgTGlzdCBvZiBhbGwgb2YgdGhlIGVudmVsb3BlIHZhbHVlcyBpbiB0aGUKLSAgICAgKiByZWNlaXZlciB3aG9zZSBuYW1lIGlzIGVxdWFsIHRvIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gdmFsdWVzIGFyZSBmb3VuZAotICAgICAqIGFuIGVtcHR5IExpc3QgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RW52ZWxvcGUoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0RW52ZWxvcGVOYW1lcyBhbnN3ZXJzIGEgTGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGVudmVsb3BlCi0gICAgICogdmFsdWVzIGluIHRoZSByZWNlaXZlci4gTm8gZHVwbGljYXRlcyBhcmUgYWxsb3dlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RW52ZWxvcGVOYW1lcygpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBNZXRob2QgZ2V0TWF0Y2hpbmdFbnZlbG9wZSBhbnN3ZXJzIGEgTGlzdCBvZiBhbGwgb2YgdGhlIGVudmVsb3BlIHZhbHVlcwotICAgICAqIGluIHRoZSByZWNlaXZlciB3aXRoIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gbWF0Y2hpbmcgbmFtZXMgYXJlIGZvdW5kIGFuCi0gICAgICogZW1wdHkgTGlzdCBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGdldEVudmVsb3BlKFN0cmluZykgaW4gdGhhdCBpdCBpZ25vcmVzIGNhc2UgYW5kCi0gICAgICogdGhlIHdoaXRlc3BhY2UgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIG9mIGFuIGVudmVsb3BlIHZhbHVlIG5hbWUgd2hlbgotICAgICAqIHBlcmZvcm1pbmcgdGhlIG1hdGNoLCBhcyByZXF1aXJlZCBieSBSRkMgMzAyOC4gVGh1cyAiRnJvbSIsICJmcm9tICIsICIKLSAgICAgKiBGcm9tIiBhbmQgIiBmcm9tICIgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBMaXN0Ci0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoaW5nRW52ZWxvcGUoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvU2lldmVOb2RlLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL1NpZXZlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBiZDZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvU2lldmVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNjcmlwdENvb3JkaW5hdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ub2tlbjsKLQotLyoqCi0gKiBDbGFzcyBTaWV2ZU5vZGUgZGVmaW5lcyBhc3BlY3RzIGFsbCBqalRyZWUgcGFyc2Ugbm9kZXMgbWF5IHJlcXVpcmUuCi0gKiAKLSAqIENyZWF0aW9uIERhdGU6IDI3LUphbi0wNAotICovCi1wdWJsaWMgY2xhc3MgU2lldmVOb2RlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZU5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlTm9kZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRva2VuIGZpcnN0VG9rZW47Ci0KLSAgICBwcml2YXRlIFRva2VuIGxhc3RUb2tlbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIGFzc29jaWF0ZWQgdG8gdGhpcyBub2RlIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG5vZGUgb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGZpZWxkVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZmllbGROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmaWVsZE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBmaWVsZFZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlyc3QgdG9rZW4gY29tcHJpc2luZyB0aGlzIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5Ub2tlbjwvY29kZT4sIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIFRva2VuIGdldEZpcnN0VG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBmaXJzdFRva2VuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpcnN0IHRva2VuIGNvbXByaXNpbmcgdGhpcyBub2RlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaXJzdFRva2VuCi0gICAgICogICAgICAgICAgICA8Y29kZT5Ub2tlbjwvY29kZT4sIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rmlyc3RUb2tlbihUb2tlbiBmaXJzdFRva2VuKSB7Ci0gICAgICAgIHRoaXMuZmlyc3RUb2tlbiA9IGZpcnN0VG9rZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGFzdCB0b2tlbiBjb21wcmlzaW5nIHRoaXMgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlRva2VuPC9jb2RlPiwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgVG9rZW4gZ2V0TGFzdFRva2VuKCkgewotICAgICAgICByZXR1cm4gbGFzdFRva2VuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhc3QgdG9rZW4gY29tcHJpc2luZyB0aGlzIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhc3RUb2tlbgotICAgICAqICAgICAgICAgICAgPGNvZGU+VG9rZW48L2NvZGU+LCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhc3RUb2tlbihUb2tlbiBsYXN0VG9rZW4pIHsKLSAgICAgICAgdGhpcy5sYXN0VG9rZW4gPSBsYXN0VG9rZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBub2RlIGluIHRoZSBzY3JpcHQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5TY3JpcHRDb29yZGluYXRlPC9jb2RlPiBjb250YWluaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGlzCi0gICAgICogICAgICAgICBub2RlLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTY3JpcHRDb29yZGluYXRlIGdldENvb3JkaW5hdGUoKSB7Ci0gICAgICAgIGZpbmFsIGludCBsYXN0Q29sdW1uID0gbGFzdFRva2VuLmVuZENvbHVtbjsKLSAgICAgICAgZmluYWwgaW50IGxhc3RMaXN0ID0gbGFzdFRva2VuLmVuZExpbmU7Ci0gICAgICAgIGZpbmFsIGludCBmaXJzdENvbHVtbiA9IGZpcnN0VG9rZW4uYmVnaW5Db2x1bW47Ci0gICAgICAgIGZpbmFsIGludCBmaXJzdExpbmUgPSBmaXJzdFRva2VuLmJlZ2luTGluZTsKLSAgICAgICAgZmluYWwgU2NyaXB0Q29vcmRpbmF0ZSBzY3JpcHRDb29yZGluYXRlID0gbmV3IFNjcmlwdENvb3JkaW5hdGUoCi0gICAgICAgICAgICAgICAgZmlyc3RMaW5lLCBmaXJzdENvbHVtbiwgbGFzdExpc3QsIGxhc3RDb2x1bW4pOwotICAgICAgICByZXR1cm4gc2NyaXB0Q29vcmRpbmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW55IGNvbW1lbnRzIGJldHdlZW4gdGhpcyBub2RlIGFuZCB0aGUgcHJldmlvdXMgb25lLgotICAgICAqIEVhY2ggY29tbWVudCBpcyByZXR1cm5lZCB3aXRob3V0IHdoaXRlc3BhY2UgdHJpbW1pbmcuCi0gICAgICogQ29tbWVudHMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciBvZiBvY2N1cmFuY2UgaW4gdGhlIHNjcmlwdC4KLSAgICAgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncywgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFByZWNlZGluZ0NvbW1lbnRzKCkgewotICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGZpcnN0VG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgVG9rZW4gc3BlY2lhbCA9IGZpcnN0VG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICAgICAgd2hpbGUgKHNwZWNpYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21tZW50ID0gcGFyc2VDb21tZW50KHNwZWNpYWwpOwotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkRmlyc3QoY29tbWVudCk7Ci0gICAgICAgICAgICAgICAgc3BlY2lhbCA9IHNwZWNpYWwuc3BlY2lhbFRva2VuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlQ29tbWVudChUb2tlbiBzcGVjaWFsKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpbWFnZSA9IHNwZWNpYWwuaW1hZ2U7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21tZW50OwotICAgICAgICBpZiAoJyMnID09IGltYWdlLmNoYXJBdCgwKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnRIYW5kQ2hhcmFjdGVyc1RvSWdub3JlOwotICAgICAgICAgICAgaWYgKCdccicgPT0gaW1hZ2UuY2hhckF0KGltYWdlLmxlbmd0aCgpLTIpKSB7Ci0gICAgICAgICAgICAgICAgbGVmdEhhbmRDaGFyYWN0ZXJzVG9JZ25vcmUgPSAyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsZWZ0SGFuZENoYXJhY3RlcnNUb0lnbm9yZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb21tZW50ID0gaW1hZ2Uuc3Vic3RyaW5nKDEsIGltYWdlLmxlbmd0aCgpLWxlZnRIYW5kQ2hhcmFjdGVyc1RvSWdub3JlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbW1lbnQgPSBpbWFnZS5zdWJzdHJpbmcoMiwgaW1hZ2UubGVuZ3RoKCktMik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGFzdCBjb21tZW50IGJlZm9yZSB0aGlzIG5vZGUgYW5kIGFmdGVyIHRoZSBsYXN0IG5vZGUuCi0gICAgICogRWFjaCBjb21tZW50IGlzIHJldHVybmVkIHdpdGhvdXQgd2hpdGVzcGFjZSB0cmltbWluZy4KLSAgICAgKiBDb21tZW50cyBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIG9mIG9jY3VyYW5jZSBpbiB0aGUgc2NyaXB0LgotICAgICAqIEByZXR1cm4gdGhlIGNvbW1lbnQgd2l0aG91dCB3aGl0ZXNwYWNlIHRyaW1taW5nLAotICAgICAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gY29tbWVudCBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBsYXN0IG5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RDb21tZW50KCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0OwotICAgICAgICBpZiAoZmlyc3RUb2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVG9rZW4gc3BlY2lhbCA9IGZpcnN0VG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICAgICAgaWYgKHNwZWNpYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlQ29tbWVudChzcGVjaWFsKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL2FkZHJlc3MvQWRkcmVzc05vZGUuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvYWRkcmVzcy9BZGRyZXNzTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjdlZjEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvYWRkcmVzcy9BZGRyZXNzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuYWRkcmVzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5Ub2tlbjsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NOb2RlIHsKLQotICAgIHB1YmxpYyBUb2tlbiBmaXJzdFRva2VuID0gbnVsbDsKLQotICAgIHB1YmxpYyBUb2tlbiBsYXN0VG9rZW4gPSBudWxsOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL2FkZHJlc3MvQmFzZUFkZHJlc3NMaXN0VmlzaXRvci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3BhcnNlci9hZGRyZXNzL0Jhc2VBZGRyZXNzTGlzdFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkNmNjMS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL2FkZHJlc3MvQmFzZUFkZHJlc3NMaXN0VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuYWRkcmVzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1RhZGRyX3NwZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLkFTVGFkZHJlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLkFTVGFkZHJlc3NfbGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQVNUYW5nbGVfYWRkcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQVNUZG9tYWluOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1Rncm91cF9ib2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1Rsb2NhbF9wYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1RtYWlsYm94OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1RuYW1lX2FkZHI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLkFTVHBocmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQVNUcm91dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLkFkZHJlc3NMaXN0UGFyc2VyVmlzaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuU2ltcGxlTm9kZTsKLQotLyoqCi0gKiBEbyBub3RoaW5nIGltcGxlbWVudGF0aW9uIHN1aXRhYmxhZSBmb3Igc3ViY2xhc3NpbmcuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQWRkcmVzc0xpc3RWaXNpdG9yIGltcGxlbWVudHMKLSAgICAgICAgQWRkcmVzc0xpc3RQYXJzZXJWaXNpdG9yIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGFkZHJlc3NfbGlzdCBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGFkZHJlc3Mgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1RtYWlsYm94IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUbmFtZV9hZGRyIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUZ3JvdXBfYm9keSBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGFuZ2xlX2FkZHIgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Ryb3V0ZSBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVHBocmFzZSBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGFkZHJfc3BlYyBub2RlLCBPYmplY3QgZGF0YSkgewotICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGxvY2FsX3BhcnQgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Rkb21haW4gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3BhcnNlci9hZGRyZXNzL1NpZXZlQWRkcmVzc0J1aWxkZXIuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvYWRkcmVzcy9TaWV2ZUFkZHJlc3NCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGExMzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3BhcnNlci9hZGRyZXNzL1NpZXZlQWRkcmVzc0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5hZGRyZXNzOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIuQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQVNUYWRkcl9zcGVjOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5BU1RhZGRyZXNzX2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLkFTVGRvbWFpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQVNUbG9jYWxfcGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuQWRkcmVzc0xpc3RQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5Ub2tlbjsKLQotLyoqCi0gKiBCdWlsZHMgPGNvZGU+TWFpbEFkYXB0ZXIuQWRkcmVzczwvY29kZT4gZnJvbSBhZGRyZXNzIGxpc3RzLiBOb3RlIHRoYXQKLSAqIGltcGxlbWVudGF0b3JzIG9mIHtAbGluayBNYWlsQWRhcHRlcn0gYXJlIHJlY29tbWVuZGVkIHRvIHVzZSBhIGZ1bGx5IGZlYXR1cmVkCi0gKiBhbmQgbWFpbnRhaW5lZCBwYXJzZXIgc3VjaCBhcyA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9taW1lNGonPkFwYWNoZQotICogTWltZTRKPC9hPi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBNaW1lNEogY29kZSBidXQgaXMgaW50ZW5kZWQgb25seQotICogZm9yIGludGVybmFsIGFuZCBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLiBJdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4KLSAqLwotcHVibGljIGNsYXNzIFNpZXZlQWRkcmVzc0J1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRkcmVzc1tdIEVNUFRZX0FERFJFU1NFUyA9IHt9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsKLQotICAgIHByaXZhdGUgZmluYWwgV29ya2VyIHdvcmtlcjsKLQotICAgIHB1YmxpYyBTaWV2ZUFkZHJlc3NCdWlsZGVyKCkgewotICAgICAgICBhZGRyZXNzZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKG5ldyBBcnJheUxpc3Q8QWRkcmVzcz4oKSk7Ci0gICAgICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGFkZHJlc3NlcyBjdXJyZW50bHkgYWNjdW11bGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGFkZHJlc3Nlcy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYWRkcmVzc2VzIGluIHRoZSBnaXZlbiBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGRyZXNzTGlzdAotICAgICAqICAgICAgICAgICAgUkZDODIyIGFkZHJlc3MgbGlzdAotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBZGRyZXNzZXMoU3RyaW5nIGFkZHJlc3NMaXN0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihhZGRyZXNzTGlzdCk7Ci0gICAgICAgIHdvcmtlci5hZGRBZGRyZXNzc2VzKHJlYWRlciwgYWRkcmVzc2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFkZHJlc3NlcyBjdXJyZW50bHkgYWNjdW11bGF0ZWQgYnkgY2FsbHMgdG8KLSAgICAgKiB7QGxpbmsgI2FkZEFkZHJlc3NlcyhTdHJpbmcpfSBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHtAbGluayAjcmVzZXR9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYWRkcmVzc2VzLCBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzW10gZ2V0QWRkcmVzc2VzKCkgewotICAgICAgICBmaW5hbCBBZGRyZXNzW10gcmVzdWx0cyA9IChBZGRyZXNzW10pIGFkZHJlc3Nlcy50b0FycmF5KEVNUFRZX0FERFJFU1NFUyk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgd29yay4gRmFjdG9yZWQgaW50byBhbiBpbm5lciBjbGFzcyBzbyB0aGF0IHRoZSBidWlsZAotICAgICAqIGludGVyZmFjZSBpcyBjbGVhbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFdvcmtlciBleHRlbmRzIEJhc2VBZGRyZXNzTGlzdFZpc2l0b3IgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFkZHJlc3NzZXMoZmluYWwgUmVhZGVyIHJlYWRlciwgZmluYWwgQ29sbGVjdGlvbiByZXN1bHRzKQotICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBBZGRyZXNzTGlzdFBhcnNlciBwYXJzZXIgPSBuZXcgQWRkcmVzc0xpc3RQYXJzZXIocmVhZGVyKTsKLSAgICAgICAgICAgIEFTVGFkZHJlc3NfbGlzdCByb290ID0gcGFyc2VyLnBhcnNlKCk7Ci0gICAgICAgICAgICByb290LmNoaWxkcmVuQWNjZXB0KHRoaXMsIHJlc3VsdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYWRkcl9zcGVjIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgICAgICBmaW5hbCBBZGRyZXNzQmVhbiBhZGRyZXNzID0gbmV3IEFkZHJlc3NCZWFuKCk7Ci0gICAgICAgICAgICBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGFkZHJlc3MpOwotICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIGRhdGE7Ci0gICAgICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQoYWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoZmluYWwgQVNUZG9tYWluIG5vZGUsIGZpbmFsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFkZHJlc3NCZWFuKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWRkcmVzc0JlYW4gYWRkcmVzcyA9IChBZGRyZXNzQmVhbikgZGF0YTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZG9tYWluID0gY29udGVudHMobm9kZSk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcy5zZXREb21haW4oZG9tYWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCB2aXNpdChBU1Rsb2NhbF9wYXJ0IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFkZHJlc3NCZWFuKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWRkcmVzc0JlYW4gYWRkcmVzcyA9IChBZGRyZXNzQmVhbikgZGF0YTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxQYXJ0ID0gY29udGVudHMobm9kZSk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzcy5zZXRMb2NhbFBhcnQobG9jYWxQYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudHMoQWRkcmVzc05vZGUgbm9kZSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMzIpOwotICAgICAgICAgICAgVG9rZW4gbGFzdCA9IG5vZGUubGFzdFRva2VuOwotICAgICAgICAgICAgVG9rZW4gbmV4dCA9IG5vZGUuZmlyc3RUb2tlbjsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0ICE9IGxhc3QpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5leHQuaW1hZ2UpOwotICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhc3QuaW1hZ2UpOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmVhbiBiYXNlZCBhZGRyZXNzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWRkcmVzc0JlYW4gaW1wbGVtZW50cyBBZGRyZXNzIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxQYXJ0OwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbjsKLQotICAgICAgICBwdWJsaWMgQWRkcmVzc0JlYW4oKSB7Ci0gICAgICAgICAgICBsb2NhbFBhcnQgPSAiIjsKLSAgICAgICAgICAgIGRvbWFpbiA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9tYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKLSAgICAgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxQYXJ0KFN0cmluZyBsb2NhbFBhcnQpIHsKLSAgICAgICAgICAgIHRoaXMubG9jYWxQYXJ0ID0gbG9jYWxQYXJ0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0Fic3RyYWN0Q29tcGF0YXRvclRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9BYnN0cmFjdENvbXBhdGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDZjNTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0Fic3RyYWN0Q29tcGF0YXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkNvbXBhcmF0b3JOYW1lcy5BU0NJSV9DQVNFTUFQX0NPTVBBUkFUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk1hdGNoVHlwZVRhZ3MuQ09OVEFJTlNfVEFHOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5NYXRjaFR5cGVUYWdzLklTX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuTWF0Y2hUeXBlVGFncy5NQVRDSEVTX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWRkcmVzc1BhcnRUYWdzLkFMTF9UQUc7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFkZHJlc3NQYXJ0VGFncy5ET01BSU5fVEFHOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzUGFydFRhZ3MuTE9DQUxQQVJUX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQ29tcGFyYXRvclRhZ3MuQ09NUEFSQVRPUl9UQUc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TdHJpbmdMaXN0QXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGFnQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLlNpZXZlTWFpbEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wYXRhdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb21wYXRhdG9yVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBGcm9tIFJGQyAzMDI4LCBTZWN0aW9uIDUuMS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8Y29kZT4gIAotICAgICAqIFN5bnRheDogYWRkcmVzcyBbQUREUkVTUy1QQVJUXSBbQ09NUEFSQVRPUl0gW01BVENILVRZUEVdCi0gICAgICogICAgICAgICAmbHQ7aGVhZGVyLWxpc3Q6IHN0cmluZy1saXN0Jmd0OyAmbHQ7a2V5LWxpc3Q6IHN0cmluZy1saXN0Jmd0OwotICAgICAqIDwvY29kZT4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHNwZWMuIHRoZW4gZ29lcyBvbiB0byBnaXZlIGFuIGV4YW1wbGUgd2hlcmUgdGhlIG9yZGVyIG9mCi0gICAgICogdGhlIG9wdGlvbmFsIHBhcnRzIGlzIGRpZmZlcmVudCwgc28gSSBhbSBhc3N1bWluZyB0aGF0IHRoZSBvcmRlciBvZiB0aGUKLSAgICAgKiBvcHRpb25hbCBwYXJ0cyBpcyBvcHRpb25hbCB0b28hCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWJzdHJhY3RUZXN0I2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb21wYXJhdG9yID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1hdGNoVHlwZSA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJOYW1lcyA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzID0gbnVsbDsKLQotICAgICAgICBMaXN0SXRlcmF0b3I8QXJndW1lbnQ+IGFyZ3VtZW50c0l0ZXIgPSBhcmd1bWVudHMuZ2V0QXJndW1lbnRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0gICAgICAgIC8vIFRhZyBwcm9jZXNzaW5nCi0gICAgICAgIHdoaWxlICghc3RvcCAmJiBhcmd1bWVudHNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXJndW1lbnQgYXJndW1lbnQgPSBhcmd1bWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFRhZ0FyZ3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhZyA9ICgoVGFnQXJndW1lbnQpIGFyZ3VtZW50KS5nZXRUYWcoKTsKLQotICAgICAgICAgICAgICAgIC8vIFtBRERSRVNTLVBBUlRdPwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGFkZHJlc3NQYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiAodGFnLmVxdWFscyhMT0NBTFBBUlRfVEFHKSB8fCB0YWcuZXF1YWxzKERPTUFJTl9UQUcpIHx8IHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEFMTF9UQUcpKSkKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1BhcnQgPSB0YWc7Ci0gICAgICAgICAgICAgICAgLy8gW0NPTVBBUkFUT1JdPwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bGwgPT0gY29tcGFyYXRvciAmJiB0YWcuZXF1YWxzKENPTVBBUkFUT1JfVEFHKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBTdHJpbmdMaXN0QXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHN0cmluZ0xpc3QgPSAoKFN0cmluZ0xpc3RBcmd1bWVudCkgYXJndW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdMaXN0LnNpemUoKSAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RpbmcgZXhhY3RseSBvbmUgU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvciA9IChTdHJpbmcpIHN0cmluZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbigiRXhwZWN0aW5nIGEgU3RyaW5nTGlzdCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFtNQVRDSC1UWVBFXT8KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsID09IG1hdGNoVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHRhZy5lcXVhbHMoSVNfVEFHKSB8fCB0YWcuZXF1YWxzKENPTlRBSU5TX1RBRykgfHwgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoTUFUQ0hFU19UQUcpKSkKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hUeXBlID0gdGFnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCB1bmV4cGVjdGVkIFRhZ0FyZ3VtZW50Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFN0b3Agd2hlbiBhIG5vbi10YWcgYXJndW1lbnQgaXMgZW5jb3VudGVyZWQKLSAgICAgICAgICAgICAgICBhcmd1bWVudHNJdGVyLnByZXZpb3VzKCk7Ci0gICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudCBNVVNUIGJlIGEgc3RyaW5nLWxpc3Qgb2YgaGVhZGVyIG5hbWVzCi0gICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXJndW1lbnQgYXJndW1lbnQgPSBhcmd1bWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZ0xpc3RBcmd1bWVudCkKLSAgICAgICAgICAgICAgICBoZWFkZXJOYW1lcyA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudCkuZ2V0TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IGhlYWRlck5hbWVzKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGEgU3RyaW5nTGlzdCBvZiBoZWFkZXIgbmFtZXMiKTsKLQotICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudCBNVVNUIGJlIGEgc3RyaW5nLWxpc3Qgb2Yga2V5cwotICAgICAgICBpZiAoYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBTdHJpbmdMaXN0QXJndW1lbnQpCi0gICAgICAgICAgICAgICAga2V5cyA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudCkuZ2V0TGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKG51bGwgPT0ga2V5cykKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBhIFN0cmluZ0xpc3Qgb2Yga2V5cyIpOwotCi0gICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgYXJndW1lbnRzIik7Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoKG1haWwsIChhZGRyZXNzUGFydCA9PSBudWxsID8gQUxMX1RBRyA6IGFkZHJlc3NQYXJ0KSwKLSAgICAgICAgICAgICAgICAoY29tcGFyYXRvciA9PSBudWxsID8gQVNDSUlfQ0FTRU1BUF9DT01QQVJBVE9SIDogY29tcGFyYXRvciksCi0gICAgICAgICAgICAgICAgKG1hdGNoVHlwZSA9PSBudWxsID8gSVNfVEFHIDogbWF0Y2hUeXBlKSwgaGVhZGVyTmFtZXMsIGtleXMsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIGFkZHJlc3NQYXJ0Ci0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiBAcGFyYW0gbWF0Y2hUeXBlCi0gICAgICogQHBhcmFtIGhlYWRlck5hbWVzCi0gICAgICogQHBhcmFtIGtleXMKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2goTWFpbEFkYXB0ZXIgbWFpbCwgU3RyaW5nIGFkZHJlc3NQYXJ0LAotICAgICAgICAgICAgU3RyaW5nIGNvbXBhcmF0b3IsIFN0cmluZyBtYXRjaFR5cGUsIExpc3Q8U3RyaW5nPiBoZWFkZXJOYW1lcywgTGlzdDxTdHJpbmc+IGtleXMsCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBoZWFkZXIgbmFtZXMgbG9va2luZyBmb3IgYSBtYXRjaAotICAgICAgICBib29sZWFuIGlzTWF0Y2hlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lOiBoZWFkZXJOYW1lcykgewotICAgICAgICAgICAgaXNNYXRjaGVkID0gbWF0Y2gobWFpbCwgYWRkcmVzc1BhcnQsIGNvbXBhcmF0b3IsIG1hdGNoVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyTmFtZSwga2V5cywgY29udGV4dCk7IAotICAgICAgICAgICAgaWYgKGlzTWF0Y2hlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIGFkZHJlc3NQYXJ0Ci0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiBAcGFyYW0gbWF0Y2hUeXBlCi0gICAgICogQHBhcmFtIGhlYWRlck5hbWUKLSAgICAgKiBAcGFyYW0ga2V5cwotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgYWRkcmVzc1BhcnQsCi0gICAgICAgICAgICBTdHJpbmcgY29tcGFyYXRvciwgU3RyaW5nIG1hdGNoVHlwZSwgU3RyaW5nIGhlYWRlck5hbWUsIExpc3Q8U3RyaW5nPiBrZXlzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBsb29raW5nIGZvciBhIG1hdGNoCi0gICAgICAgIGJvb2xlYW4gaXNNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGtleTprZXlzKSB7Ci0gICAgICAgICAgICBpc01hdGNoZWQgPSBtYXRjaChtYWlsLCBhZGRyZXNzUGFydCwgY29tcGFyYXRvciwgbWF0Y2hUeXBlLAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lLCBrZXksIGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGlzTWF0Y2hlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIGFkZHJlc3NQYXJ0Ci0gICAgICogQHBhcmFtIGNvbXBhcmF0b3IKLSAgICAgKiBAcGFyYW0gbWF0Y2hUeXBlCi0gICAgICogQHBhcmFtIGhlYWRlck5hbWUKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIG1hdGNoKE1haWxBZGFwdGVyIG1haWwsIFN0cmluZyBhZGRyZXNzUGFydCwKLSAgICAgICAgICAgIFN0cmluZyBjb21wYXJhdG9yLCBTdHJpbmcgbWF0Y2hUeXBlLCBTdHJpbmcgaGVhZGVyTmFtZSwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFic3RyYWN0VGVzdCN2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMsCi0gICAgICogICAgICBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJndW1lbnRzLmhhc1Rlc3RzKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGb3VuZCB1bmV4cGVjdGVkIHRlc3RzIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQWJzdHJhY3RUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQWJzdHJhY3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1M2E5N2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0Fic3RyYWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdCBkZWZpbmVzIGEgZnJhbWV3b3JrIG9mIGNvbW1vbiBiZWhhdmlvciBmb3IgU2lldmUKLSAqIFRlc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXN0IGltcGxlbWVudHMgRXhlY3V0YWJsZVRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0VGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RUZXN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBleGVjdXRlIGV4ZWN1dGVzIGEgYmFzaWMgU2lldmUgVGVzdCBhZnRlciBmaXJzdCBpbnZva2luZyBmcmFtZXdvcmsKLSAgICAgKiBtZXRob2RzIHRvIHZhbGlkYXRlIHRoZSBDb21tYW5kIGFyZ3VtZW50cy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQWxzbywKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkV4ZWN1dGFibGVUZXN0I2V4ZWN1dGUoTWFpbEFkYXB0ZXIsCi0gICAgICogICAgICBBcmd1bWVudHMsIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVCYXNpYyhtYWlsLCBhcmd1bWVudHMsIGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFic3RyYWN0IG1ldGhvZCBleGVjdXRlQmFzaWMgaW52b2tlcyBhIFNpZXZlIFRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNpZXZlQ29udGV4dDwvY29kZT4gZ2l2aW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24sIG5vdAotICAgICAqICAgICAgICAgICAgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIgbWFpbCwKLSAgICAgICAgICAgIEFyZ3VtZW50cyBhcmd1bWVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBGcmFtZXdvcmsgbWV0aG9kIHZhbGlkYXRlQXJndW1lbnRzIGlzIGludm9rZWQgYmVmb3JlIGEgU2lldmUgVGVzdCBpcwotICAgICAqIGV4ZWN1dGVkIHRvIHZhbGlkYXRlIGl0cyBhcmd1bWVudHMuIFN1YmNsYXNzIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvCi0gICAgICogb3ZlcnJpZGUgb3IgZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhlaXIgb3duIHZhbGlkYXRpb24gYXMKLSAgICAgKiBhcHByb3ByaWF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNpZXZlQ29udGV4dDwvY29kZT4gZ2l2aW5nIGNvbW50ZXh0dWFsIGluZm9ybWF0aW9uLAotICAgICAqICAgICAgICAgICAgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAoIWFyZ3VtZW50cy5nZXRBcmd1bWVudExpc3QoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIExvZyBsb2dnZXIgPSBjb250ZXh0LmdldExvZygpOwotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVW5leHBlY3RlZCBhcmd1bWVudHMgZm9yICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5sb2dEaWFnbm9zdGljc0luZm8obG9nZ2VyKTsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhhcmd1bWVudHMpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBjb250ZXh0LmdldENvb3JkaW5hdGUoKQotICAgICAgICAgICAgICAgICAgICAuYWRkU3RhcnRMaW5lQW5kQ29sdW1uKCJGb3VuZCB1bmV4cGVjdGVkIGFyZ3VtZW50cy4iKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQWRkcmVzcy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0FkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjNjhhMC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzUGFydFRhZ3MuRE9NQUlOX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWRkcmVzc1BhcnRUYWdzLkxPQ0FMUEFSVF9UQUc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuQ29tcGFyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5JbnRlcm5ldEFkZHJlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci0KLS8qKgotICogQ2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIHRoZSBBZGRyZXNzcyBUZXN0IGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24KLSAqIDUuMS4KLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3MgZXh0ZW5kcyBBYnN0cmFjdENvbXBhdGF0b3JUZXN0IHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWRkcmVzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkcmVzcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgYWRkcmVzc1BhcnQsCi0gICAgICAgICAgICBTdHJpbmcgY29tcGFyYXRvciwgU3RyaW5nIG1hdGNoVHlwZSwgU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWFpbEFkYXB0ZXIuQWRkcmVzc1tdIGFkZHJlc3NlcyA9IGdldE1hdGNoaW5nVmFsdWVzKG1haWwsCi0gICAgICAgICAgICAgICAgaGVhZGVyTmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBhZGRyZXNzZXMubGVuZ3RoOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGJvb2xlYW4gaXNNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICghaXNNYXRjaGVkICYmIGkgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIGlzTWF0Y2hlZCA9IG1hdGNoKGFkZHJlc3NQYXJ0LCBjb21wYXJhdG9yLCBtYXRjaFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlc1tpKytdLCBrZXksIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYWlsQWRhcHRlci5BZGRyZXNzW10gZ2V0TWF0Y2hpbmdWYWx1ZXMoTWFpbEFkYXB0ZXIgbWFpbCwKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZU5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnRlcm5ldEFkZHJlc3NFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWFpbC5wYXJzZUFkZHJlc3Nlcyh2YWx1ZU5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoKFN0cmluZyBhZGRyZXNzUGFydCwgU3RyaW5nIGNvbXBhcmF0b3IsCi0gICAgICAgICAgICBTdHJpbmcgbWF0Y2hUeXBlLCBNYWlsQWRhcHRlci5BZGRyZXNzIGFkZHJlc3MsIFN0cmluZyBrZXksCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsUGFydCA9IGFkZHJlc3MuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkb21haW4gPSBhZGRyZXNzLmdldERvbWFpbigpOwotCi0gICAgICAgIC8vIEV4dHJhY3QgdGhlIHBhcnQgb2YgdGhlIGFkZHJlc3Mgd2UgYXJlIG1hdGNoaW5nIG9uCi0gICAgICAgIGZpbmFsIFN0cmluZyBtYXRjaEFkZHJlc3M7Ci0gICAgICAgIGlmIChhZGRyZXNzUGFydC5lcXVhbHMoIjphbGwiKSkKLSAgICAgICAgICAgIG1hdGNoQWRkcmVzcyA9IGxvY2FsUGFydCArICJAIiArIGRvbWFpbjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtYXRjaEFkZHJlc3MgPSAoYWRkcmVzc1BhcnQuZXF1YWxzKExPQ0FMUEFSVF9UQUcpID8gbG9jYWxQYXJ0Ci0gICAgICAgICAgICAgICAgICAgIDogZG9tYWluLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG9tYWluIG1hdGNoZXMgTVVTVCBpZ25vcmUgY2FzZSwgb3RoZXJzIHNob3VsZCBub3QKLSAgICAgICAgU3RyaW5nIG1hdGNoS2V5ID0gbnVsbDsKLSAgICAgICAgaWYgKGFkZHJlc3NQYXJ0LmVxdWFscyhET01BSU5fVEFHKSkgewotICAgICAgICAgICAgbWF0Y2hLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hdGNoS2V5ID0ga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF0Y2ggdXNpbmcgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yCi0gICAgICAgIHJldHVybiBDb21wYXJhdG9yVXRpbHMubWF0Y2goY29tcGFyYXRvciwgbWF0Y2hUeXBlLCBtYXRjaEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgbWF0Y2hLZXksIGNvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9BZGRyZXNzUGFydFRhZ3MuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9BZGRyZXNzUGFydFRhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5Y2ZlYy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQWRkcmVzc1BhcnRUYWdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi0vKioKLSAqIEludGVyZmFjZSBBZGRyZXNzUGFydFRhZ3MgZGVmaW5lcyB0aGUgU3RyaW5nIGNvbnN0YW50cyB1c2VkIHRvIHNwZWNpZnkgYW4KLSAqIEFERFJFU1MtUEFSVCB0YWcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRkcmVzc1BhcnRUYWdzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTFBBUlRfVEFHID0gIjpsb2NhbHBhcnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOX1RBRyA9ICI6ZG9tYWluIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9UQUcgPSAiOmFsbCI7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9BbGxPZi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0FsbE9mLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODUxMGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0FsbE9mLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyBBbGxPZiBpbXBsZW1lbnRzIHRoZSBBbGxPZiBUZXN0IGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24gNS4yLgotICovCi1wdWJsaWMgY2xhc3MgQWxsT2YgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFueU9mLgotICAgICAqLwotICAgIHB1YmxpYyBBbGxPZigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFic3RyYWN0VGVzdCNleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIsCi0gICAgICogICAgICBBcmd1bWVudHMsIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gYXJndW1lbnRzLmdldFRlc3RMaXN0KCkuYWxsVGVzdHNQYXNzKG1haWwsIGNvbnRleHQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0FueU9mLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQW55T2YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5YjI3Ny4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQW55T2YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIEFueU9mIGltcGxlbWVudHMgdGhlIEFueU9mIFRlc3QgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiA1LjMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnlPZiBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQW55T2YuCi0gICAgICovCi0gICAgcHVibGljIEFueU9mKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWJzdHJhY3RUZXN0I2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhcmd1bWVudHMuZ2V0VGVzdExpc3QoKS5hbnlUZXN0c1Bhc3MobWFpbCwgY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvQ29tcGFyYXRvclRhZ3MuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9Db21wYXJhdG9yVGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU1ZGFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9Db21wYXJhdG9yVGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0czsKLQotLyoqCi0gKiBJbnRlcmZhY2UgQ29tcGFyYXRvclRhZ3MgZGVmaW5lcyB0aGUgU3RyaW5nIGNvbnN0YW50cyB1c2VkIHRvIHNwZWNpZnkgYQotICogQ09NUEFSQVRPUiB0YWcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGFyYXRvclRhZ3MgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkFUT1JfVEFHID0gIjpjb21wYXJhdG9yIjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9FeGVjdXRhYmxlVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0V4ZWN1dGFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNGI4NGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0V4ZWN1dGFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgRXhlY3V0YWJsZVRlc3QgZGVmaW5lcyB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgZm9yIGEgU2lldmUgVGVzdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeGVjdXRhYmxlVGVzdCB7Ci0gICAgLyoqCi0gICAgICogTWV0aG9kIGV4ZWN1dGUgZXhlY3V0ZXMgYSBUZXN0IGFuZCBhbnN3ZXJzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZQotICAgICAqIHRlc3Qgd2FzIHBhc3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFpbAotICAgICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgPGNvZGU+U2lldmVDb250ZXh0PC9jb2RlPiBnaXZpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbiwgbm90Ci0gICAgICogICAgICAgICAgICBudWxsCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9FeGlzdHMuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9FeGlzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzOGI1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvRXhpc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlN0cmluZ0xpc3RBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyBFeGlzdHMgaW1wbGVtZW50cyB0aGUgRXhpc3RzIFRlc3QgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiA1LjUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGlzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEV4aXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhpc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWJzdHJhY3RUZXN0I2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50TGlzdCA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFyZ3VtZW50TGlzdCgpLmdldCgwKSkuZ2V0TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGFyZzphcmd1bWVudExpc3QpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJzID0gbWFpbC5nZXRNYXRjaGluZ0hlYWRlcihhcmcpOwotICAgICAgICAgICAgZm91bmQgPSBmb3VuZCAmJiAhaGVhZGVycy5pc0VtcHR5KCk7Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWJzdHJhY3RUZXN0I3ZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cywKLSAgICAgKiAgICAgIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJndW1lbnRzLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QXJndW1lbnQ+IGFyZ3VtZW50c0xpc3QgPSBhcmd1bWVudHMuZ2V0QXJndW1lbnRMaXN0KCk7Ci0gICAgICAgIGlmICgxICE9IGFyZ3VtZW50c0xpc3Quc2l6ZSgpKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGV4YWN0bHkgb25lIGFyZ3VtZW50Iik7Ci0KLSAgICAgICAgaWYgKCEoYXJndW1lbnRzTGlzdC5nZXQoMCkgaW5zdGFuY2VvZiBTdHJpbmdMaXN0QXJndW1lbnQpKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGEgU3RyaW5nTGlzdCIpOwotCi0gICAgICAgIGlmIChhcmd1bWVudHMuaGFzVGVzdHMoKSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgdGVzdHMiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9GYWxzZS5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0ZhbHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTFhNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0ZhbHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIEZhbHNlIGltcGxlbWVudHMgdGhlIEZhbHNlIFRlc3QgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwgc2VjdGlvbiA1LjYuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWxzZSBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIEZhbHNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWJzdHJhY3RUZXN0I2V4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciwKLSAgICAgKiAgICAgIEFyZ3VtZW50cywgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0hlYWRlci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL0hlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTRmMmM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9IZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkNvbXBhcmF0b3JOYW1lcy5BU0NJSV9DQVNFTUFQX0NPTVBBUkFUT1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk1hdGNoVHlwZVRhZ3MuQ09OVEFJTlNfVEFHOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5NYXRjaFR5cGVUYWdzLklTX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuTWF0Y2hUeXBlVGFncy5NQVRDSEVTX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQ29tcGFyYXRvclRhZ3MuQ09NUEFSQVRPUl9UQUc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TdHJpbmdMaXN0QXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGFnQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuQ29tcGFyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIEhlYWRlciBpbXBsZW1lbnRzIHRoZSBIZWFkZXIgVGVzdCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LCBzZWN0aW9uIDUuNy4KLSAqLwotcHVibGljIGNsYXNzIEhlYWRlciBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBIZWFkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRnJvbSBSRkMgMzAyOCwgU2VjdGlvbiA1LjcuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPGNvZGU+ICAKLSAgICAgKiBTeW50YXg6IGhlYWRlciBbQ09NUEFSQVRPUl0gW01BVENILVRZUEVdCi0gICAgICogICAgICAgJmx0O2hlYWRlci1uYW1lczogc3RyaW5nLWxpc3QmZ3Q7ICZsdDtrZXktbGlzdDogc3RyaW5nLWxpc3QmZ3Q7Ci0gICAgICogPC9jb2RlPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgc3BlYy4gdGhlbiBnb2VzIG9uIHRvIGdpdmUgYW4gZXhhbXBsZSB3aGVyZSB0aGUgb3JkZXIgb2YKLSAgICAgKiB0aGUgb3B0aW9uYWwgcGFydHMgaXMgZGlmZmVyZW50LCBzbyBJIGd1ZXNzIHRoYXQgdGhlIG9yZGVyIGlzIG9wdGlvbmFsCi0gICAgICogdG9vIQotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFic3RyYWN0VGVzdCNleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIsCi0gICAgICogICAgICBBcmd1bWVudHMsIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQmFzaWMoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29tcGFyYXRvciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBtYXRjaFR5cGUgPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyTmFtZXMgPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4ga2V5cyA9IG51bGw7Ci0KLSAgICAgICAgTGlzdEl0ZXJhdG9yPEFyZ3VtZW50PiBhcmd1bWVudHNJdGVyID0gYXJndW1lbnRzLmdldEFyZ3VtZW50TGlzdCgpLmxpc3RJdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIHN0b3AgPSBmYWxzZTsKLQotICAgICAgICAvLyBUYWcgcHJvY2Vzc2luZwotICAgICAgICB3aGlsZSAoIXN0b3AgJiYgYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBUYWdBcmd1bWVudCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YWcgPSAoKFRhZ0FyZ3VtZW50KSBhcmd1bWVudCkuZ2V0VGFnKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjb21wYXJhdG9yICYmIHRhZy5lcXVhbHMoQ09NUEFSQVRPUl9UQUcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXh0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmdsaXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBhcmd1bWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZ0xpc3RBcmd1bWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0ID0gKChTdHJpbmdMaXN0QXJndW1lbnQpIGFyZ3VtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nTGlzdC5zaXplKCkgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RpbmcgZXhhY3RseSBvbmUgU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvciA9IHN0cmluZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBhIFN0cmluZ0xpc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBbTUFUQ0gtVFlQRV0/Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobnVsbCA9PSBtYXRjaFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICh0YWcuZXF1YWxzKElTX1RBRykgfHwgdGFnLmVxdWFscyhDT05UQUlOU19UQUcpIHx8IHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKE1BVENIRVNfVEFHKSkpCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoVHlwZSA9IHRhZzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgdW5leHBlY3RlZCBUYWdBcmd1bWVudDogXCIiICsgdGFnICsgIlwiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFN0b3Agd2hlbiBhIG5vbi10YWcgYXJndW1lbnQgaXMgZW5jb3VudGVyZWQKLSAgICAgICAgICAgICAgICBhcmd1bWVudHNJdGVyLnByZXZpb3VzKCk7Ci0gICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgbmV4dCBhcmd1bWVudCBNVVNUIGJlIGEgc3RyaW5nLWxpc3Qgb2YgaGVhZGVyIG5hbWVzCi0gICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmluYWwgQXJndW1lbnQgYXJndW1lbnQgPSBhcmd1bWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZ0xpc3RBcmd1bWVudCkKLSAgICAgICAgICAgICAgICBoZWFkZXJOYW1lcyA9ICgoU3RyaW5nTGlzdEFyZ3VtZW50KSBhcmd1bWVudCkuZ2V0TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IGhlYWRlck5hbWVzKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIGEgU3RyaW5nTGlzdG9mIGhlYWRlciBuYW1lcyIpOwotCi0gICAgICAgIC8vIFRoZSBuZXh0IGFyZ3VtZW50IE1VU1QgYmUgYSBzdHJpbmctbGlzdCBvZiBrZXlzCi0gICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmluYWwgQXJndW1lbnQgYXJndW1lbnQgPSBhcmd1bWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZ0xpc3RBcmd1bWVudCkKLSAgICAgICAgICAgICAgICBrZXlzID0gKChTdHJpbmdMaXN0QXJndW1lbnQpIGFyZ3VtZW50KS5nZXRMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgPT0ga2V5cykKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBhIFN0cmluZ0xpc3Qgb2Yga2V5cyIpOwotCi0gICAgICAgIGlmIChhcmd1bWVudHNJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQuZ2V0Q29vcmRpbmF0ZSgpLnN5bnRheEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHVuZXhwZWN0ZWQgYXJndW1lbnRzIik7Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoKG1haWwsIChjb21wYXJhdG9yID09IG51bGwgPyBBU0NJSV9DQVNFTUFQX0NPTVBBUkFUT1IKLSAgICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IpLCAobWF0Y2hUeXBlID09IG51bGwgPyBJU19UQUcgOiBtYXRjaFR5cGUpLAotICAgICAgICAgICAgICAgIGhlYWRlck5hbWVzLCBrZXlzLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbWF0Y2guCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvcgotICAgICAqIEBwYXJhbSBtYXRjaFR5cGUKLSAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZXMKLSAgICAgKiBAcGFyYW0ga2V5cwotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoKE1haWxBZGFwdGVyIG1haWwsIFN0cmluZyBjb21wYXJhdG9yLAotICAgICAgICAgICAgU3RyaW5nIG1hdGNoVHlwZSwgTGlzdDxTdHJpbmc+IGhlYWRlck5hbWVzLCBMaXN0PFN0cmluZz4ga2V5cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGhlYWRlciBuYW1lcyBsb29raW5nIGZvciBhIG1hdGNoCi0gICAgICAgIGJvb2xlYW4gaXNNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIEl0ZXJhdG9yIGhlYWRlck5hbWVzSXRlciA9IGhlYWRlck5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlICghaXNNYXRjaGVkICYmIGhlYWRlck5hbWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlzTWF0Y2hlZCA9IG1hdGNoKGNvbXBhcmF0b3IsIG1hdGNoVHlwZSwgbWFpbAotICAgICAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hpbmdIZWFkZXIoKFN0cmluZykgaGVhZGVyTmFtZXNJdGVyLm5leHQoKSksIGtleXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogQHBhcmFtIG1hdGNoVHlwZQotICAgICAqIEBwYXJhbSBoZWFkZXJWYWx1ZXMKLSAgICAgKiBAcGFyYW0ga2V5cwotICAgICAqIEBwYXJhbSBjb250ZXh0IG5vdCBudWxsCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoKFN0cmluZyBjb21wYXJhdG9yLCBTdHJpbmcgbWF0Y2hUeXBlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclZhbHVlcywgTGlzdDxTdHJpbmc+IGtleXMsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2YWx1ZXMKLSAgICAgICAgLy8gSWYgdGhlIG1hdGNoVHlwZSBpcyA6Y29udGFpbnMKLSAgICAgICAgLy8gYWRkIHRoZSBoZWFkZXJWYWx1ZSBvZiBhIG51bGwgc3RyaW5nCi0gICAgICAgIC8vIGVsc2UKLSAgICAgICAgLy8gbm90IG1hdGNoZWQKLSAgICAgICAgaWYgKGhlYWRlclZhbHVlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICBpZiAobWF0Y2hUeXBlLmVxdWFscyhDT05UQUlOU19UQUcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVhZGVyIHZhbHVlcyBtYXkgYmUgaW1tdXRhYmxlCi0gICAgICAgICAgICAgICAgaGVhZGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGhlYWRlclZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyVmFsdWVzLmFkZCgiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBoZWFkZXIgdmFsdWVzIGxvb2tpbmcgZm9yIGEgbWF0Y2gKLSAgICAgICAgYm9vbGVhbiBpc01hdGNoZWQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaGVhZGVyVmFsdWVzSXRlciA9IGhlYWRlclZhbHVlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoIWlzTWF0Y2hlZCAmJiBoZWFkZXJWYWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgaXNNYXRjaGVkID0gbWF0Y2goY29tcGFyYXRvciwgbWF0Y2hUeXBlLCAoU3RyaW5nKSBoZWFkZXJWYWx1ZXNJdGVyCi0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCksIGtleXMsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogQHBhcmFtIG1hdGNoVHlwZQotICAgICAqIEBwYXJhbSBoZWFkZXJWYWx1ZQotICAgICAqIEBwYXJhbSBrZXlzCi0gICAgICogQHBhcmFtIGNvbnRleHQgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2goU3RyaW5nIGNvbXBhcmF0b3IsIFN0cmluZyBtYXRjaFR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUsIExpc3Q8U3RyaW5nPiBrZXlzLCBTaWV2ZUNvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBsb29raW5nIGZvciBhIG1hdGNoCi0gICAgICAgIGJvb2xlYW4gaXNNYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGtleToga2V5cykgewotICAgICAgICAgICAgaXNNYXRjaGVkID0gQ29tcGFyYXRvclV0aWxzLm1hdGNoKGNvbXBhcmF0b3IsIG1hdGNoVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyVmFsdWUsIGtleSwgY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaXNNYXRjaGVkKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFic3RyYWN0VGVzdCN2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMsCi0gICAgICogICAgICBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzIGFyZ3VtZW50cywgU2lldmVDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJndW1lbnRzLmhhc1Rlc3RzKCkpCi0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGb3VuZCB1bmV4cGVjdGVkIHRlc3RzIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvTm90LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvTm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzg4MTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL05vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5UZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIE5vdCBpbXBsZW1lbnRzIHRoZSBOb3QgVGVzdCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LCBzZWN0aW9uIDUuOC4KLSAqLwotcHVibGljIGNsYXNzIE5vdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTm90LgotICAgICAqLwotICAgIHB1YmxpYyBOb3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BYnN0cmFjdFRlc3QjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgICAgICBMaXN0PFRlc3Q+IHRlc3RzID0gYXJndW1lbnRzLmdldFRlc3RMaXN0KCkuZ2V0VGVzdHMoKTsKLSAgICAgICAgaWYgKHRlc3RzLnNpemUoKSAhPSAxKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiRXhhY3RseSAxIHRlc3QgcGVybWl0dGVkLiBGb3VuZCAiKS5hcHBlbmQodGVzdHMuc2l6ZSgpKSk7Ci0gICAgICAgIGZvciAoVGVzdCB0ZXN0OiB0ZXN0cykgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRlc3QuaXNUZXN0UGFzc2VkKG1haWwsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL1NpemUuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9TaXplLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTkyMTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzL1NpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5OdW1iZXJBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGFnQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLlNpZXZlTWFpbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBTaXplIGltcGxlbWVudHMgdGhlIFNpemUgVGVzdCBhcyBkZWZpbmVkIGluIFJGQyAzMDI4LCBzZWN0aW9uIDUuOS4KLSAqLwotcHVibGljIGNsYXNzIFNpemUgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpemUuCi0gICAgICovCi0gICAgcHVibGljIFNpemUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BYnN0cmFjdFRlc3QjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBTaWV2ZUNvbnRleHQpCi0gICAgICogICAgICA8cD4KLSAgICAgKiAgICAgIEZyb20gUkZDIDMwMjgsIFNlY3Rpb24gNS45Li4uCi0gICAgICogICAgICA8L3A+Ci0gICAgICogICAgICA8Y29kZT4gIAotICAgICAqICAgIFN5bnRheDogc2l6ZSAmbHQ7JnF1b3RlOzpvdmVyIiZxdW90ZTsgLyAmcXVvdGU7OnVuZGVyJnF1b3RlOyZndDsgJmx0O2xpbWl0OiBudW1iZXImZ3Q7Ci0gICAgICogPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJndW1lbnRzLAotICAgICAgICAgICAgU2lldmVDb250ZXh0IGNvbnRleHQpIHRocm93cyBTeW50YXhFeGNlcHRpb24sIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb21wYXJhdG9yID0gbnVsbDsKLSAgICAgICAgSW50ZWdlciBzaXplID0gbnVsbDsKLSAgICAgICAgTGlzdEl0ZXJhdG9yPEFyZ3VtZW50PiBhcmd1bWVudHNJdGVyID0gYXJndW1lbnRzLmdldEFyZ3VtZW50TGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCi0gICAgICAgIC8vIEZpcnN0IGFyZ3VtZW50IE1VU1QgYmUgYSB0YWcgb2YgIjp1bmRlciIgb3IgIjpvdmVyIgotICAgICAgICBpZiAoYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBUYWdBcmd1bWVudCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YWcgPSAoKFRhZ0FyZ3VtZW50KSBhcmd1bWVudCkuZ2V0VGFnKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhZy5lcXVhbHMoIjp1bmRlciIpIHx8IHRhZy5lcXVhbHMoIjpvdmVyIikpCi0gICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IgPSB0YWc7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmdldENvb3JkaW5hdGUoKS5zeW50YXhFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIkZvdW5kIHVuZXhwZWN0ZWQgVGFnQXJndW1lbnQ6IFwiIikuYXBwZW5kKHRhZykuYXBwZW5kKCJcIiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCA9PSBjb21wYXJhdG9yKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKCJFeHBlY3RpbmcgYSBUYWciKTsKLQotICAgICAgICAvLyBTZWNvbmQgYXJndW1lbnQgTVVTVCBiZSBhIG51bWJlcgotICAgICAgICBpZiAoYXJndW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEFyZ3VtZW50IGFyZ3VtZW50ID0gYXJndW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBOdW1iZXJBcmd1bWVudCkKLSAgICAgICAgICAgICAgICBzaXplID0gKChOdW1iZXJBcmd1bWVudCkgYXJndW1lbnQpLmdldEludGVnZXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCA9PSBzaXplKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKCJFeHBlY3RpbmcgYSBOdW1iZXIiKTsKLQotICAgICAgICAvLyBUaGVyZSBNVVNUIE5PVCBiZSBhbnkgZnVydGhlciBhcmd1bWVudHMKLSAgICAgICAgaWYgKGFyZ3VtZW50c0l0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5nZXRDb29yZGluYXRlKCkuc3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRm91bmQgdW5leHBlY3RlZCBhcmd1bWVudChzKSIpOwotCi0gICAgICAgIHJldHVybiB0ZXN0KG1haWwsIGNvbXBhcmF0b3IsIHNpemUuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRlc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvcgotICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0KE1haWxBZGFwdGVyIG1haWwsIFN0cmluZyBjb21wYXJhdG9yLCBpbnQgc2l6ZSkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBpZiAoY29tcGFyYXRvci5lcXVhbHMoIjpvdmVyIikpCi0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0ZXN0T3ZlcihtYWlsLCBzaXplKTsKLSAgICAgICAgZWxzZSBpZiAoY29tcGFyYXRvci5lcXVhbHMoIjp1bmRlciIpKQotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdGVzdFVuZGVyKG1haWwsIHNpemUpOwotICAgICAgICByZXR1cm4gaXNUZXN0UGFzc2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0ZXN0VW5kZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcGFyYW0gc2l6ZQotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdGVzdFVuZGVyKE1haWxBZGFwdGVyIG1haWwsIGludCBzaXplKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWlsLmdldFNpemUoKSA8IHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRlc3RPdmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIHNpemUKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHRlc3RPdmVyKE1haWxBZGFwdGVyIG1haWwsIGludCBzaXplKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYWlsLmdldFNpemUoKSA+IHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BYnN0cmFjdFRlc3QjdmFsaWRhdGVBcmd1bWVudHMoQXJndW1lbnRzLAotICAgICAqICAgICAgU2lldmVDb250ZXh0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXJndW1lbnRzKEFyZ3VtZW50cyBhcmd1bWVudHMsIFNpZXZlQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQWxsIGRvbmUgaW4gZXhlY3V0ZUJhc2ljKCkKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9UcnVlLmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvVHJ1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQyYjUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9UcnVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIFRydWUgaW1wbGVtZW50cyB0aGUgVHJ1ZSBUZXN0IGFzIGRlZmluZWQgaW4gUkZDIDMwMjgsIHNlY3Rpb24gNS4xMC4KLSAqLwotcHVibGljIGNsYXNzIFRydWUgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRydWUuCi0gICAgICovCi0gICAgcHVibGljIFRydWUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BYnN0cmFjdFRlc3QjZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyLAotICAgICAqICAgICAgQXJndW1lbnRzLCBTaWV2ZUNvbnRleHQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUJhc2ljKE1haWxBZGFwdGVyIG1haWwsIEFyZ3VtZW50cyBhcmd1bWVudHMsCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9vcHRpb25hbC9Cb2R5LmphdmEgYi90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvb3B0aW9uYWwvQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk5Y2M3Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9vcHRpb25hbC9Cb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLm9wdGlvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlN0cmluZ0xpc3RBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5UYWdBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuU2lldmVNYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFic3RyYWN0VGVzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBib2R5IGV4dGVuc2lvbiBkZWZpbmVkIGluCi0gKiA8YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MTczJz5SRkM1MTczPC9hPi4KLSAqLwotcHVibGljIGNsYXNzIEJvZHkgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotICAgIHByaXZhdGUgU3RyaW5nTGlzdEFyZ3VtZW50IHN0cmluZ3M7Ci0KLSAgICBwdWJsaWMgQm9keSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc3RyaW5ncyA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogQ2hlY2sgaG93IGNvbXBsZXRlIHRoaXMgaXMgb2YgdGhlIGJvZHkgc3BlY2lmaWNhdGlvbgotICAgIC8vIFZhbGlkYXRlIChzb3J0YSk7IHdlJ3JlIG9ubHkgaW1wbGVtZW50aW5nIHBhcnQgb2YgdGhlIHNwZWMKLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFyZ3VtZW50cyhBcmd1bWVudHMgYXJncywgU2lldmVDb250ZXh0IGN0eCkKLSAgICAgICAgICAgIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBcmd1bWVudD4gYXJnbGlzdCA9IGFyZ3MuZ2V0QXJndW1lbnRMaXN0KCk7Ci0gICAgICAgIGlmIChhcmdsaXN0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5IGJvZHktdGVzdCBjYW4gb25seSB0d28gYXJndW1lbnRzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBGSVhNRTogQXMgdGhpcyBpcyBhIGxpbWl0ZWQgaW1wbGVtZW50YXRpb24gZm9yY2UgdGhlIHVzZSBvZgotICAgICAgICAvLyAnOmNvbnRhaW5zJy4KLSAgICAgICAgQXJndW1lbnQgYXJnID0gYXJnbGlzdC5nZXQoMCk7Ci0gICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIFRhZ0FyZ3VtZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbigiQm9keSBleHBlY3RzIGEgOmNvbnRhaW5zIHRhZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoKFRhZ0FyZ3VtZW50KSBhcmcpLmdldFRhZygpLmVxdWFscygiOmNvbnRhaW5zIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oIkJvZHkgZXhwZWN0cyBhIDpjb250YWlucyB0YWciKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCBsaXN0IG9mIHN0cmluZ3MgdG8gc2VhcmNoIGZvcgotICAgICAgICBhcmcgPSBhcmdsaXN0LmdldCgxKTsKLSAgICAgICAgaWYgKCEoYXJnIGluc3RhbmNlb2YgU3RyaW5nTGlzdEFyZ3VtZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbigiQm9keSBleHBlY3RzIGEgbGlzdCBvZiBzdHJpbmdzIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5ncyA9IChTdHJpbmdMaXN0QXJndW1lbnQpIGFyZ3MuZ2V0QXJndW1lbnRMaXN0KCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8vIFRoaXMgaW1wbGVtZW50IGJvZHkgdGVzdHMgb2YgdGhlIGZvcm0KLSAgICAvLyAiYm9keSA6Y29udGFpbnMgWydzdHJpbmcnICdzdHJpbmcnIC4uLi5dIgotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVCYXNpYyhNYWlsQWRhcHRlciBtYWlsLCBBcmd1bWVudHMgYXJncywKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjdHgpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gZmV0Y2ggY29udGVudCBhcyBhIHN0cmluZy4gSWYgd2UgY2FuJ3QgZG8gdGhpcyBpdCdzCi0gICAgICAgIC8vIG5vdCBhIG1lc3NhZ2Ugd2UgY2FuIGhhbmRsZS4KLSAgICAgICAgaWYgKG1haWwuZ2V0Q29udGVudFR5cGUoKS5pbmRleE9mKCJ0ZXh0LyIpICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oIk1lc3NhZ2UgaXMgbm90IG9mIHR5cGUgJ3RleHQnIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb21wYXJlIGVhY2ggdGVzdCBzdHJpbmcgd2l0aCBib2R5LCBpZ25vcmluZyBjYXNlCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBocmFzZTpzdHJpbmdzLmdldExpc3QoKSkgewotICAgICAgICAgICAgaWYgKG1haWwuaXNJbkJvZHlUZXh0KHBocmFzZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHMvb3B0aW9uYWwvRW52ZWxvcGUuamF2YSBiL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9vcHRpb25hbC9FbnZlbG9wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjlkMjM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS90ZXN0cy9vcHRpb25hbC9FbnZlbG9wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudGVzdHMub3B0aW9uYWw7Ci0KLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzUGFydFRhZ3MuRE9NQUlOX1RBRzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQWRkcmVzc1BhcnRUYWdzLkxPQ0FMUEFSVF9UQUc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5Db21wYXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29yczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BYnN0cmFjdENvbXBhdGF0b3JUZXN0OwotCi0vKioKLSAqIENsYXNzIEVudmVsb3BlIGltcGxlbWVudHMgdGhlIG9wdGlvbmFsIEVudmVsb3BlIFRlc3QgYXMgZGVmaW5lZCBpbiBSRkMgMzAyOCwKLSAqIHNlY3Rpb24gNS40LgotICovCi1wdWJsaWMgY2xhc3MgRW52ZWxvcGUgZXh0ZW5kcyBBYnN0cmFjdENvbXBhdGF0b3JUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBFbnZlbG9wZUFjY2Vzc29ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW52ZWxvcGUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRNYXRjaGluZ1ZhbHVlcyhNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgdmFsdWVOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoKEVudmVsb3BlQWNjZXNzb3JzKSBtYWlsKS5nZXRNYXRjaGluZ0VudmVsb3BlKHZhbHVlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIG1hdGNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhZGRyZXNzUGFydAotICAgICAqIEBwYXJhbSBjb21wYXJhdG9yCi0gICAgICogQHBhcmFtIG1hdGNoVHlwZQotICAgICAqIEBwYXJhbSBoZWFkZXJWYWx1ZQotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gY29udGV4dCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2goU3RyaW5nIGFkZHJlc3NQYXJ0LCBTdHJpbmcgY29tcGFyYXRvciwKLSAgICAgICAgICAgIFN0cmluZyBtYXRjaFR5cGUsIFN0cmluZyBoZWFkZXJWYWx1ZSwgU3RyaW5nIGtleSwKLSAgICAgICAgICAgIFNpZXZlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEV4dHJhY3QgdGhlIHBhcnQgb2YgdGhlIGFkZHJlc3Mgd2UgYXJlIG1hdGNoaW5nIG9uCi0gICAgICAgIFN0cmluZyBtYXRjaEFkZHJlc3MgPSBudWxsOwotICAgICAgICBpZiAoYWRkcmVzc1BhcnQuZXF1YWxzKCI6YWxsIikpCi0gICAgICAgICAgICBtYXRjaEFkZHJlc3MgPSBoZWFkZXJWYWx1ZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgbG9jYWxTdGFydCA9IDA7Ci0gICAgICAgICAgICBpbnQgbG9jYWxFbmQgPSAwOwotICAgICAgICAgICAgaW50IGRvbWFpblN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludCBkb21haW5FbmQgPSBoZWFkZXJWYWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBzcGxpdEluZGV4ID0gaGVhZGVyVmFsdWUuaW5kZXhPZignQCcpOwotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZG9tYWluIHBhcnQgKC0xKSwgdHJlYXQgaXQgYXMgYW4gZW1wdHkgU3RyaW5nCi0gICAgICAgICAgICBpZiAoc3BsaXRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGxvY2FsRW5kID0gZG9tYWluRW5kOwotICAgICAgICAgICAgICAgIGRvbWFpblN0YXJ0ID0gZG9tYWluRW5kOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbEVuZCA9IHNwbGl0SW5kZXg7Ci0gICAgICAgICAgICAgICAgZG9tYWluU3RhcnQgPSBzcGxpdEluZGV4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hdGNoQWRkcmVzcyA9IChhZGRyZXNzUGFydC5lcXVhbHMoTE9DQUxQQVJUX1RBRykgPyBoZWFkZXJWYWx1ZQotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGxvY2FsU3RhcnQsIGxvY2FsRW5kKSA6IGhlYWRlclZhbHVlLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgZG9tYWluU3RhcnQsIGRvbWFpbkVuZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG9tYWluIG1hdGNoZXMgTVVTVCBpZ25vcmUgY2FzZSwgb3RoZXJzIHNob3VsZCBub3QKLSAgICAgICAgU3RyaW5nIG1hdGNoS2V5ID0gbnVsbDsKLSAgICAgICAgaWYgKGFkZHJlc3NQYXJ0LmVxdWFscyhET01BSU5fVEFHKSkgewotICAgICAgICAgICAgbWF0Y2hLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIG1hdGNoQWRkcmVzcyA9IG1hdGNoQWRkcmVzcy50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1hdGNoS2V5ID0ga2V5OwotCi0gICAgICAgIC8vIE1hdGNoIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvcgotICAgICAgICByZXR1cm4gQ29tcGFyYXRvclV0aWxzLm1hdGNoKGNvbXBhcmF0b3IsIG1hdGNoVHlwZSwgbWF0Y2hBZGRyZXNzLAotICAgICAgICAgICAgICAgIG1hdGNoS2V5LCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgYWRkcmVzc1BhcnQsCi0gICAgICAgICAgICBTdHJpbmcgY29tcGFyYXRvciwgU3RyaW5nIG1hdGNoVHlwZSwgU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGhlYWRlclZhbHVlcyA9IGdldE1hdGNoaW5nVmFsdWVzKG1haWwsIGhlYWRlck5hbWUpOwotICAgICAgICBib29sZWFuIGlzTWF0Y2hlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZTpoZWFkZXJWYWx1ZXMpIHsKLSAgICAgICAgICAgIGlzTWF0Y2hlZCA9IG1hdGNoKGFkZHJlc3NQYXJ0LCBjb21wYXJhdG9yLCBtYXRjaFR5cGUsIHZhbHVlLCBrZXksIGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGlzTWF0Y2hlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc01hdGNoZWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2pqdHJlZS9hZGRyZXNzL0FkZHJlc3NMaXN0UGFyc2VyLmpqdCBiL3RydW5rL21haW4vc3JjL21haW4vamp0cmVlL2FkZHJlc3MvQWRkcmVzc0xpc3RQYXJzZXIuamp0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NjZjBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vamp0cmVlL2FkZHJlc3MvQWRkcmVzc0xpc3RQYXJzZXIuamp0CisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqCi0gKiBSRkMyODIyIGFkZHJlc3MgbGlzdCBwYXJzZXIuCi0gKgotICogQ3JlYXRlZCA5LzE3LzIwMDQKLSAqIGJ5IEpvZSBDaGVuZyA8Y29kZUBqb2VjaGVuZy5jb20+Ci0gKi8KLQotb3B0aW9ucyB7Ci0gICAgU1RBVElDPWZhbHNlOwotICAgIExPT0tBSEVBRD0xOwotICAgIFZJU0lUT1I9dHJ1ZTsKLSAgICBNVUxUST10cnVlOwotICAgIE5PREVfU0NPUEVfSE9PSz10cnVlOwotICAgIE5PREVfRVhURU5EUz0ib3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmFkZHJlc3MuQWRkcmVzc05vZGUiOyAKLSAgICBPVVRQVVRfRElSRUNUT1JZPSIuL29yZy9hcGFjaGUvanNpZXZlL3BhcnNlci9nZW5lcmF0ZWQvYWRkcmVzcyI7Ci0gICAgLy9ERUJVR19QQVJTRVI9dHJ1ZTsKLSAgICAvL0RFQlVHX1RPS0VOX01BTkFHRVI9dHJ1ZTsKLSAgICBKREtfVkVSU0lPTj0iMS41IjsKLX0KLQotUEFSU0VSX0JFR0lOKEFkZHJlc3NMaXN0UGFyc2VyKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0xpc3RQYXJzZXIgeyAgICAKLQotICAgIHB1YmxpYyBBU1RhZGRyZXNzX2xpc3QgcGFyc2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VBbGwoKTsKLSAgICAgICAgICAgIHJldHVybiAoQVNUYWRkcmVzc19saXN0KWpqdHJlZS5yb290Tm9kZSgpOwotICAgICAgICB9IGNhdGNoIChUb2tlbk1nckVycm9yIHRtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHRtZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pIHsKLSAgICAgICAgKChTaW1wbGVOb2RlKW4pLmZpcnN0VG9rZW4gPSBnZXRUb2tlbigxKTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pIHsKLSAgICAgICAgKChTaW1wbGVOb2RlKW4pLmxhc3RUb2tlbiA9IGdldFRva2VuKDApOwotICAgIH0KLX0KLQotUEFSU0VSX0VORChBZGRyZXNzTGlzdFBhcnNlcikKLQotdm9pZCBwYXJzZUxpbmUoKSAjdm9pZCA6Ci17fQotewotICAgIGFkZHJlc3NfbGlzdCgpIFsiXHIiXSAiXG4iCi19Ci0KLXZvaWQgcGFyc2VBbGwoKSAjdm9pZCA6Ci17fQotewotICAgIGFkZHJlc3NfbGlzdCgpIDxFT0Y+Ci19Ci0KLXZvaWQgYWRkcmVzc19saXN0KCkgOgote30KLXsKLSAgICBbIGFkZHJlc3MoKSBdCi0gICAgKAotICAgICAgICAiLCIKLSAgICAgICAgWyBhZGRyZXNzKCkgXQotICAgICkqCi19Ci0KLXZvaWQgYWRkcmVzcygpIDoKLXt9Ci17Ci0gICAgTE9PS0FIRUFEKDIxNDc0ODM2NDcpCi0gICAgYWRkcl9zcGVjKCkKLXwgICBhbmdsZV9hZGRyKCkKLXwgICAoIHBocmFzZSgpIChncm91cF9ib2R5KCkgfCBhbmdsZV9hZGRyKCkpICkKLX0KLQotdm9pZCBtYWlsYm94KCkgOgote30KLXsKLSAgICBMT09LQUhFQUQoMjE0NzQ4MzY0NykKLSAgICBhZGRyX3NwZWMoKQotfCAgIGFuZ2xlX2FkZHIoKQotfCAgIG5hbWVfYWRkcigpCi19Ci0KLXZvaWQgbmFtZV9hZGRyKCkgOgote30KLXsKLSAgICBwaHJhc2UoKSBhbmdsZV9hZGRyKCkKLX0KLQotdm9pZCBncm91cF9ib2R5KCkgOgote30KLXsKLSAgICAiOiIKLSAgICBbIG1haWxib3goKSBdCi0gICAgKAotICAgICAgICAiLCIKLSAgICAgICAgWyBtYWlsYm94KCkgXQotICAgICkqCi0gICAgIjsiCi19Ci0KLXZvaWQgYW5nbGVfYWRkcigpIDoKLXt9Ci17Ci0gICAgIjwiIFsgcm91dGUoKSBdIGFkZHJfc3BlYygpICI+IgotfQotCi12b2lkIHJvdXRlKCkgOgote30KLXsKLSAgICAiQCIgZG9tYWluKCkgKCAoIiwiKSogIkAiIGRvbWFpbigpICkqICI6IgotfQotCi12b2lkIHBocmFzZSgpIDoKLXt9Ci17Ci0oICAgPERPVEFUT00+Ci18ICAgPFFVT1RFRFNUUklORz4KLSkrCi19Ci0KLXZvaWQgYWRkcl9zcGVjKCkgOgote30KLXsKLSAgICAoIGxvY2FsX3BhcnQoKSAiQCIgZG9tYWluKCkgKQotfQotCi12b2lkIGxvY2FsX3BhcnQoKSA6Ci17IFRva2VuIHQ7IH0KLXsKLSAgICAoIHQ9PERPVEFUT00+IHwgdD08UVVPVEVEU1RSSU5HPiApCi0gICAgKCAgIFt0PSIuIl0KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCB0LmtpbmQgPT0gQWRkcmVzc0xpc3RQYXJzZXJDb25zdGFudHMuUVVPVEVEU1RSSU5HIHx8IHQuaW1hZ2UuY2hhckF0KHQuaW1hZ2UubGVuZ3RoKCkgLSAxKSAhPSAnLicpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJXb3JkcyBpbiBsb2NhbCBwYXJ0IG11c3QgYmUgc2VwYXJhdGVkIGJ5ICcuJyIpOwotICAgICAgICB9Ci0gICAgICAgICggICB0PTxET1RBVE9NPiB8IHQ9PFFVT1RFRFNUUklORz4gKQotICAgICkqCi19Ci0KLXZvaWQgZG9tYWluKCkgOgoteyBUb2tlbiB0OyB9Ci17Ci0gICAgKCAgIHQ9PERPVEFUT00+Ci0gICAgICAgICggICBbdD0iLiJdCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHQuaW1hZ2UuY2hhckF0KHQuaW1hZ2UubGVuZ3RoKCkgLSAxKSAhPSAnLicpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiQXRvbXMgaW4gZG9tYWluIG5hbWVzIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICcuJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdD08RE9UQVRPTT4KLSAgICAgICAgKSoKLSAgICApCi18ICAgPERPTUFJTkxJVEVSQUw+Ci19Ci0KLVNQRUNJQUxfVE9LRU4gOgotewotICAgIDwgV1M6ICggWyIgIiwgIlx0Il0gKSsgPgotfQotCi1UT0tFTiA6Ci17Ci0gICAgPCAjQUxQSEE6IFsiYSIgLSAieiIsICJBIiAtICJaIl0gPgotfCAgIDwgI0RJR0lUOiBbIjAiIC0gIjkiXSA+Ci18ICAgPCAjQVRFWFQ6ICggPEFMUEhBPiB8IDxESUdJVD4KLSAgICAgICAgICAgICAgfCAiISIgfCAiIyIgfCAiJCIgfCAiJSIKLSAgICAgICAgICAgICAgfCAiJiIgfCAiJyIgfCAiKiIgfCAiKyIKLSAgICAgICAgICAgICAgfCAiLSIgfCAiLyIgfCAiPSIgfCAiPyIKLSAgICAgICAgICAgICAgfCAiXiIgfCAiXyIgfCAiYCIgfCAieyIKLSAgICAgICAgICAgICAgfCAifCIgfCAifSIgfCAifiIKLSAgICAgICAgICAgICAgKT4KLXwgICA8IERPVEFUT006IDxBVEVYVD4gKCA8QVRFWFQ+IHwgIi4iICkqID4KLX0KLQotVE9LRU5fTUdSX0RFQ0xTIDoKLXsKLSAgICAvLyBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBsZXZlbHMgb2YgY29tbWVudCBuZXN0aW5nCi0gICAgLy8gd2UndmUgZW5jb3VudGVyZWQuICBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSAybmQKLSAgICAvLyBsZXZlbCBpcyByZWFjaGVkLCBmb3IgZXhhbXBsZSAoKHRoaXMpKSwgbm90ICh0aGlzKS4KLSAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dGVybW9zdCBsZXZlbCBtdXN0IGJlIHRyZWF0ZWQKLSAgICAvLyBzcGVjaWFsbHkgYW55d2F5LCBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgIikiIGhhcyBhIAotICAgIC8vIGRpZmZlcmVudCB0b2tlbiB0eXBlIHRoYW4gaW5uZXIgIikiIGluc3RhbmNlcy4KLSAgICBzdGF0aWMgaW50IGNvbW1lbnROZXN0OwotfQotCi1NT1JFIDoKLXsKLSAgICAvLyBkb21haW4gbGl0ZXJhbAotICAgICJbIiA6IElORE9NQUlOTElURVJBTAotfQotCi08SU5ET01BSU5MSVRFUkFMPgotTU9SRSA6Ci17Ci0gICAgPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0KLXwgICA8IH5bIlsiLCAiXSIsICJcXCJdID4KLX0KLQotPElORE9NQUlOTElURVJBTD4KLVRPS0VOIDoKLXsKLSAgICA8IERPTUFJTkxJVEVSQUw6ICJdIiA+IHsgbWF0Y2hlZFRva2VuLmltYWdlID0gaW1hZ2UudG9TdHJpbmcoKTsgfTogREVGQVVMVAotfQotCi1NT1JFIDoKLXsKLSAgICAvLyBzdGFydHMgYSBjb21tZW50Ci0gICAgIigiIDogSU5DT01NRU5UCi19Ci0KLTxJTkNPTU1FTlQ+Ci1TS0lQIDoKLXsKLSAgICAvLyBlbmRzIGEgY29tbWVudAotICAgIDwgQ09NTUVOVDogIikiID4gOiBERUZBVUxUCi0gICAgLy8gaWYgdGhpcyBpcyBldmVyIGNoYW5nZWQgdG8gbm90IGJlIGEgU0tJUCwgbmVlZAotICAgIC8vIHRvIG1ha2Ugc3VyZSBtYXRjaGVkVG9rZW4udG9rZW4gPSB0b2tlbi50b1N0cmluZygpCi0gICAgLy8gaXMgY2FsbGVkLgotfQotCi08SU5DT01NRU5UPgotTU9SRSA6Ci17Ci0gICAgPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0KLXwgICAiKCIgeyBjb21tZW50TmVzdCA9IDE7IH0gOiBORVNURURfQ09NTUVOVAotfCAgIDwgPEFOWT4+Ci19Ci0KLTxORVNURURfQ09NTUVOVD4KLU1PUkUgOgotewotICAgIDwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9Ci18ICAgIigiIHsgKytjb21tZW50TmVzdDsgfQotfCAgICIpIiB7IC0tY29tbWVudE5lc3Q7IGlmIChjb21tZW50TmVzdCA9PSAwKSBTd2l0Y2hUbyhJTkNPTU1FTlQpOyB9Ci18ICAgPCA8QU5ZPj4KLX0KLQotCi0vLyBRVU9URUQgU1RSSU5HUwotCi1NT1JFIDoKLXsKLSAgICAiXCIiIHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBJTlFVT1RFRFNUUklORwotfQotCi08SU5RVU9URURTVFJJTkc+Ci1NT1JFIDoKLXsKLSAgICA8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQotfCAgIDwgKH5bIlwiIiwgIlxcIl0pKyA+Ci19Ci0KLTxJTlFVT1RFRFNUUklORz4KLVRPS0VOIDoKLXsKLSAgICA8IFFVT1RFRFNUUklORzogIlwiIiA+IHsgbWF0Y2hlZFRva2VuLmltYWdlID0gaW1hZ2Uuc3Vic3RyaW5nKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBERUZBVUxUCi19Ci0KLS8vIEdMT0JBTFMKLQotPCo+Ci1UT0tFTiA6Ci17Ci0gICAgPCAjUVVPVEVEUEFJUjogIlxcIiA8QU5ZPiA+Ci18ICAgPCAjQU5ZOiB+W10gPgotfQotCi0vLyBFUlJPUiEKLS8qCi0KLTwqPgotVE9LRU4gOgotewotICAgIDwgVU5FWFBFQ1RFRF9DSEFSOiA8QU5ZPiA+Ci19Ci0KLSovCmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL2pqdHJlZS9zaWV2ZS9zaWV2ZS5qanQgYi90cnVuay9tYWluL3NyYy9tYWluL2pqdHJlZS9zaWV2ZS9zaWV2ZS5qanQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTZmNzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9qanRyZWUvc2lldmUvc2lldmUuamp0CisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLW9wdGlvbnMgewotICBNVUxUST10cnVlOwotICBWSVNJVE9SPXRydWU7Ci0gIFZJU0lUT1JfRVhDRVBUSU9OPSJvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb24iOwotICBOT0RFX1BBQ0tBR0U9Im9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQiOwotICBOT0RFX0RFRkFVTFRfVk9JRD1mYWxzZTsKLSAgU1RBVElDID0gZmFsc2U7Ci0gIEpBVkFfVU5JQ09ERV9FU0NBUEUgPSB0cnVlOyAgCi0gIERFQlVHX1BBUlNFUiA9IGZhbHNlOwotICBPVVRQVVRfRElSRUNUT1JZPSIuL29yZy9hcGFjaGUvanNpZXZlL3BhcnNlci9nZW5lcmF0ZWQiOwotICBOT0RFX0VYVEVORFM9Im9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5TaWV2ZU5vZGUiOwotICBOT0RFX1NDT1BFX0hPT0s9dHJ1ZTsKLSAgSkRLX1ZFUlNJT049IjEuNSI7Ci19Ci0KLVBBUlNFUl9CRUdJTihTaWV2ZVBhcnNlcikKLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuKjsKLQotcHVibGljIGNsYXNzIFNpZXZlUGFyc2VyIHsgCi0KLSAgcHVibGljIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pIHsKLSAgICAoKFNpZXZlTm9kZSkgbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikgewotICAgICgoU2lldmVOb2RlKSBuKS5zZXRMYXN0VG9rZW4oZ2V0VG9rZW4oMCkpOwotICB9Ci19Ci0KLVBBUlNFUl9FTkQoU2lldmVQYXJzZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhFIFNJRVZFIExBTkdVQUdFIFRPS0VOUyBTVEFSVFMgSEVSRSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNLSVAgOiAvKiBXSElURSBTUEFDRSAqLwotewotICAiICIKLXwgIlx0IgotfCAiXG4iCi18ICJcciIKLXwgIlxmIgotfQotCi1TUEVDSUFMX1RPS0VOIDogLyogQ09NTUVOVFMgKi8KLXsKLSAgPEhBU0hfQ09NTUVOVDogIiMiICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIik+Ci18IAotICA8QlJBQ0tFVF9DT01NRU5UOiAiLyoiICh+WyIqIl0pKiAiKiIgKCIqIiB8ICh+WyIqIiwiLyJdICh+WyIqIl0pKiAiKiIpKSogIi8iPgotfQotCi1UT0tFTiA6IC8qIENhbid0IG1ha2UgdGhpcyBvbmUgc3BlY2lhbCAqLwotewotICA8RU9GX0hBU0hfQ09NTUVOVDogIiMiICh+WyJcbiIsIlxyIl0pKj4KLX0gICAgICAgICAgICAgIAotCi0KLS8vIGlkZW50aWZpZXIgPSAoQUxQSEEgLyAiXyIpICooQUxQSEEgRElHSVQgIl8iKQotVE9LRU4gOiAvKiBJREVOVElGSUVSICovCi17Ci0gICA8SURFTlRJRklFUjogKDxBTFBIQT58Il8iKSAoPEFMUEhBPnw8RElHSVQ+fCJfIikqPgotfAotICA8ICNBTFBIQToKLSAgICAgIFsKLSAgICAgICAiXHUwMDQxIi0iXHUwMDVhIiwKLSAgICAgICAiXHUwMDYxIi0iXHUwMDdhIgotICAgICAgXQotICA+Ci18Ci0gIDwgI0RJR0lUOgotICAgICAgWwotICAgICAgICJcdTAwMzAiLSJcdTAwMzkiCi0gICAgICBdCi0gID4gIAotfQotCi0vLyB0YWcgPSAiOiIgaWRlbnRpZmllcgotVE9LRU4gOiAvKiBUQUcgKi8KLXsKLSAgIDxUQUc6ICI6IiA8SURFTlRJRklFUj4gPgotfQotCi1UT0tFTiA6IC8qIExJVEVSQUxTICovCi17Ci0vLyBudW1iZXIgPSAxKkRJR0lUIFtRVUFOVElGSUVSXQotLy8gUVVBTlRJRklFUiA9ICJLIiAvICJNIiAvICJHIgotICAgPCBOVU1CRVI6IAotICAgICAgIDxERUNJTUFMX0xJVEVSQUw+ICg8UVVBTlRJRklFUj4pPwotICAgPgotfAotICA8ICNERUNJTUFMX0xJVEVSQUw6IChbIjAiLSI5Il0pKyA+Ci18Ci0gIDwgI1FVQU5USUZJRVI6IFsiSyIsIk0iLCJHIl0gPiAgICAKLXwKLS8vIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgKkNIQVIgRFFVT1RFCi0vLyBpbiBnZW5lcmFsLCBcIENIQVIgaW5zaWRlIGEgc3RyaW5nIG1hcHMgdG8gQ0hBUgotLy8gc28gXCIgbWFwcyB0byAiIGFuZCBcXCBtYXBzIHRvIFwKLS8vIG5vdGUgdGhhdCBuZXdsaW5lcyBhbmQgb3RoZXIgY2hhcmFjdGVycyBhcmUgYWxsIGFsbG93ZWQgc3RyaW5ncwotICA8IFFVT1RFRF9TVFJJTkc6Ci0gICAgICAiXCIiCi0gICAgICAoflsiXCIiXXwiXFxcIiIpKgotICAgICAgIlwiIgotICA+Ci18Ci0vLyBtdWx0aS1saW5lID0gInRleHQ6IiAqKFNQIC8gSFRBQikgKGhhc2gtY29tbWVudCAvIENSTEYpCi0vLyAgICAgICAgICAgICAgICoobXVsdGktbGluZS1saXRlcmFsIC8gbXVsdGktbGluZS1kb3RzdHVmZikKLS8vICAgICAgICAgICAgICAgIi4iIENSTEYKLS8vIEhtbS4gV2hhdCB3ZSBuZWVkIHRvIGRvIGlzIHRyZWF0IChDUkxGIC8gTEYgLyBDUikgYXMgPE5FV0xJTkU+IHRocm91Z2hvdXQKLSAgPCBNVUxUSV9MSU5FOgotICAgICAgPE1VTFRJX0xJTkVfU1RBUlQ+Ci0gICAgICAoPE1VTFRJX0xJTkVfTElURVJBTD4gfDxNVUxUSV9MSU5FX0RPVFNUVUZGPikqCi0gICAgICA8TVVMVElfTElORV9FTkQ+Ci0gID4KLXwKLSAgPCNNVUxUSV9MSU5FX1NUQVJUOiAKLSAgICAgICgidGV4dDoiKQotICAgICAgKFsiICIsICJcdCJdKSoKLSAgICAgICg8SEFTSF9DT01NRU5UPnw8TkVXTElORT4pCi0gID4KLXwKLSAgPCNNVUxUSV9MSU5FX0VORDoKLSAgICAgICgiLiIgPE5FV0xJTkU+KQotICA+ICAgICAgICAgICAgICAKLXwKLSAgPCNORVdMSU5FOgotICAgICAgKCJcbiJ8IlxyInwiXHJcbiIpCi0gID4KLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIG11bHRpLWxpbmUtbGl0ZXJhbCAgPSBbQ0hBUi1OT1QtRE9UICpDSEFSX05PVF9ORVdMSU5FXSBORVdMSU5FIAotICA8ICNNVUxUSV9MSU5FX0xJVEVSQUw6Ci0gICAgICAoPENIQVJfTk9UX0RPVD4gKDxDSEFSX05PVF9ORVdMSU5FPikqKT8KLSAgICAgIDxORVdMSU5FPgotICA+ICAKLXwKLSAgPCAjQ0hBUl9OT1RfRE9UOiAKLSAgICAgICh+WyIuIl0pCi0gID4KLXwKLSAgPCAjQ0hBUl9OT1RfTkVXTElORTogCi0gICAgICAoflsiXG4iXSB8ICgiXHIiIH5bIlxuIl0pKQotICA+ICAgCi18Ci0vLyBtdWx0aS1saW5lLWRvdHN0dWZmID0gIi4iIDEqQ0hBUi1OT1QtQ1JMRiBDUkxGCi0vLyBBIGxpbmUgY29udGFpbmluZyBvbmx5ICIuIiBlbmRzIHRoZSBtdWx0aS1saW5lLgotLy8gUmVtb3ZlIGEgbGVhZGluZyAnLicgaWYgZm9sbG93ZWQgYnkgYW5vdGhlciAnLicuCi0gIDwgI01VTFRJX0xJTkVfRE9UU1RVRkY6Ci0gICAgIi4iCi0gICAgKDxDSEFSX05PVF9ORVdMSU5FPikrCi0gICAgPE5FV0xJTkU+Ci0gID4gIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSEUgU0lFVkUgTEFOR1VBR0UgR1JBTU1BUiBTVEFSVFMgSEVSRSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBzdGFydCA9IGNvbW1hbmRzICAgCi1TaW1wbGVOb2RlIHN0YXJ0KCkgOgoteyAgfQotewotICBjb21tYW5kcygpCi0gICg8RU9GX0hBU0hfQ09NTUVOVD4pPyAvLyBBbGxvdyBhIEhhc2ggY29tbWVudCBpbW1lZGlhdGVseSBwcmlvciB0byBFT0YKLSAgPEVPRj4KLSAgeyByZXR1cm4gamp0VGhpczsgfSAgCi19Ci0KLS8vICAgY29tbWFuZHMgPSAqY29tbWFuZAotdm9pZCBjb21tYW5kcygpIDoKLXsgfQotewotICAoY29tbWFuZCgpKSoKLX0KLQotLy8gICBjb21tYW5kID0gaWRlbnRpZmllciBhcmd1bWVudHMgKCAiOyIgLyBibG9jayApCi12b2lkIGNvbW1hbmQoKSA6Ci17IFRva2VuIGlkZW50aWZpZXIgPSBudWxsOyB9Ci17Ci0gIChpZGVudGlmaWVyID0gPElERU5USUZJRVI+KSBhcmd1bWVudHMoKSAoIjsiIHwgYmxvY2soKSkKLSAgewotICAgIGpqdFRoaXMuc2V0TmFtZShpZGVudGlmaWVyLmltYWdlKTsKLSAgfSAgCi19Ci0KLS8vICAgYmxvY2sgPSAieyIgY29tbWFuZHMgIn0iCi12b2lkIGJsb2NrKCkgOgoteyB9Ci17Ci0gICAieyIgY29tbWFuZHMoKSAifSIKLX0KLQotLy8gICBhcmd1bWVudHMgPSAqYXJndW1lbnQgW3Rlc3QgLyB0ZXN0LWxpc3RdCi12b2lkIGFyZ3VtZW50cygpIDoKLXsgfQotewotICAoYXJndW1lbnQoKSkqICh0ZXN0KCkgfCB0ZXN0X2xpc3QoKSk/Ci19Ci0KLS8vICAgIGFyZ3VtZW50ID0gc3RyaW5nLWxpc3QgLyBudW1iZXIgLyB0YWcKLXZvaWQgYXJndW1lbnQoKSA6Ci17IFRva2VuIHN0cmluZ19saXN0ID0gbnVsbCwgbnVtYmVyID0gbnVsbCwgdGFnID0gbnVsbDsgfQotewotICAoc3RyaW5nX2xpc3QoKSB8IG51bWJlciA9IDxOVU1CRVI+IHwgdGFnID0gPFRBRz4pCi0gIHsKLSAgICBBcmd1bWVudCB2YWx1ZSA9IG51bGw7IAotICAgIGlmIChudWxsICE9IG51bWJlcikKLSAgICAgICB2YWx1ZSA9IG5ldyBOdW1iZXJBcmd1bWVudChudW1iZXIpOwotICAgIGVsc2UgaWYgKG51bGwgIT0gdGFnKQotICAgICAgIHZhbHVlID0gbmV3IFRhZ0FyZ3VtZW50KHRhZyk7Ci0gICAgamp0VGhpcy5zZXRWYWx1ZSh2YWx1ZSk7ICAgICAgIAotICB9Ci19Ci0KLS8vICAgdGVzdCA9IGlkZW50aWZpZXIgYXJndW1lbnRzCi12b2lkIHRlc3QoKSA6Ci17IFRva2VuIGlkZW50aWZpZXIgPSBudWxsOyB9Ci17Ci0gIChpZGVudGlmaWVyID0gPElERU5USUZJRVI+IGFyZ3VtZW50cygpKQotICB7Ci0gICAgamp0VGhpcy5zZXROYW1lKGlkZW50aWZpZXIuaW1hZ2UpOwotICB9ICAgCi19Ci0KLS8vICAgdGVzdC1saXN0ID0gIigiIHRlc3QgKigiLCIgdGVzdCkgIikiCi12b2lkIHRlc3RfbGlzdCgpIDoKLXsgfQotewotICAiKCIgdGVzdCgpICgiLCIgdGVzdCgpKSogIikiCi19Ci0KLS8vICAgc3RyaW5nID0gcXVvdGVkLXN0cmluZyAvIG11bHRpLWxpbmUKLXZvaWQgc3RyaW5nKCkgOgoteyBUb2tlbiBxdW90ZWRfc3RyaW5nID0gbnVsbCwgbXVsdGlfbGluZSA9IG51bGw7fQotewotICAocXVvdGVkX3N0cmluZyA9IDxRVU9URURfU1RSSU5HPiB8IG11bHRpX2xpbmUgPSA8TVVMVElfTElORT4pCi0gIHsKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgaWYgKG51bGwgIT0gcXVvdGVkX3N0cmluZykgewotICAgICAgYnVpbGRlcj1uZXcgU3RyaW5nQnVpbGRlcihxdW90ZWRfc3RyaW5nLmltYWdlKTsKLSAgICAgIC8vIHVucXVvdGUKLSAgICAgIGJ1aWxkZXIuZGVsZXRlQ2hhckF0KGJ1aWxkZXIubGVuZ3RoKCkgLSAxKTsKLSAgICB9IGVsc2UgaWYgKG51bGwgIT0gbXVsdGlfbGluZSkgewotICAgICAgYnVpbGRlcj1uZXcgU3RyaW5nQnVpbGRlcihtdWx0aV9saW5lLmltYWdlKTsKLSAgICAgIC8vIHJlbW92ZSBwcmVmaXhpbmcgJ3RleHQnIGFuZCB3aGl0ZXNwYWNlCi0gICAgICB3aGlsZSAoYnVpbGRlci5sZW5ndGgoKT4wICYmIGJ1aWxkZXIuY2hhckF0KDApICE9ICdcbicpIHsKLSAgICAgIAkgYnVpbGRlci5kZWxldGVDaGFyQXQoMCk7Ci0gICAgICB9Ci0gICAgICAvLyByZW1vdmUgc3VmZml4aW5nIG5ld2xpbmUtZG90LW5ld2xpbmUKLSAgICAgIGJ1aWxkZXIuZGVsZXRlQ2hhckF0KGJ1aWxkZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgIGJ1aWxkZXIuZGVsZXRlQ2hhckF0KGJ1aWxkZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgIGJ1aWxkZXIuZGVsZXRlQ2hhckF0KGJ1aWxkZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgIAotICAgICAgaW50IG5leHRTdHVmZmVkRG90ID0gYnVpbGRlci5pbmRleE9mKCJcbi4uIik7Ci0gICAgICB3aGlsZSAobmV4dFN0dWZmZWREb3QgPj0gMCkgewotICAgICAgCSBidWlsZGVyLmRlbGV0ZUNoYXJBdChuZXh0U3R1ZmZlZERvdCsxKTsKLSAgICAgIAkgbmV4dFN0dWZmZWREb3QgPSBidWlsZGVyLmluZGV4T2YoIlxuLi4iLCBuZXh0U3R1ZmZlZERvdCArIDIpOwotICAgICAgfSAKLSAgICB9IGVsc2UgewotICAgICAgYnVpbGRlcj1udWxsOyAgCi0gICAgfQotICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgLy8gVW5lc2NhcGUKLSAgICAgICAgYnVpbGRlci5kZWxldGVDaGFyQXQoMCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBidWlsZGVyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBpZiAoJ1xcJyA9PSBidWlsZGVyLmNoYXJBdChpKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuZGVsZXRlQ2hhckF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGpqdFRoaXMuc2V0VmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gICBzdHJpbmctbGlzdCA9ICJbIiBzdHJpbmcgKigiLCIgc3RyaW5nKSAiXSIgLyBzdHJpbmcgICAgICAgICA7OyBpZgotLy8gICB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHN0cmluZywgdGhlIGJyYWNrZXRzIGFyZSBvcHRpb25hbAotdm9pZCBzdHJpbmdfbGlzdCgpIDoKLXsgfQotewotICAoIlsiIHN0cmluZygpICgiLCIgc3RyaW5nKCkpKiAiXSIpIHwgc3RyaW5nKCkKLX0KLQotCi0gICAKLSAKZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzbWFwLnByb3BlcnRpZXMgYi90cnVuay9tYWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNjNTY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzbWFwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAjCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAjCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAjCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAjCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAjCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAjCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAjCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAjCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAjCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAjCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAjCi0jIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLklmCi1lbHNlPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2UKLWVsc2lmPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2lmCi1yZXF1aXJlPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlJlcXVpcmUKLXN0b3A9b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuU3RvcAotIyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGVzZQota2VlcD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5LZWVwCi1kaXNjYXJkPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkRpc2NhcmQKLXJlZGlyZWN0PW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlJlZGlyZWN0Ci0jIFJGQzMwODIgLSBJbXBsZW1lbnRhdGlvbnMgU0hPVUxEIHN1cHBvcnQgdGhlc2UKLXJlamVjdD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbC5SZWplY3QKLWZpbGVpbnRvPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLkZpbGVJbnRvCi0jIEV4dGVuc2lvbiBDb21tYW5kcwotbG9nPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnMuTG9nCmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yc21hcC5wcm9wZXJ0aWVzIGIvdHJ1bmsvbWFpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnNtYXAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNjVkZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yc21hcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgIwotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgIwotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgIwotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgIwotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgIwotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgIwotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgIwotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgIwotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgIwotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgIwotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgIwotIyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFJGQzMwODIgLSBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IHRoZXNlCi1pO29jdGV0PW9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLk9jdGV0Ci1pO2FzY2lpLWNhc2VtYXA9b3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuQXNjaWlDYXNlbWFwCi0jIE9wdGlvbmFsCi1pO2FzY2lpLW51bWVyaWM9b3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnMuQXNjaWlOdW1lcmljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHNtYXAucHJvcGVydGllcyBiL3RydW5rL21haW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvanNpZXZlL3Rlc3RzbWFwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmVlNGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9qc2lldmUvdGVzdHNtYXAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICMKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICMKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICMKLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICMKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICMKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICMKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICMKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICMKLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICMKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICMKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGVzZSB0ZXN0cwotYWRkcmVzcz1vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzCi1hbGxvZj1vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BbGxPZgotYW55b2Y9b3JnLmFwYWNoZS5qc2lldmUudGVzdHMuQW55T2YKLWV4aXN0cz1vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5FeGlzdHMKLWZhbHNlPW9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkZhbHNlCi1oZWFkZXI9b3JnLmFwYWNoZS5qc2lldmUudGVzdHMuSGVhZGVyCi1ub3Q9b3JnLmFwYWNoZS5qc2lldmUudGVzdHMuTm90Ci1zaXplPW9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLlNpemUKLXRydWU9b3JnLmFwYWNoZS5qc2lldmUudGVzdHMuVHJ1ZQotIyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIFNIT1VMRCBzdXBwb3J0IHRoZXNlCi1lbnZlbG9wZT1vcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5vcHRpb25hbC5FbnZlbG9wZQotIyBMaW1pdGVkIGltcGxlbWVudGF0aW9uCi1ib2R5PW9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLm9wdGlvbmFsLkJvZHkKZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZiBiL3RydW5rL21haW4vc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjYzEwMi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmIGIvdHJ1bmsvbWFpbi9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2phbWVzLWpzaWV2ZS1sb2dvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZTM0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvc2l0ZS9zaXRlLnhtbCBiL3RydW5rL21haW4vc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWU5MDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0NCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICANCi0tLT4NCi08cHJvamVjdCBuYW1lPSJqU2lldmUiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5KQU1FUyBqU2lldmU8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0Pg0KLSAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+DQotICAgIDxzcmM+aW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmPC9zcmM+DQotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJSaWdodD4gDQotCi0gIDxib2R5PgotCi0gICAgPG1lbnUgbmFtZT0ialNpZXZlIEVuZ2luZSI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgaHJlZj0iaW5kZXguaHRtbCIvPg0KLSAgICAgIDxpdGVtIG5hbWU9IlNpZXZlIEZlYXR1cmVzIiBocmVmPSJmZWF0dXJlcy5odG1sIi8+DQotICAgICAgPGl0ZW0gbmFtZT0iR2V0dGluZyBTdGFydGVkIiBocmVmPSJzdGFydC5odG1sIi8+Ci0gICAgICA8aXRlbSAKLSAgICAgICAgbmFtZT0iRE9BUCIgCi0gICAgICAgIGhyZWY9ImRvYXBfYXBhY2hlLWpzaWV2ZS5yZGYiIAotICAgICAgICBpbWc9J2h0dHA6Ly93d3cudzMub3JnL1JERi9pY29ucy9yZGZfbWV0YWRhdGFfYnV0dG9uLjMyJy8+Ci0gICAgPC9tZW51PgotICAgIAotICAgIDxtZW51IHJlZj0icmVwb3J0cyIgLz4KLSAgICAKLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvc2l0ZS94ZG9jL2ZlYXR1cmVzLnhtbCBiL3RydW5rL21haW4vc3JjL3NpdGUveGRvYy9mZWF0dXJlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2FkZDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvc2l0ZS94ZG9jL2ZlYXR1cmVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgIAotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAKLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgIAotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgIAotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAKLS0tPgotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5PdmVydmlldzwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9ImpzaWV2ZS1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIj5qU2lldmUgUHJvamVjdDwvYXV0aG9yPgotIDwvcHJvcGVydGllcz4KLQotPGJvZHk+Ci08c2VjdGlvbiBuYW1lPSdqU2lldmUgRmVhdHVyZXMnPgotPHN1YnNlY3Rpb24gbmFtZT0nU2lldmUgRmVhdHVyZXMgU3VwcG9ydGVkIEJ5IGpTaWV2ZSc+Ci08cD4KLWpTaWV2ZSBpcyBsaW1pdGVkIG9ubHkgYnkgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIGl0IHJ1bnMuCi08L3A+Ci08dGFibGU+Ci08dHI+PHRoPkxpbWl0czwvdGg+PHRoLz48L3RyPgotPHRyPjx0ZD5NYXhpbXVtIE51bWJlciBPZiBBY3Rpb25zPC90ZD48dGQ+Tm8gaW50cmluc2ljIGxpbWl0PC90ZD48L3RyPgotPHRyPjx0ZD5NYXhpbXVtIE51bWJlciBPZiBOZXN0ZWQgQmxvY2tzPC90ZD48dGQ+Tm8gaW50cmluc2ljIGxpbWl0PC90ZD48L3RyPgotPHRyPjx0ZD5NYXhpbXVtIE51bWJlciBPZiBOZXN0ZWQgVGVzdCBMaXN0czwvdGQ+PHRkPk5vIGludHJpbnNpYyBsaW1pdDwvdGQ+PC90cj4KLTwvdGFibGU+Ci08cD4KLWpTaWV2ZSBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgY29udHJvbCBjb21tYW5kcyBzcGVjaWZpZWQgaW4gUkZDIDMwMjguCi08L3A+Ci08dGFibGU+Ci08dHI+Ci08dGg+Q29udHJvbCBDb21tYW5kPC90aD48dGg+U3BlY2lmaWNhdGlvbjwvdGg+PHRoPlN1cHBvcnRlZDwvdGg+Ci08L3RyPgotPHRyPgotPHRkPklmPC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPgotPHRkPlJlcXVpcmU8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTx0cj4KLTx0ZD5TdG9wPC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxwPgotalNpZXZlIHN1cHBvcnRzIGFsbCBhY3Rpb24gY29tbWFuZHMgKGJvdGggcmVxdWlyZWQgYW5kIG9wdGlvbmFsKSAKLXNwZWNpZmllZCBpbiBSRkMgMzAyOC4gCi08L3A+PHA+Ci08c3Ryb25nPk5vdGU8L3N0cm9uZz4gdGhhdCBqU2lldmUgdXNlcyBhIHBsdWdnYWJsZSAKLTxjb2RlPk1haWxBZGFwdGVyPC9jb2RlPiBhcyBhbiBpbnRlcmZhY2UgdG8gdGhlIG1haWwgc2VydmVyLgotTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgbWF5IGZ1bGx5IHN1cHBvcnQgYWxsIGFjdGlvbnMuCi08L3A+ICAKLTx0YWJsZT4KLTx0cj4KLTx0aD5BY3Rpb24gQ29tbWFuZDwvdGg+PHRoPlNwZWNpZmljYXRpb248L3RoPjx0aD5TdXBwb3J0ZWQ8L3RoPgotPC90cj48dHI+Ci08dGQ+cmVqZWN0PC90ZD48dGQ+UkZDIDMwMjggKE9QVElPTkFMKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPjx0cj4KLTx0ZD5maWxlaW50bzwvdGQ+PHRkPlJGQyAzMDI4IChPUFRJT05BTCk8L3RkPjx0ZD55ZXM8L3RkPgotPC90cj48dHI+Ci08dGQ+cmVkaXJlY3Q8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+PHRyPgotPHRkPmtlZXA8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+PHRyPgotPHRkPmRpc2NhcmQ8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHA+Ci1qU2lldmUgc3VwcG9ydHMgYWxsIHRlc3RzIGNvbW1hbmRzIHNwZWNpZmllZCBpbiBSRkMgMzAyOC4KLTwvcD4KLTx0YWJsZT4KLTx0cj4KLTx0aD5UZXN0IENvbW1hbmQ8L3RoPjx0aD5TcGVjaWZpY2F0aW9uPC90aD48dGg+U3VwcG9ydGVkPC90aD4KLTwvdHI+PHRyPgotPHRkPmFkZHJlc3M8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+PHRyPgotPHRkPmFsbG9mPC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPjx0cj4KLTx0ZD5hbnlvZjwvdGQ+PHRkPlJGQyAzMDI4IChSRVFVSVJFRCk8L3RkPjx0ZD55ZXM8L3RkPgotPC90cj48dHI+Ci08dGQ+ZW52ZWxvcGU8L3RkPjx0ZD5SRkMgMzAyOCAoT1BUSU9OQUwpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+PHRyPgotPHRkPmV4aXN0czwvdGQ+PHRkPlJGQyAzMDI4IChSRVFVSVJFRCk8L3RkPjx0ZD55ZXM8L3RkPgotPC90cj48dHI+Ci08dGQ+ZmFsc2U8L3RkPjx0ZD5SRkMgMzAyOCAoUkVRVUlSRUQpPC90ZD48dGQ+eWVzPC90ZD4KLTwvdHI+PHRyPgotPHRkPmhlYWRlcjwvdGQ+PHRkPlJGQyAzMDI4IChSRVFVSVJFRCk8L3RkPjx0ZD55ZXM8L3RkPgotPC90cj48dHI+Ci08dGQ+bm90PC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPjx0cj4KLTx0ZD5zaXplPC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPjx0cj4KLTx0ZD50cnVlPC90ZD48dGQ+UkZDIDMwMjggKFJFUVVJUkVEKTwvdGQ+PHRkPnllczwvdGQ+Ci08L3RyPjx0cj4KLTx0ZD5ib2R5PC90ZD48dGQ+PGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1zaWV2ZS1ib2R5LTAwJz5TSUVWRSBib2R5IGV4dGVuc2lvbjwvYT48L3RkPjx0ZD5wYXJ0aWFsPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9zdWJzZWN0aW9uPgotPHN1YnNlY3Rpb24gbmFtZT0nalNpZXZlIEV4dGVuc2lvbiBDb21tYW5kcyc+Ci08cD4KLWpTaWV2ZSBhbGxvd3MgZXh0ZW5zaW9uIGNvbW1hbmRzIHRvIGJlIGRldmVsb3BlZAotYW5kIHBsdWdnZWQgaW4gYXQgcnVuIHRpbWUuCi1UaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBjb21tYW5kcyBzaGlwIHdpdGggalNpZXZlOgotPC9wPgotPHRhYmxlPgotPHRyPjx0aD5OYW1lPC90aD48dGg+RnVuY3Rpb248L3RoPjwvdHI+Ci08dHI+PHRkPkxvZzwvdGQ+PHRkPkxvZ3MgbWVzc2FnZXM8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC9zdWJzZWN0aW9uPgotPC9zZWN0aW9uPgotPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3NpdGUveGRvYy9pbmRleC54bWwgYi90cnVuay9tYWluL3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhkNDEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3NpdGUveGRvYy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgIAotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAKLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgIAotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgIAotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAKLS0tPgotPGRvY3VtZW50PgotCi0gPHByb3BlcnRpZXM+Ci0gIDx0aXRsZT5PdmVydmlldzwvdGl0bGU+Ci0gIDxhdXRob3IgZW1haWw9ImpzaWV2ZS1kZXZAamFrYXJ0YS5hcGFjaGUub3JnIj5qU2lldmUgUHJvamVjdDwvYXV0aG9yPgotIDwvcHJvcGVydGllcz4KLQotPGJvZHk+Ci08c2VjdGlvbiBuYW1lPSJXaGF0IGlzIGpTaWV2ZT8iPgotPHA+Ci1qU2lldmUgaXMgYSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTaWV2ZSBtYWlsIGZpbHRlcmluZyBsYW5ndWFnZSBkZWZpbmVkIGJ5IAotPGEgaHJlZj0naHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzAyOC50eHQnPlJGQyAzMDI4PC9hPi4galNpZXZlIGlzIGltcGxlbWVudGVkIAotYXMgYSBsYW5ndWFnZSBwcm9jZXNzb3IgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIGFueSBpbnRlcm5ldCBtYWlsIGFwcGxpY2F0aW9uIHRvIGFkZCAKLVNpZXZlIHN1cHBvcnQuCi08L3A+Ci08cD4KLWpTaWV2ZSBpcyBhIHN1YnByb2plY3Qgb2YgPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcnPkFwYWNoZSBKQU1FUzwvYT4uCi1BbGwgd2hvIGFyZSBpbnRlcmVzdGVkIGluIGRldmVsb3BpbmcgalNpZXZlIGFuZCBKQU1FUyB3aWxsIGJlIHdhcm1seQotd2VsY29tZWQgb24gdGhlIDxhIGhyZWY9J21haWwtbGlzdHMuaHRtbCc+bWFpbGluZyBsaXN0czwvYT4uCi08L3A+Ci08c3Vic2VjdGlvbiBuYW1lPSdXaGF0IGlzIFNpZXZlPyc+Ci08cD4KLVNpZXZlIGlzIGFuIGV4dGVuc2libGUgbWFpbCBmaWx0ZXJpbmcgbGFuZ3VhZ2UuIEl0J3MgbGltaXRlZCBleHByZXNzaXZlbmVzcyAobm8gbG9vcHMKLW9yIHZhcmlhYmxlcywgbm8gdGVzdHMgd2l0aCBzaWRlIGVmZmVjdHMpIGFsbG93cyB1c2VyIGNyZWF0ZWQgc2NyaXB0cyB0byBiZSBydW4gCi1zYWZlbHkgb24gZW1haWwgc2VydmVycy4gU2lldmUgaXMgdGFyZ2V0ZWQgYXQgdGhlIGZpbmFsIGRlbGl2ZXJ5IHBoYXNlIAotKHdoZXJlIGFuIGluY29taW5nIGVtYWlsIGlzIHRyYW5zZmVycmVkIHRvIGEgdXNlcidzIG1haWxib3gpLgotPC9wPgotPHA+Ci1TaWV2ZSBzY3JpcHRzIGFyZSBjb21wb3NlZCBvZiBjb21tYW5kcy4gQ29udHJvbCBjb21tYW5kcyBtYW5hZ2UgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc2NyaXB0LgotVGVzdCBjb21tYW5kcyBkZWZpbmUgc2lkZS1lZmZlY3QgZnJlZSBjcml0ZXJpYS4gCi1BY3Rpb24gY29tbWFuZHMgYXJlIG1haWwgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuCi08L3A+Ci0KLTwvc3Vic2VjdGlvbj4KLTwvc2VjdGlvbj4KLTxzZWN0aW9uIG5hbWU9Ik5ld3MiPgotPHN1YnNlY3Rpb24gbmFtZT0iMjAwOCI+Ci0gIDxoND5BdWcvMjAwOCAtIGpTaWV2ZS0wLjIgcmVsZWFzZWQ8L2g0PgotICA8cD5UaGUgQXBhY2hlIEpBTUVTIHRlYW0gaXMgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAgPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpI2pzaWV2ZSc+QXBhY2hlIGpTaWV2ZSAwLjI8L2E+LiAKLSAgVGhpcyBmaXJzdCBwdWJsaWMgcmVsZWFzZSBpcyBhIG1ham9yIG1pbGVzdG9uZSBmb3IgSlNpZXZlLjwvcD4KLTwvc3Vic2VjdGlvbj4KLTwvc2VjdGlvbj4KLTwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy9zaXRlL3hkb2Mvc3RhcnQueG1sIGIvdHJ1bmsvbWFpbi9zcmMvc2l0ZS94ZG9jL3N0YXJ0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZGVlYS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy9zaXRlL3hkb2Mvc3RhcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgIAotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgIAotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIAotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgIAotICB1bmRlciB0aGUgTGljZW5zZS4gIAotLS0+Ci08ZG9jdW1lbnQ+Ci0KLSA8cHJvcGVydGllcz4KLSAgPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KLSAgPGF1dGhvciBlbWFpbD0ianNpZXZlLWRldkBqYWthcnRhLmFwYWNoZS5vcmciPmpTaWV2ZSBQcm9qZWN0PC9hdXRob3I+Ci0gPC9wcm9wZXJ0aWVzPgotCi08Ym9keT4KLTxzZWN0aW9uIG5hbWU9IkdldHRpbmcgU3RhcnRlZCI+Ci08cD5VbnRpbCB0aGVzZSBwYWdlcyBhcmUgZmxlc2hlZCBvdXQsIHRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIGpTaWV2ZSBpcyByZWFkIHRoZSAKLTxhIGhyZWY9J2FwaWRvY3MvaW5kZXguaHRtbCc+SmF2YWRvY3M8L2E+IAotYW5kIGxvb2sgYXQgdGhlIDxhIGhyZWY9J3hyZWYvaW5kZXguaHRtbCc+c291cmNlIGNvZGU8L2E+LiAKLVRoZSBqVW5pdCB0ZXN0cyBpbGx1c3RyYXRlIG1hbnkgYXNwZWN0cwotb2YgdGhlIGltcGxlbWVudGF0aW9uLgotPC9wPgotPHN1YnNlY3Rpb24gbmFtZT0nVXNpbmcgalNpZXZlJz4KLTxzdWJzZWN0aW9uIG5hbWU9J1N0YW5kYWxvbmUnPgotPHA+Ci08YSBocmVmPSd4cmVmL29yZy9hcGFjaGUvanNpZXZlL1NpZXZlRmFjdG9yeS5odG1sJz4KLTxjb2RlPm9yZy5hcGFjaGUuanNpZXZlLlNpZXZlRmFjdG9yeTwvY29kZT48L2E+IGlzIHRoZSBwcmltYXJ5IGludm9jYXRpb24KLXBvaW50IGZvciBhbGwgU2lldmUgb3BlcmF0aW9ucy4gVGhlIEFQSSBpcyBjbGVhbiBhbmQgc2ltcGxlLgotU2VlIHRoZSAKLTxhIGhyZWY9J2FwaWRvY3MvaW5kZXguaHRtbCc+amF2YWRvY3M8L2E+IGZvciBtb3JlIGRldGFpbHMuCi08L3A+Ci08L3N1YnNlY3Rpb24+Ci08c3Vic2VjdGlvbiBuYW1lPSdJbiBKQU1FUyc+Ci08cD4KLVRoZSA8Y29kZT5TaWV2ZVRvTXVsdGlNYWlsYm94PC9jb2RlPiBtYWlsZXQgaXMgaW5jbHVkZWQgaW4gSkFNRVMuCi1JdCBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIG1lc3NhZ2UgZGVsaXZlcnkgc3Bvb2wgYW5kIHByb3ZpZGVzIHBlci11c2VyIAotU2lldmUgc2NyaXB0aW5nIHVzaW5nIGpTaWV2ZS4gCi08L3A+Ci08L3N1YnNlY3Rpb24+Ci08L3N1YnNlY3Rpb24+Ci08c3Vic2VjdGlvbiBuYW1lPSdJbXBsZW1lbnRpbmcgQSBNYWlsIEFkYXB0ZXInPgotPHA+Ci08YSBocmVmPSd4cmVmL29yZy9hcGFjaGUvanNpZXZlL21haWwvTWFpbEFkYXB0ZXIuaHRtbCc+Ci08Y29kZT5vcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyPC9jb2RlPjwvYT4gaXMgdGhlIGludGVyZmFjZSBBUEkgdXNlZAotYnkgalNpZXZlIHRvIGludGVyYWN0IHdpdGggYSBtYWlsIHNlcnZlci4gCi08L3A+PHA+Ci1UaGUgbWFpbCBhZGFwdGVyIHdyYXBzIGFuIGVtYWlsCi1hbmQgc3VwcGxpZXMgaW5mb3JtYXRpb24gKHJlcXVpcmVkIGJ5IHRoZSBzY3JpcHQpIGFib3V0IHRoZSBlbWFpbC4gSXQgaXMgCi1yZXNwb25zaWJsZSBmb3IgYWNjdW11bGF0aW5nIDxjb2RlPkFjdGlvbjwvY29kZT5zIGR1cmluZyB0aGUgcGFyc2luZyBvZiBhCi1zY3JpcHQgYW5kIGZvciBleGVjdXRpbmcgdGhlbSBvbmNlIHRoZSBwYXJzaW5nIGlzIGNvbXBsZXRlLgotPC9wPjxwPgotU2VlIHRoZSAKLTxhIGhyZWY9J2FwaWRvY3MvaW5kZXguaHRtbCc+amF2YWRvY3M8L2E+IGZvciBtb3JlIGRldGFpbHMgYW5kIHRoaXMKLTxhIGhyZWY9J3hyZWYvb3JnL2FwYWNoZS9qc2lldmUvc2FtcGxlcy9qYW1lcy9TaWV2ZU1haWxBZGFwdGVyLmh0bWwnPnNhbXBsZTwvYT4uCi08L3A+Ci08L3N1YnNlY3Rpb24+Ci08c3Vic2VjdGlvbiBuYW1lPSdDcmVhdGluZyBBIEN1c3RvbSBFeHRlbnNpb24gQ29tbWFuZCc+Ci08cD4KLTxhIGhyZWY9J3hyZWYvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvZXh0ZW5zaW9ucy9Mb2cuaHRtbCc+Ci08Y29kZT5vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5leHRlbnNpb25zLkxvZzwvY29kZT48L2E+IGlzIGFuIGV4YW1wbGUKLW9mIGEgY3VzdG9tIGV4dGVuc2lvbiBjb21tYW5kLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGN1c3RvbSBjb21tYW5kcwotZXh0ZW5kIDxhIGhyZWY9J3hyZWYvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvQWJzdHJhY3RDb21tYW5kLmh0bWwnPgotPGNvZGU+QWJzdHJhY3RDb21tYW5kPC9jb2RlPjwvYT4uIFNlZSB0aGUgCi08YSBocmVmPSdhcGlkb2NzL2luZGV4Lmh0bWwnPmphdmFkb2NzPC9hPiBmb3IgbW9yZSBkZXRhaWxzLgotPC9wPjxwPgotQ3VzdG9tIGNvbW1hbmRzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIAotPGEgaHJlZj0neHJlZi9vcmcvYXBhY2hlL2pzaWV2ZS9Db25maWd1cmF0aW9uTWFuYWdlci5odG1sJz4KLTxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPjwvYT4gYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuIFRoaXMKLW1heSBiZSBkb25lIHByb2dyYW1tYXRpY2FsbHkgYnV0IHRoZSByZWNvbW1lbmRlZCBtZXRob2QgaXMgYnkgYWx0ZXJpbmcKLXRoZSA8Y29kZT5vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzPC9jb2RlPiwgPGNvZGU+b3JnL2FwYWNoZS9qc2lldmUvdGVzdHNtYXAucHJvcGVydGllczwvY29kZT4KLWFuZCA8Y29kZT5vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yc21hcC5wcm9wZXJ0aWVzPC9jb2RlPiByZXNvdXJjZSBmaWxlcy4gCi08L3A+Ci08L3N1YnNlY3Rpb24+Ci08c3Vic2VjdGlvbiBuYW1lPSdCdWlsZGluZyBqU2lldmUnPgotPHA+Ci1qU2lldmUgdXNlcyA8YSBocmVmPSdodHRwOi8vYW50LmFwYWNoZS5vcmcnPkFudDwvYT4uIDxjb2RlPmFudCAtcHJvamVjdGhlbHA8L2NvZGU+Ci1kZXNjcmliZXMgYXBwcm9wcmlhdGUgdGFyZ2V0cy4gPGNvZGU+YW50PC9jb2RlPiBydW5zIHRoZSBkZWZhdWx0IHRhcmdldC4KLTwvcD4KLTwvc3Vic2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gbmFtZT0iQ29tbWVudHMsIFF1ZXN0aW9ucyBhbmQgSXNzdWVzIj4KLTxwPmpTaWV2ZSBpcyBhIHN1Yi1wcm9qZWN0IG9mIEFwYWNoZSBKYW1lcy4gUGxlYXNlIGRpcmVjdCB5b3VyIGNvbW1lbnRzIGFuZCBxdWVzdGlvbnMKLXRvIHRoZSByZWxldmFudCBKYW1lcyBsaXN0LgotPC9wPgotPHA+VG8gcmVwb3J0IGlzc3Vlcywgc3VjaCBhcyBidWdzLCBnbyB0byB0aGUKLTxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFIj5qU2lldmUgSXNzdWUgVHJhY2tlcjwvYT4uCi1BcyBqU2lldmUgY29tZXMgd2l0aCBhIGZhaXJseSBleHRlbnNpdmUgc3VpdGUgb2YgalVuaXQgVGVzdHMsIGl0IHdvdWxkIGJlIG1vc3QgCi1oZWxwZnVsIGZvciBidWcgcmVwb3J0cyB0byBiZSBhY2NvbXBhbmllZCBieSBhbiBpbGx1c3RyYXRpdmUgalVuaXQgdGVzdCBjYXNlLgotPC9wPgotPHNlY3Rpb24gbmFtZT0nRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbic+Ci0gICAgPHNlY3Rpb24gbmFtZT0nV2h5IERvIFRlc3RzIFVzaW5nIE5vbi1BU0NJSSBDaGFyYWN0ZXJzIEZhaWw/Jz4KLSAgICAgICAgPHA+Ci08Y29kZT5TSUVWRTwvY29kZT4gc3BlY2lmaWVzIHRoYXQgPGEgaHJlZj0naHR0cDovL2lldGYub3JnL3JmYy9yZmMyMjc4LnR4dCc+VVRGLTg8L2E+IAotZW5jb2RpbmcgaXMgdXNlZCBmb3Igc2NyaXB0cy4gVGhpcyBmb3JtYXQgaXMgYW4gaW50ZXJuYXRpb25hbCBzdGFuZGFyZCBhbmQgaGFzIHdpZGUgCi1zdXBwb3J0IGJ1dCBub3QgYWxsIHBsYXRmb3JtcyB1c2UgdGhpcyBlbmNvZGluZyBieSBkZWZhdWx0LiAKLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLUJ5IGRlZmF1bHQsIEpTaWV2ZSBleHBlY3RzIHRoYXQgc2NyaXB0cyBhcmUgZW5jb2RpbmcgdXNpbmcgPGNvZGU+VVRGLTg8L2NvZGU+LgotRWl0aGVyIHNldCB0aGUgZW5jb2RpbmcgcHJvZ3JhbW1hdGljYWxseSBvciBlbnN1cmUgdGhhdCB0aGUgc2NyaXB0IGlzIGVuY29kZWQgdXNpbmcKLTxjb2RlPlVURi04PC9jb2RlPi4KLSAgICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLTwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWRkcmVzc1BhcnNlVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FkZHJlc3NQYXJzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNDUyNy4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWRkcmVzc1BhcnNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmFzZVNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLlNpZXZlTWFpbEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzUGFyc2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUExFX0FERFJFU1NfVkFMVUVTID0gImNveW90ZUBkZXNlcnQuZXhhbXBsZS5vcmcsIGJ1Z3NAZXhhbXBsZS5vcmcsICBlbG1lckBodW50ZXJzLmV4YW1wbGUub3JnIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xPX0FERFJFU1NfVkFMVUVTID0gImNveW90ZUBkZXNlcnQuZXhhbXBsZS5vcmciOwotCi0gICAgQmFzZVNpZXZlQ29udGV4dCBjb250ZXh0OwotCi0gICAgU2lldmVNYWlsQWRhcHRlciBtYWlsOwotCi0gICAgT3BlbmVkQWRkcmVzcyBhZGRyZXNzOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgY29udGV4dCA9IG5ldyBCYXNlU2lldmVDb250ZXh0KAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldENvbW1hbmRNYW5hZ2VyKCksIGNvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcGFyYXRvck1hbmFnZXIoKSwgY29uZmlndXJhdGlvbk1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXN0TWFuYWdlcigpLCBMb2dGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9nKEFkZHJlc3NQYXJzZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgYWRkcmVzcyA9IG5ldyBPcGVuZWRBZGRyZXNzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgU09MT19BRERSRVNTX1ZBTFVFUyk7Ci0gICAgICAgIGFzc2VydFRydWUoYWRkcmVzcy5tYXRjaChtYWlsLCAiOmFsbCIsICJpO2FzY2lpLWNhc2VtYXAiLCAiOmlzIiwKLSAgICAgICAgICAgICAgICAiZnJvbSIsICJjb3lvdGVAZGVzZXJ0LmV4YW1wbGUub3JnIiwgY29udGV4dCkpOwotICAgICAgICBhc3NlcnRGYWxzZShhZGRyZXNzLm1hdGNoKG1haWwsICI6YWxsIiwgImk7YXNjaWktY2FzZW1hcCIsICI6aXMiLAotICAgICAgICAgICAgICAgICJmcm9tIiwgImVsbWVyQGh1bnRlcnMuZXhhbXBsZS5vcmciLCBjb250ZXh0KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFkZHJlc3MubWF0Y2gobWFpbCwgIjphbGwiLCAiaTthc2NpaS1jYXNlbWFwIiwgIjppcyIsCi0gICAgICAgICAgICAgICAgImZyb20iLCAiYnVnc0BleGFtcGxlLm9yZyIsIGNvbnRleHQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWRkcmVzcy5tYXRjaChtYWlsLCAiOmFsbCIsICJpO2FzY2lpLWNhc2VtYXAiLCAiOmlzIiwKLSAgICAgICAgICAgICAgICAiZnJvbSIsICJyb2FkcnVubmVyQGV4YW1wbGUub3JnIiwgY29udGV4dCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFkZHJlc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCBNVUxUSVBMRV9BRERSRVNTX1ZBTFVFUyk7Ci0gICAgICAgIGFzc2VydFRydWUoYWRkcmVzcy5tYXRjaChtYWlsLCAiOmFsbCIsICJpO2FzY2lpLWNhc2VtYXAiLCAiOmlzIiwKLSAgICAgICAgICAgICAgICAiZnJvbSIsICJjb3lvdGVAZGVzZXJ0LmV4YW1wbGUub3JnIiwgY29udGV4dCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFkZHJlc3MubWF0Y2gobWFpbCwgIjphbGwiLCAiaTthc2NpaS1jYXNlbWFwIiwgIjppcyIsCi0gICAgICAgICAgICAgICAgImZyb20iLCAiZWxtZXJAaHVudGVycy5leGFtcGxlLm9yZyIsIGNvbnRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhZGRyZXNzLm1hdGNoKG1haWwsICI6YWxsIiwgImk7YXNjaWktY2FzZW1hcCIsICI6aXMiLAotICAgICAgICAgICAgICAgICJmcm9tIiwgImJ1Z3NAZXhhbXBsZS5vcmciLCBjb250ZXh0KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFkZHJlc3MubWF0Y2gobWFpbCwgIjphbGwiLCAiaTthc2NpaS1jYXNlbWFwIiwgIjppcyIsCi0gICAgICAgICAgICAgICAgImZyb20iLCAicm9hZHJ1bm5lckBleGFtcGxlLm9yZyIsIGNvbnRleHQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWRkcmVzc1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9BZGRyZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzg3ZmNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9BZGRyZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlRocm93VGVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLlNpZXZlTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgQWRkcmVzc1Rlc3QKLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzQWxsSXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgXCJGcm9tXCIgXCJ1c2VyQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlSW5zZW5zaXRpdmVIZWFkZXJOYW1lKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgXCJmcm9tXCIgXCJ1c2VyQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmVhdG1lbnRPZkVtYmVkZWRTcGFjZXNJbkhlYWRlck5hbWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6YWxsIDppcyBcIkZyb21cIiBcInVzZXJAZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSAiLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPY3RldENvbXBhcmF0b3JUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmNvbXBhcmF0b3IgXCJpO29jdGV0XCIgOmFsbCA6aXMgXCJGcm9tXCIgXCJ1U2VSQGRPbUFpTlwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20gIiwgInVTZVJAZE9tQWlOIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0ZXRDb21wYXJhdG9yRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6Y29tcGFyYXRvciBcImk7b2N0ZXRcIiA6YWxsIDppcyBcIkZyb21cIiBcInVTZVJAZE9tQWlOXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSAiLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaUNvbXBhcmF0b3JUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmNvbXBhcmF0b3IgXCJpO2FzY2lpLWNhc2VtYXBcIiA6YWxsIDppcyBcIkZyb21cIiBcInVTZVJAZE9tQWlOXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSAiLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaUNvbXBhcmF0b3JGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDpjb21wYXJhdG9yIFwiaTthc2NpaS1jYXNlbWFwXCIgOmFsbCA6aXMgXCJGcm9tXCIgXCJ1U2VSQGRPbUFpTlwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20gIiwgInVzZXJAZG9tYWluMSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbElzTXVsdGlUcnVlMSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDphbGwgOmlzIFtcIkZyb21cIiwgXCJUb1wiXSBcInVzZXJAZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJUbyIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbElzTXVsdGlUcnVlMigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDphbGwgOmlzIFtcIkZyb21cIiwgXCJUb1wiXSBbXCJ1c2VyQGRvbWFpblwiLCBcInR3ZWV0eUBwaWVcIl0ge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJUbyIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbElzTXVsdGlUcnVlMygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDphbGwgOmlzIFtcIkZyb21cIiwgXCJUb1wiXSBbXCJ1c2VyQGRvbWFpblwiLCBcInR3ZWV0eUBwaWVcIl0ge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJUbyIsICJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzQWxsSXNNdWx0aVRydWU0KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgW1wiRnJvbVwiLCBcIlRvXCJdIFtcInVzZXJAZG9tYWluXCIsIFwidHdlZXR5QHBpZVwiXSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiVG8iLCAidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbE1hdGNoZXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6bWF0Y2hlcyBcIkZyb21cIiBcIipAZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbENvbnRhaW5zVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDphbGwgOmNvbnRhaW5zIFwiRnJvbVwiIFwickBkb21cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzTG9jYWxwYXJ0SXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmxvY2FscGFydCA6aXMgXCJGcm9tXCIgXCJ1c2VyXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0xvY2FscGFydE1hdGNoZXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmxvY2FscGFydCA6bWF0Y2hlcyBcIkZyb21cIiBcIiplclwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NMb2NhbHBhcnRDb250YWluc1RydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6bG9jYWxwYXJ0IDpjb250YWlucyBcIkZyb21cIiBcInJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzRG9tYWluSXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmRvbWFpbiA6aXMgXCJGcm9tXCIgXCJkb21haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NEb21haW5NYXRjaGVzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDpkb21haW4gOm1hdGNoZXMgXCJGcm9tXCIgXCIqbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NEb21haW5Db250YWluc1RydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6ZG9tYWluIDpjb250YWlucyBcIkZyb21cIiBcImRvbVwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NBbGxJc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgXCJGcm9tXCIgXCJ1c2VyQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbE1hdGNoZXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDphbGwgOm1hdGNoZXMgXCJGcm9tXCIgXCIoLiopQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbENvbnRhaW5zRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6YWxsIDpjb250YWlucyBcIkZyb21cIiBcInJAZG9tXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzTG9jYWxwYXJ0SXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDpsb2NhbHBhcnQgOmlzIFwiRnJvbVwiIFwidXNlclwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0xvY2FscGFydE1hdGNoZXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDpsb2NhbHBhcnQgOm1hdGNoZXMgXCJGcm9tXCIgXCIoLiopZXJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NMb2NhbHBhcnRDb250YWluc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmxvY2FscGFydCA6Y29udGFpbnMgXCJGcm9tXCIgXCJyXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWRkcmVzcycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBZGRyZXNzRG9tYWluSXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhZGRyZXNzIDpkb21haW4gOmlzIFwiRnJvbVwiIFwiZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NEb21haW5NYXRjaGVzRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6ZG9tYWluIDptYXRjaGVzIFwiRnJvbVwiIFwiKC4qKW1haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NEb21haW5Db250YWluc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmRvbWFpbiA6Y29udGFpbnMgXCJGcm9tXCIgXCJkb21cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhZGRyZXNzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFkZHJlc3NBbGxJc011bHRpRmFsc2UxKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgW1wiRnJvbVwiLCBcIlRvXCJdIFwidXNlckBkb21haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgImJ1Z3NAYnVubnkiKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiVG8iLCAiYnVnc0BidW5ueSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FkZHJlc3MnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWRkcmVzc0FsbElzTXVsdGlGYWxzZTIoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6YWxsIDppcyBbXCJGcm9tXCIsIFwiVG9cIl0gW1widXNlckBkb21haW5cIiwgXCJ0d2VldHlAcGllXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIkZyb20iLCAiYnVnc0BidW5ueSIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJUbyIsICJidWdzQGJ1bm55Iik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWxsT2ZUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWxsT2ZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjBmMWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FsbE9mVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIEFsbE9mVGVzdAotICovCi1wdWJsaWMgY2xhc3MgQWxsT2ZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWxsb2YnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWxsT2ZGYWxzZVRydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWxsb2YgKGZhbHNlLCB0cnVlKSB7c3RvcDt9IHRocm93VGVzdEV4Y2VwdGlvbjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FsbG9mJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFsbE9mVHJ1ZVRydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWxsb2YgKHRydWUsIHRydWUpIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWxsb2YnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWxsT2ZGYWxzZUZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFsbG9mIChmYWxzZSwgZmFsc2UpIHtzdG9wO30gdGhyb3dUZXN0RXhjZXB0aW9uOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYWxsb2YnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmQWxsT2ZUcnVlRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWxsb2YgKHRydWUsIGZhbHNlKSB7c3RvcDt9IHRocm93VGVzdEV4Y2VwdGlvbjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FueW9mJyB3aXRoIGludmFsaWQgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFueW9mIDEge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQWxsVGVzdHMuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFiOGVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQ2xhc3MgQWxsVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyLnJ1bihBbGxUZXN0cy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuYXBhY2hlLmpzaWV2ZS5qdW5pdCIpOwotICAgICAgICAvLyAkSlVuaXQtQkVHSU4kCi0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShDb25maWd1cmF0aW9uTWFuYWdlclRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKENvbmRpdGlvblRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFJlcXVpcmVUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTdG9wVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoS2VlcFRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKERpc2NhcmRUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShGaWxlSW50b1Rlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFJlamVjdFRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRydWVUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShGYWxzZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKE5vdFRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKEFueU9mVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoQWxsT2ZUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShFeGlzdHNUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShBZGRyZXNzVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoSGVhZGVyVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoU2l6ZVRlc3QuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKEVudmVsb3BlVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoTG9nVGVzdC5jbGFzcykpOwotICAgICAgICAvLyAkSlVuaXQtRU5EJAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FueU9mVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0FueU9mVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGM1M2NkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9BbnlPZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBDbGFzcyBBbnlPZlRlc3QKLSAqLwotcHVibGljIGNsYXNzIEFueU9mVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FueW9mJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFueU9mRmFsc2VUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFueW9mIChmYWxzZSwgdHJ1ZSkge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhbnlvZicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBbnlPZlRydWVUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFueW9mICh0cnVlLCB0cnVlKSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FueW9mJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFueU9mRmFsc2VGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhbnlvZiAoZmFsc2UsIGZhbHNlKSB7c3RvcDt9IHRocm93VGVzdEV4Y2VwdGlvbjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2FueW9mJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkFueU9mVHJ1ZUZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFueW9mICh0cnVlLCBmYWxzZSkge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdhbnlvZicgd2l0aCBpbnZhbGlkIGFyZ3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBcmd1bWVudCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhbnlvZiAxIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0JvZHlUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQm9keVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyNmUwNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQm9keVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuU2lldmVNYWlsQWRhcHRlcjsKLQotLyoqCi0gKiBDbGFzcyBCb2R5VGVzdAotICovCi1wdWJsaWMgY2xhc3MgQm9keVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU2lldmVNYWlsQWRhcHRlciB0ZXh0TWFpbCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLnNldENvbnRlbnQoIldpYmJsZVxuXG4iICsgIldpYmJsZVxuIiwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgcmV0dXJuIG1haWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNpZXZlTWFpbEFkYXB0ZXIgbm9uVGV4dE1haWwoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLAotICAgICAgICAgICAgU2lldmVFeGNlcHRpb24gewotICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yawotICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5zZXRDb250ZW50KG5ldyBNaW1lTXVsdGlwYXJ0KCJpbWFnZS9wbmciKSk7Ci0gICAgICAgIHJldHVybiBtYWlsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYm9keSA6Y29udGFpbnMgW1wiV2liYmxlXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldCh0ZXh0TWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYm9keScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9keUNhc2VJbnNlbnNpdGl2aXR5KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGJvZHkgOmNvbnRhaW5zIFtcIndpYmJsZVwiXSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQodGV4dE1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2JvZHknCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJvZHlOb0NvbnRhaW5zKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGJvZHkgW1wid2liYmxlXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldCh0ZXh0TWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnYm9keScKLSAgICAgKi8KLSAgICAvLyBGSVhNRTogSSBjYW4ndCBmaW5kIGEgbWV0aG9kIG9mIGZvcmNpbmcgdGhlIG1pbWUgdHlwZSwgc28gdGhpcyB0ZXN0Ci0gICAgLy8gYWx3YXlzIGZhaWxzIC4uLgotICAgIC8vIHB1YmxpYyB2b2lkIHRlc3RCb2R5Tm9uVGV4dCgpCi0gICAgLy8gewotICAgIC8vIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgLy8gU3RyaW5nIHNjcmlwdCA9ICJpZiBib2R5IDpjb250YWlucyBbXCJ3aWJibGVcIl0ge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAvLyB0cnkKLSAgICAvLyB7Ci0gICAgLy8gSlVuaXRVdGlscy5pbnRlcnByZXQobm9uVGV4dE1haWwoKSwgc2NyaXB0KTsKLSAgICAvLyB9Ci0gICAgLy8gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKQotICAgIC8vIHsKLSAgICAvLyB9Ci0gICAgLy8gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpCi0gICAgLy8gewotICAgIC8vIH0KLSAgICAvLyBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICAvLyB7Ci0gICAgLy8gfQotICAgIC8vIGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKQotICAgIC8vIHsKLSAgICAvLyBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgIC8vIH0KLSAgICAvLyBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgLy8gfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbmRpdGlvblRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Db25kaXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2M3ZWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbmRpdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5Db21tYW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBDbGFzcyA8Y29kZT5Db25kaXRpb25UZXN0PC9jb2RlPiB0ZXN0cyB0aGUgY29uZGl0aW9uYWwgY29tbWFuZHMgaWYsIGVsc2lmCi0gKiBhbmQgZWxzZS4KLSAqLwotcHVibGljIGNsYXNzIENvbmRpdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdpZicgd2l0aCBhbiBhcmd1bWVudCBvZiAndHJ1ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIHRydWUge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdpZicgd2l0aCBhbiBhcmd1bWVudCBvZiAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZmFsc2Uge3N0b3A7fSB0aHJvd1Rlc3RFeGNlcHRpb247IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdlbHNpZicgd2l0aCBhbiBhcmd1bWVudCBvZiAndHJ1ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxzaWZUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIHtzdG9wO30gZWxzaWYgdHJ1ZSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Vsc2lmJyB3aXRoIGFuIGFyZ3VtZW50IG9mICdmYWxzZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxzaWZGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBmYWxzZSB7c3RvcDt9IGVsc2lmIGZhbHNlIHtzdG9wO30gdGhyb3dUZXN0RXhjZXB0aW9uOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgbmVzdGVkIENvbW1hbmQgJ2Vsc2lmJyB3aXRoIGFuIGFyZ3VtZW50IG9mICd0cnVlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNpZkZhbHNlRWxzaWZUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIHtzdG9wO30gZWxzaWYgZmFsc2Uge3N0b3A7fSBlbHNpZiB0cnVlIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnZWxzZScgYWZ0ZXIgJ2Vsc2VpZicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxzaWZGYWxzZUVsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZmFsc2Uge3N0b3A7fSBlbHNpZiBmYWxzZSB7c3RvcDt9IGVsc2Uge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdlbHNlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIHtzdG9wO30gZWxzZSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Vsc2UnIG91dCBvZiBzZXF1ZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZlNlcXVlbmNlRWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJlbHNlIHtzdG9wO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnZWxzaWYnIG91dCBvZiBzZXF1ZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZlNlcXVlbmNlRWxzaWYoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiZWxzaWYge3N0b3A7fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2lmJyB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBCbG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZk1pc3NpbmdCbG9jaygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiB0cnVlIHN0b3A7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnaWYnIHdpdGhvdXQgYSB0ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmTWlzc2luZ1Rlc3QoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYge3N0b3A7fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2lmJyB3aXRob3V0IGEgdGVzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNpZk1pc3NpbmdUZXN0KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIHtzdG9wO30gZWxzaWYge3N0b3A7fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Vsc2lmJyB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBCbG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNpZk1pc3NpbmdCbG9jaygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBmYWxzZSB7c3RvcDt9IGVsc2lmIHRydWUgc3RvcDsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdlbHNlJyB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBCbG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNlTWlzc2luZ0Jsb2NrKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIHtzdG9wO30gZWxzZSBzdG9wOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2lmJyBuZXN0ZWQgaW4gYSBibG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRJZigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiB0cnVlIHtpZiB0cnVlIHt0aHJvd1Rlc3RFeGNlcHRpb247fX0iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Vsc2UnIG91dCBvZiBzZXF1ZW5jZSBuZXN0ZWQgaW4gYSBibG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRPdXRPZlNlcXVlbmNlRWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiB0cnVlIHtlbHNlIHtzdG9wO319IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Vsc2lmJyBvdXQgb2Ygc2VxdWVuY2UgbmVzdGVkIGluIGEgYmxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkT3V0T2ZTZXF1ZW5jZUVsc2lmKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIHRydWUge2Vsc2lmIHRydWUge3N0b3A7fX0iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjQ3YWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0NvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlclRlc3QKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIENvbW1hbmRNYXAgbWFwcyAnTVVTVCcgYW5kICdTSE9VTEQnIGJlIHN1cHBvcnRlZCBjb21tYW5kcyB0byB0aGUKLSAgICAgKiBjb3JyZWN0IGNsYXNzZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1hbmRNYXAoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIC8vIENvbmRpdGlvbiBDb21tYW5kcwotICAgICAgICAvLyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGVzZToKLSAgICAgICAgbWFwLnB1dCgiaWYiLCAib3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuSWYiKTsKLSAgICAgICAgbWFwLnB1dCgiZWxzZSIsICJvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5FbHNlIik7Ci0gICAgICAgIG1hcC5wdXQoImVsc2lmIiwgIm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2lmIik7Ci0gICAgICAgIG1hcC5wdXQoInJlcXVpcmUiLCAib3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuUmVxdWlyZSIpOwotICAgICAgICBtYXAucHV0KCJzdG9wIiwgIm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlN0b3AiKTsKLQotICAgICAgICAvLyBBY3Rpb24gQ29tbWFuZHMKLSAgICAgICAgLy8gUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlc2U6Ci0gICAgICAgIG1hcC5wdXQoImtlZXAiLCAib3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuS2VlcCIpOwotICAgICAgICBtYXAucHV0KCJkaXNjYXJkIiwgIm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkRpc2NhcmQiKTsKLSAgICAgICAgbWFwLnB1dCgicmVkaXJlY3QiLCAib3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuUmVkaXJlY3QiKTsKLSAgICAgICAgLy8gUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBTSE9VTEQgc3VwcG9ydCB0aGVzZToKLSAgICAgICAgbWFwLnB1dCgicmVqZWN0IiwgIm9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLlJlamVjdCIpOwotICAgICAgICBtYXAucHV0KCJmaWxlaW50byIsICJvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbC5GaWxlSW50byIpOwotCi0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXAgY29tbWFuZE1hcCA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbW1hbmRNYXAoKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgbWFwSXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobWFwSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBtYXBJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJLZXk6ICIgKyBlbnRyeS5nZXRLZXkoKSwgY29tbWFuZE1hcAotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsdWU6ICIgKyBlbnRyeS5nZXRWYWx1ZSgpLCBjb21tYW5kTWFwLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpKS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgVGVzdE1hcCBtYXBzICdNVVNUJyBhbmQgJ1NIT1VMRCcgYmUgc3VwcG9ydGVkIHRlc3RzIHRvIHRoZQotICAgICAqIGNvcnJlY3QgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdE1hcCgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAvLyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGVzZSB0ZXN0czoKLSAgICAgICAgbWFwLnB1dCgiYWRkcmVzcyIsICJvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzIik7Ci0gICAgICAgIG1hcC5wdXQoImFsbG9mIiwgIm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFsbE9mIik7Ci0gICAgICAgIG1hcC5wdXQoImFueW9mIiwgIm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkFueU9mIik7Ci0gICAgICAgIG1hcC5wdXQoImV4aXN0cyIsICJvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5FeGlzdHMiKTsKLSAgICAgICAgbWFwLnB1dCgiZmFsc2UiLCAib3JnLmFwYWNoZS5qc2lldmUudGVzdHMuRmFsc2UiKTsKLSAgICAgICAgbWFwLnB1dCgiaGVhZGVyIiwgIm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLkhlYWRlciIpOwotICAgICAgICBtYXAucHV0KCJub3QiLCAib3JnLmFwYWNoZS5qc2lldmUudGVzdHMuTm90Iik7Ci0gICAgICAgIG1hcC5wdXQoInNpemUiLCAib3JnLmFwYWNoZS5qc2lldmUudGVzdHMuU2l6ZSIpOwotICAgICAgICBtYXAucHV0KCJ0cnVlIiwgIm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLlRydWUiKTsKLQotICAgICAgICAvLyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIFNIT1VMRCBzdXBwb3J0IHRoZSAiZW52ZWxvcGUiIHRlc3QuCi0gICAgICAgIG1hcC5wdXQoImVudmVsb3BlIiwgIm9yZy5hcGFjaGUuanNpZXZlLnRlc3RzLm9wdGlvbmFsLkVudmVsb3BlIik7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcCB0ZXN0TWFwID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0VGVzdE1hcCgpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBtYXBJdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChtYXBJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIG1hcEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIktleTogIiArIGVudHJ5LmdldEtleSgpLCB0ZXN0TWFwLmNvbnRhaW5zS2V5KGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJWYWx1ZTogIiArIGVudHJ5LmdldFZhbHVlKCksIHRlc3RNYXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkpLmVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChTaWV2ZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBDb21tcGFyYXRvck1hcCBtYXBzICdNVVNUJyBhbmQgJ1NIT1VMRCcgYmUgc3VwcG9ydGVkIGNvbXBhcmF0b3JzCi0gICAgICogdG8gdGhlIGNvcnJlY3QgY2xhc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyYXRvck1hcCgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAvLyBSRkMzMDgyIC0gUmVxdWlyZWQgQ29tcGFyYXRvcnMKLSAgICAgICAgbWFwLnB1dCgiaTtvY3RldCIsICJvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5PY3RldCIpOwotICAgICAgICBtYXAKLSAgICAgICAgICAgICAgICAucHV0KCJpO2FzY2lpLWNhc2VtYXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3JzLkFzY2lpQ2FzZW1hcCIpOwotCi0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXAgY29tcGFyYXRvck1hcCA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldENvbXBhcmF0b3JNYXAoKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgbWFwSXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobWFwSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBtYXBJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJLZXk6ICIgKyBlbnRyeS5nZXRLZXkoKSwgY29tcGFyYXRvck1hcAotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsdWU6ICIgKyBlbnRyeS5nZXRWYWx1ZSgpLCBjb21wYXJhdG9yTWFwLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpKS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRGlzY2FyZFRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9EaXNjYXJkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ2Nzc1Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9EaXNjYXJkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIERpc2NhcmRUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjYXJkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Rpc2NhcmQnIHdpdGggaW52YWxpZCBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50cygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJkaXNjYXJkIDEgOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2Rpc2NhcmQnIHdpdGggYW4gaW52YWxpZCBibG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmxvY2soKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiZGlzY2FyZCAxIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnZGlzY2FyZCcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY2FyZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJkaXNjYXJkOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRW52ZWxvcGVUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRW52ZWxvcGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWQyMTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0VudmVsb3BlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5TaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgRW52ZWxvcGVUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbnZlbG9wZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbElzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDppcyBcIkZyb21cIiBcInVzZXJAZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlSW5zZW5zaXRpdmVFbnZlbG9wZU5hbWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmFsbCA6aXMgXCJmcm9tXCIgXCJ1c2VyQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0ZXRDb21wYXJhdG9yVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6Y29tcGFyYXRvciBcImk7b2N0ZXRcIiA6YWxsIDppcyBcIkZyb21cIiBcInVTZVJAZE9tQWlOXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1U2VSQGRPbUFpTiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPY3RldENvbXBhcmF0b3JGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6Y29tcGFyYXRvciBcImk7b2N0ZXRcIiA6YWxsIDppcyBcIkZyb21cIiBcInVTZVJAZE9tQWlOXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaUNvbXBhcmF0b3JUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpjb21wYXJhdG9yIFwiaTthc2NpaS1jYXNlbWFwXCIgOmFsbCA6aXMgXCJGcm9tXCIgXCJ1U2VSQGRPbUFpTlwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNjaWlDb21wYXJhdG9yRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmNvbXBhcmF0b3IgXCJpO2FzY2lpLWNhc2VtYXBcIiA6YWxsIDppcyBcIkZyb21cIiBcInVTZVJAZE9tQWlOXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1c2VyQGRvbWFpbjEiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbElzTXVsdGlUcnVlMSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDppcyBbXCJGcm9tXCIsIFwiVG9cIl0gXCJ1c2VyQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVUbygidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbElzTXVsdGlUcnVlMigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDppcyBbXCJGcm9tXCIsIFwiVG9cIl0gW1widXNlckBkb21haW5cIiwgXCJ0d2VldHlAcGllXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVUbygidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbElzTXVsdGlUcnVlMygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDppcyBbXCJGcm9tXCIsIFwiVG9cIl0gW1widXNlckBkb21haW5cIiwgXCJ0d2VldHlAcGllXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVUbygidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkVudmVsb3BlQWxsSXNNdWx0aVRydWU0KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDphbGwgOmlzIFtcIkZyb21cIiwgXCJUb1wiXSBbXCJ1c2VyQGRvbWFpblwiLCBcInR3ZWV0eUBwaWVcIl0ge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlVG8oInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbE1hdGNoZXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDphbGwgOm1hdGNoZXMgXCJGcm9tXCIgXCIqQGRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbENvbnRhaW5zVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDpjb250YWlucyBcIkZyb21cIiBcInJAZG9tXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkVudmVsb3BlTG9jYWxwYXJ0SXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpsb2NhbHBhcnQgOmlzIFwiRnJvbVwiIFwidXNlclwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidXNlckBkb21haW4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUxvY2FscGFydE1hdGNoZXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpsb2NhbHBhcnQgOm1hdGNoZXMgXCJGcm9tXCIgXCIqZXJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVMb2NhbHBhcnRDb250YWluc1RydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmxvY2FscGFydCA6Y29udGFpbnMgXCJGcm9tXCIgXCJyXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ1c2VyQGRvbWFpbiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkVudmVsb3BlRG9tYWluSXNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpkb21haW4gOmlzIFwiRnJvbVwiIFwiZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVEb21haW5NYXRjaGVzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6ZG9tYWluIDptYXRjaGVzIFwiRnJvbVwiIFwiKm1haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVEb21haW5Db250YWluc1RydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmRvbWFpbiA6Y29udGFpbnMgXCJGcm9tXCIgXCJkb21cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInVzZXJAZG9tYWluIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVBbGxJc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDphbGwgOmlzIFwiRnJvbVwiIFwidXNlckBkb21haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbE1hdGNoZXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6YWxsIDptYXRjaGVzIFwiRnJvbVwiIFwiKC4qKUBkb21haW5cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oImJ1Z3NAYnVubnkiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbENvbnRhaW5zRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmFsbCA6Y29udGFpbnMgXCJGcm9tXCIgXCJyQGRvbVwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkVudmVsb3BlTG9jYWxwYXJ0SXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6bG9jYWxwYXJ0IDppcyBcIkZyb21cIiBcInVzZXJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUxvY2FscGFydE1hdGNoZXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6bG9jYWxwYXJ0IDptYXRjaGVzIFwiRnJvbVwiIFwiKC4qKWVyXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVMb2NhbHBhcnRDb250YWluc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpsb2NhbHBhcnQgOmNvbnRhaW5zIFwiRnJvbVwiIFwiclwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlRW52ZWxvcGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlRnJvbSgidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2VudmVsb3BlJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZkVudmVsb3BlRG9tYWluSXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBlbnZlbG9wZSA6ZG9tYWluIDppcyBcIkZyb21cIiBcImRvbWFpblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVEb21haW5NYXRjaGVzRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmRvbWFpbiA6bWF0Y2hlcyBcIkZyb21cIiBcIiguKiltYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVEb21haW5Db250YWluc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDpkb21haW4gOmNvbnRhaW5zIFwiRnJvbVwiIFwiZG9tXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZW52ZWxvcGUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRW52ZWxvcGVBbGxJc011bHRpRmFsc2UxKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGVudmVsb3BlIDphbGwgOmlzIFtcIkZyb21cIiwgXCJUb1wiXSBcInVzZXJAZG9tYWluXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVFbnZlbG9wZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVGcm9tKCJidWdzQGJ1bm55Iik7Ci0gICAgICAgICAgICBtYWlsLnNldEVudmVsb3BlVG8oImJ1Z3NAYnVubnkiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdlbnZlbG9wZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZFbnZlbG9wZUFsbElzTXVsdGlGYWxzZTIoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZW52ZWxvcGUgOmFsbCA6aXMgW1wiRnJvbVwiLCBcIlRvXCJdIFtcInVzZXJAZG9tYWluXCIsIFwidHdlZXR5QHBpZVwiXSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZUVudmVsb3BlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5zZXRFbnZlbG9wZUZyb20oImJ1Z3NAYnVubnkiKTsKLSAgICAgICAgICAgIG1haWwuc2V0RW52ZWxvcGVUbygiYnVnc0BidW5ueSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0V4aXN0c1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9FeGlzdHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZmYwNGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0V4aXN0c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLlNpZXZlTWFpbEFkYXB0ZXI7Ci0KLS8qKgotICogQ2xhc3MgRXhpc3RzVGVzdAotICovCi1wdWJsaWMgY2xhc3MgRXhpc3RzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2V4aXN0cycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBleGlzdHMgXCJGcm9tXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdleGlzdHMnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENhc2VJbnNlbnNpdGl2aXR5KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGV4aXN0cyBcIkZyb21cIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoImZyb20iLCAidHdlZXR5QHBpZSIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2V4aXN0cycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzVHJ1ZVRydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZXhpc3RzIFtcIkZyb21cIiwgXCJYLUZpbGVzXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIlgtRmlsZXMiLCAic3Bvb2tzQGV2ZXJ5d2hlcmUiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdleGlzdHMnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4aXN0c1RydWVGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBleGlzdHMgW1wiRnJvbVwiLCBcIlgtRmlsZXNcIl0ge3N0b3A7fSB0aHJvd1Rlc3RFeGNlcHRpb247IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiRnJvbSIsICJ0d2VldHlAcGllIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnZXhpc3RzJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGlzdHNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBleGlzdHMgXCJGcm9tXCIge3N0b3A7fSB0aHJvd1Rlc3RFeGNlcHRpb247IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2V4aXN0cycKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzRmFsc2VGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBleGlzdHMgW1wiRnJvbVwiLCBcIlgtRmlsZXNcIl0ge3N0b3A7fSB0aHJvd1Rlc3RFeGNlcHRpb247IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2V4aXN0cycgd2l0aCBpbnZhbGlkIG51bWVyaWMgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE51bWVyaWNBcmd1bWVudCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBleGlzdHMgMSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdleGlzdHMnIHdpdGggaW52YWxpZCB0ZXN0IGFyZ3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUZXN0QXJndW1lbnQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZXhpc3RzIG5vdCB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9GYWxzZVRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9GYWxzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjOTJkZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRmFsc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBDbGFzcyBGYWxzZVRlc3QKLSAqLwotcHVibGljIGNsYXNzIEZhbHNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ3RydWUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdElmRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgZmFsc2Uge3N0b3A7fSB0aHJvd1Rlc3RFeGNlcHRpb247IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICd0cnVlJyB3aXRoIGludmFsaWQgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGZhbHNlIDEge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRmlsZUludG9UZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvRmlsZUludG9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOWQzZjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0ZpbGVJbnRvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIEZpbGVJbnRvVGVzdAotICovCi1wdWJsaWMgY2xhc3MgRmlsZUludG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnZmlsZWludG8nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVJbnRvKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImZpbGVpbnRvIFwiSU5CT1gudGVzdDFcIjsgZmlsZWludG8gXCJJTkJPWC50ZXN0MlwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLnNpemUoKSA9PSAyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFpbC5nZXRBY3Rpb25zKCkuZ2V0KDApIGluc3RhbmNlb2YgQWN0aW9uRmlsZUludG8pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoKEFjdGlvbkZpbGVJbnRvKSBtYWlsLmdldEFjdGlvbnMoKS5nZXQoMCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZXN0aW5hdGlvbigpLmVxdWFscygiSU5CT1gudGVzdDEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLmdldCgxKSBpbnN0YW5jZW9mIEFjdGlvbkZpbGVJbnRvKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKChBY3Rpb25GaWxlSW50bykgbWFpbC5nZXRBY3Rpb25zKCkuZ2V0KDEpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVzdGluYXRpb24oKS5lcXVhbHMoIklOQk9YLnRlc3QyIikpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2ZpbGVpbnRvJyB3aXRoIGR1cGxpY2F0ZSBkZXN0aW5hdGlvbnMuIE9ubHkgb25lCi0gICAgICogQWN0aW9uRmlsZUludG8gc2hvdWxkIHJlc3VsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRmlsZUludG8oKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiZmlsZWludG8gXCJJTkJPWC50ZXN0MVwiOyBmaWxlaW50byBcIklOQk9YLnRlc3QxXCI7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFpbC5nZXRBY3Rpb25zKCkuc2l6ZSgpID09IDEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5nZXQoMCkgaW5zdGFuY2VvZiBBY3Rpb25GaWxlSW50byk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCgoQWN0aW9uRmlsZUludG8pIG1haWwuZ2V0QWN0aW9ucygpLmdldCgwKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldERlc3RpbmF0aW9uKCkuZXF1YWxzKCJJTkJPWC50ZXN0MSIpKTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdmaWxlaW50bycgd2l0aCBhbiBpbnZhbGlkIGFyZ3VtZW50IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50VHlwZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJmaWxlaW50byAxIDsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdmaWxlaW50bycgd2l0aCBhbiBpbnZhbGlkIGFyZ3VtZW50IG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJndW1lbnROdW1iZXIoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiZmlsZWludG8gW1wiSU5CT1gudGVzdFwiLCBcImVsc2V3aGVyZVwiXTsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdmaWxlaW50bycgd2l0aCBhbiBpbnZhbGlkIGJsb2NrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRCbG9jaygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJmaWxlaW50byAxIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0hlYWRlclRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9IZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZjA3ZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0hlYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5TaWV2ZU1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIEhlYWRlclRlc3QKLSAqLwotcHVibGljIGNsYXNzIEhlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcklzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFwiWC1DYWZmZWluZVwiIFwiQzhIMTBONE8yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsICJDOEgxME40TzIiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckNhc2VJbnNlbnNpdGl2aXR5KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6aXMgXCJYLUNhZmZlaW5lXCIgXCJDOEgxME40TzJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJ4LWNhZmZlaW5lIiwgIkM4SDEwTjRPMiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVySXNUcnVlTXVsdGkxKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6aXMgW1wiWC1EZWNhZlwiLCBcIlgtQ2FmZmVpbmVcIl0gXCJDOEgxME40TzJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLUNhZmZlaW5lIiwgIkM4SDEwTjRPMiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVySXNGYWxzZU11bHRpMSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFtcIlgtRGVjYWZcIiwgXCJYLUNhZmZlaW5lXCJdIFwiQzhIMTBONE8yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsICJzdHVmZiIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLURlY2FmIiwgIm1vcmUgc3R1ZmYiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcklzVHJ1ZU11bHRpMigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFwiWC1DYWZmZWluZVwiIFtcImFic2VudFwiLCBcIkM4SDEwTjRPMlwiXSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLUNhZmZlaW5lIiwgIkM4SDEwTjRPMiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVySXNUcnVlTXVsdGkzKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6aXMgW1wiWC1EZWNhZlwiLCBcIlgtQ2FmZmVpbmVcIl0gW1wiYWJzZW50XCIsIFwiQzhIMTBONE8yXCJdIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIlgtQ2FmZmVpbmUiLCAic3R1ZmYiKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1EZWNhZiIsICJDOEgxME40TzIiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcklzRmFsc2VWYWx1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFwiWC1DYWZmZWluZVwiIFwiQzhIMTBONE8yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsICJDOEgxME40TyIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVySXNGYWxzZUhlYWRlcigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFwiWC1DYWZmZWluZVwiIFwiQzhIMTBONE8yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluIiwgIkM4SDEwTjRPMiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ2hlYWRlcicKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyQ29udGFpbnNUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6Y29udGFpbnMgXCJYLUNhZmZlaW5lXCIgXCJDOEgxMFwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIlgtQ2FmZmVpbmUiLCAiQzhIMTBONE8yIik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnaGVhZGVyJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJDb250YWluc0ZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6aXMgXCJYLUNhZmZlaW5lXCIgXCJDOEgxME40TzJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLUNhZmZlaW5lIiwgIml6enkiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckNvbnRhaW5zTnVsbFRydWUoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgaGVhZGVyIDpjb250YWlucyBcIlgtQ2FmZmVpbmVcIiBcIlwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIlgtQ2FmZmVpbmUiLCBudWxsKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcklzTnVsbEZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6aXMgXCJYLUNhZmZlaW5lXCIgXCJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLUNhZmZlaW5lIiwgbnVsbCk7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnaGVhZGVyJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJNYXRjaGVzVHJ1ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOm1hdGNoZXMgXCJYLUNhZmZlaW5lXCIgXCIqMTBOP08yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsICJDOEgxME40TzIiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdoZWFkZXInCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlck1hdGNoZXNGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOm1hdGNoZXMgXCJYLUNhZmZlaW5lXCIgXCIqMTBOP08yXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsICJDOEgxME40TzMiKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBzcXVhcmUgYnJhY2tldHMgaW4gbWF0Y2hpbmcgaGVhZGVycyBXaGVuIHRoZSAiWyIgaXMgaW4gdGhlIGZpcnN0Ci0gICAgICogY2hhciBvZiB0aGUgcGF0dGVybiBpdCBkb2VzIG5vdCBtYXRjaGVzLgotICAgICAqIAotICAgICAqIFNlZSBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTE5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNxdWFyZUJyYWNrZXRzSW5NYXRjaCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOm1hdGNoZXMgXCJYLUNhZmZlaW5lXCIgXCJbdGVzdCpcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLUNhZmZlaW5lIiwgIlt0ZXN0XSBteSBzdWJqZWN0Iik7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igc3BlY2lhbCBjaGFyIGVzY2FwaW5nOiBcXD8gaXMgYSA/IGFuZCBcXCogaXMgYW4gKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsQ2hhcnNFc2NhcGluZ0luTWF0Y2goKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgaGVhZGVyIDptYXRjaGVzIFwiWC1DYWZmZWluZVwiIFwibXksXFxcXCw/LFxcPyxcXFxcPywqLFxcKixcXFxcKixwYXR0ZXJuXCIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLmFkZEhlYWRlcigiWC1DYWZmZWluZSIsCi0gICAgICAgICAgICAgICAgICAgICJteSxcXCx4LHgsPyxmb28sYmFyLCoscGF0dGVybiIpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHNwZWNpYWwgY2hhciBlc2NhcGluZzogXFw/IGlzIGEgPyBhbmQgXFwqIGlzIGFuICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lhbENoYXJzRXNjYXBpbmdJbk1hdGNoRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgaGVhZGVyIDptYXRjaGVzIFwiWC1DYWZmZWluZVwiIFwibXksPyxcXD8sXFxcXD8sKixcXCosXFxcXCoscGF0dGVyblwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoIlgtQ2FmZmVpbmUiLAotICAgICAgICAgICAgICAgICAgICAibXkseCx4LHEsZm9vLGJhciwqLHBhdHRlcm4iKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9LZWVwVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0tlZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzU5ZjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0tlZXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25LZWVwOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIEtlZXBUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBLZWVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2tlZXAnIHdpdGggaW52YWxpZCBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50cygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJrZWVwIDEgOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2tlZXAnIHdpdGggYW4gaW52YWxpZCBibG9jawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmxvY2soKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAia2VlcCAxIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2tlZXAnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEtlZXAoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAia2VlcDsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLmdldCgwKSBpbnN0YW5jZW9mIEFjdGlvbktlZXApOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0xpdGVyYWxFc2NhcGVUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTGl0ZXJhbEVzY2FwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxNTI5ZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTGl0ZXJhbEVzY2FwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5TaWV2ZU1haWxBZGFwdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTGl0ZXJhbEVzY2FwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSAicmVxdWlyZSBbXCJmaWxlaW50b1wiLCBcInJlamVjdFwiXTsiICsKLSAgICAiIiArCi0gICAgIiMgdGVzdCIgKwotICAgICJpZiBhbGxvZiAoaGVhZGVyIDpjb250YWlucyBcInRvXCIgXCJcXFxcXCIpIHsiICsKLSAgICAiICAgIGtlZXA7IiArCi0gICAgIiAgICBzdG9wOyIgKwotICAgICJ9IiArCi0gICAgIiIgKwotICAgICIjIHRlc3QyIiArCi0gICAgImlmIGFueW9mIChoZWFkZXIgOmNvbnRhaW5zIFwic3ViamVjdFwiIFwiZm9vXCIpIHsiICsKLSAgICAiICAgIGtlZXA7IiArCi0gICAgIiAgICBzdG9wOyIgKwotICAgICJ9IjsgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWNrU2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5hZGRIZWFkZXIoInRvIiwgInR3ZWV0eUBwaWUiKTsKLSAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgU0NSSVBUKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTG9nVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL0xvZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1OWY5NS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTG9nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIExvZ1Rlc3QKLSAqLwotcHVibGljIGNsYXNzIExvZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdsb2cnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dEZWJ1ZygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJsb2cgOmRlYnVnIFwiTG9nIGEgZGVidWcgbWVzc2FnZS5cIjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdsb2cnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dFcnJvcigpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJsb2cgOmVycm9yIFwiTG9nIGFuIGVycm9yIG1lc3NhZ2UuXCI7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnbG9nJy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nRmF0YWwoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAibG9nIDpmYXRhbCBcIkxvZyBhIGZhdGFsIG1lc3NhZ2UuXCI7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnbG9nJy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nSW5mbygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJsb2cgOmluZm8gXCJMb2cgYW4gaW5mbyBtZXNzYWdlLlwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2xvZycuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ1RyYWNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImxvZyA6dHJhY2UgXCJMb2cgYSB0cmFjZSBtZXNzYWdlLlwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2xvZycuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ1dhcm4oKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAibG9nIDp3YXJuIFwiTG9nIGEgd2FybmluZyBtZXNzYWdlLlwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ2xvZycuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExvZ0RlZmF1bHQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAibG9nIFwiTG9nIGEgZGVmYXVsdCBtZXNzYWdlLlwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL011bHRpbGluZVRleHRUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTXVsdGlsaW5lVGV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5NDdhOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTXVsdGlsaW5lVGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uUmVqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIFJlamVjdFRlc3QKLSAqLwotcHVibGljIGNsYXNzIE11bHRpbGluZVRleHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYSBtdWx0aWxpbmUgbWVzc2FnZSBpcyBjb3JyZWN0bHkgcGFzc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdE11bHRpbGluZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhpcyBpcyBub3QgYSBsb3ZlIHNvbmciOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdCB0ZXh0OlxuIiArIG1lc3NhZ2UgKyAiXG4uXG47IjsKLSAgICAgICAgQWN0aW9uUmVqZWN0IHJlamVjdGlvbiA9IHJ1blJlamVjdFNjcmlwdChzY3JpcHQpOyAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCByZWplY3Rpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIG11bHRpbGluZSBtZXNzYWdlIGlzIGNvcnJlY3RseSBwYXNzZWQgd2hlbiB3aGl0ZXNwYWNlIGlzIGluc2VydGVkCi0gICAgICogYmV0d2VlbiB0aGUgY29tbWFuZCBhbmQgdGhlIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdE11bHRpbGluZU1lc3NhZ2VXaXRoV2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJUaGlzIGlzIG5vdCBhIGxvdmUgc29uZyI7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVqZWN0IHRleHQ6IFx0IFx0IFxuIiArIG1lc3NhZ2UgKyAiXG4uXG47IjsKLSAgICAgICAgQWN0aW9uUmVqZWN0IHJlamVjdGlvbiA9IHJ1blJlamVjdFNjcmlwdChzY3JpcHQpOyAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCByZWplY3Rpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgYSBtdWx0aWxpbmUgbWVzc2FnZSBpcyBjb3JyZWN0bHkgcGFzc2VkIHdoZW4gZG90cyB3aXRoaW4gYSBsaW5lCi0gICAgICogYmV0d2VlbiB0aGUgY29tbWFuZCBhbmQgdGhlIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdE11bHRpbGluZU1lc3NhZ2VXaXRoRG90c01pZGxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhpcyBpcyBub3QuLi4uLmEgbG92ZSBzb25nIjsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgdGV4dDpcbiIgKyBtZXNzYWdlICsgIlxuLlxuOyI7Ci0gICAgICAgIEFjdGlvblJlamVjdCByZWplY3Rpb24gPSBydW5SZWplY3RTY3JpcHQoc2NyaXB0KTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgcmVqZWN0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgbXVsdGlsaW5lIG1lc3NhZ2Ugd2l0aCBkb3Qgc3R1ZmZpbmcgaXMgY29ycmVjdGx5IGRlY29kZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdE11bHRpbGluZU1lc3NhZ2VXaXRoRG90U3R1ZmZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmVPbmUgPSAiVGhpcyBpcyBub3RcbiI7Ci0gICAgICAgIFN0cmluZyBsaW5lVHdvID0gIi5BIExvdmUgU3RvcnkiOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdCB0ZXh0OlxuIiArIGxpbmVPbmUgKyAnLicgKyBsaW5lVHdvICsgIlxuLlxuOyI7Ci0gICAgICAgIEFjdGlvblJlamVjdCByZWplY3Rpb24gPSBydW5SZWplY3RTY3JpcHQoc2NyaXB0KTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobGluZU9uZSArIGxpbmVUd28sIHJlamVjdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgbXVsdGlsaW5lIG1lc3NhZ2Ugd2l0aCBtaXNzZWQgZG90IHN0dWZmaW5nIGlzIGNvcnJlY3RseSBkZWNvZGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWplY3RNdWx0aWxpbmVNZXNzYWdlV2l0aE1pc3NlZERvdFN0dWZmaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lT25lID0gIlRoaXMgaXMgbm90XG4iOwotICAgICAgICBTdHJpbmcgbGluZVR3byA9ICIuQSBMb3ZlIFN0b3J5IjsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgdGV4dDpcbiIgKyBsaW5lT25lICsgbGluZVR3byArICJcbi5cbjsiOwotICAgICAgICBBY3Rpb25SZWplY3QgcmVqZWN0aW9uID0gcnVuUmVqZWN0U2NyaXB0KHNjcmlwdCk7ICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpbmVPbmUgKyBsaW5lVHdvLCByZWplY3Rpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCBhIG11bHRpbGluZSBtZXNzYWdlIHdpdGggbWFueSBkb3RzIHN0dWZmZWQgaXMgY29ycmVjdGx5IGRlY29kZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE51bWJlck9mU3R1ZmZlZERvdHNJbk11bHRpbGluZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmVPbmUgPSAiVGhpcyBpcyBsaW5lIDEuXG4iOwotICAgICAgICBTdHJpbmcgbGluZVR3byA9ICJUaGlzIGlzIGxpbmUgMi5cbiI7Ci0gICAgICAgIFN0cmluZyBsaW5lVGhyZWUgPSAiLi4uLi4uLi4gVGhpcyBpcyBsaW5lIDMuXG4iOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdCB0ZXh0OlxuIiArIGxpbmVPbmUgKyBsaW5lVHdvICsgJy4nICsgbGluZVRocmVlICsgIlxuLlxuOyI7Ci0gICAgICAgIEFjdGlvblJlamVjdCByZWplY3Rpb24gPSBydW5SZWplY3RTY3JpcHQoc2NyaXB0KTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobGluZU9uZSArIGxpbmVUd28gKyBsaW5lVGhyZWUsIHJlamVjdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IGEgbXVsdGlsaW5lIG1lc3NhZ2Ugd2l0aCBtYW55IGRvdHMgc3R1ZmZlZCBpcyBjb3JyZWN0bHkgZGVjb2RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2VjdXRpdmVEb3RTdHVmZmVkTGluZUluTXVsdGlsaW5lTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZU9uZSA9ICJUaGlzIGlzIGxpbmUgMS5cbiI7Ci0gICAgICAgIFN0cmluZyBsaW5lVHdvID0gIlRoaXMgaXMgbGluZSAyLlxuIjsKLSAgICAgICAgU3RyaW5nIGxpbmVUaHJlZSA9ICIuLi4uLi4uLiBUaGlzIGlzIGxpbmUgMy5cbiI7Ci0gICAgICAgIFN0cmluZyBsaW5lRm91ciA9ICIuXG4iOwotICAgICAgICBTdHJpbmcgbGluZUZpdmUgPSAiLlxuIjsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgdGV4dDpcbiIgKyBsaW5lT25lICsgbGluZVR3byArICcuJyArIGxpbmVUaHJlZSArICcuJyArIGxpbmVGb3VyICsgJy4nICsgbGluZUZpdmUgKyAiXG4uXG47IjsKLSAgICAgICAgQWN0aW9uUmVqZWN0IHJlamVjdGlvbiA9IHJ1blJlamVjdFNjcmlwdChzY3JpcHQpOyAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhsaW5lT25lICsgbGluZVR3byArIGxpbmVUaHJlZSArIGxpbmVGb3VyICsgbGluZUZpdmUsIHJlamVjdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEFjdGlvblJlamVjdCBydW5SZWplY3RTY3JpcHQoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIE9iamVjdCBhY3Rpb24gPSBtYWlsLmdldEFjdGlvbnMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uUmVqZWN0KTsKLSAgICAgICAgQWN0aW9uUmVqZWN0IHJlamVjdGlvbiA9IChBY3Rpb25SZWplY3QpIGFjdGlvbjsKLSAgICAgICAgcmV0dXJuIHJlamVjdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTXVsdGlwbGVSZXF1aXJlVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL011bHRpcGxlUmVxdWlyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNDI3Yi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTXVsdGlwbGVSZXF1aXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotcHVibGljIGNsYXNzIE11bHRpcGxlUmVxdWlyZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOSU1BTF9TSUVWRSA9ICJyZXF1aXJlIFtcImZpbGVpbnRvXCIsIFwicmVqZWN0XCJdO1xuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBMRV9SRVFVSVJFRF9TSUVWRSA9ICIjIFxuIgotICAgICAgICAgICAgKyAiIyBTdGFydCB3aXRoIHNvbWUgY29tbWVudHNcbiIgKyAiIyBXaGF0ZXZlclxuIiArICIjXG4iICsgIlxuIgotICAgICAgICAgICAgKyBNSU5JTUFMX1NJRVZFICsgIlxuIiArICIjXG4iICsgIiMgTGV0cyBoYXZlIHNvbWUgbW9yZSBjb21tZW50c1xuIgotICAgICAgICAgICAgKyAiI1xuIiArICJcbiI7Ci0KLSAgICBNYWlsQWRhcHRlciBtYWlsOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5pbWFsU2NyaXB0TXVsdGlwbGVSZXF1aXJlZFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgTUlOSU1BTF9TSUVWRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdE11bHRpcGxlUmVxdWlyZWRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIE1VTFRJUExFX1JFUVVJUkVEX1NJRVZFKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTXVsdGlwbGVUb1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9NdWx0aXBsZVRvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMyZWVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9NdWx0aXBsZVRvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWwuY2hlY2suU2NyaXB0Q2hlY2tlcjsKLQotcHVibGljIGNsYXNzIE11bHRpcGxlVG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTE9fVE9fRU1BSUwgPSAiRGF0ZTogU3VuLCAxIEFwciAyMDA3IDExMDA6MDA6MDAgKzAxMDAgKEJTVClcclxmIgotICAgICAgICAgICAgKyAiRnJvbTogcm9hZHJ1bm5lckBhY21lLmV4YW1wbGUuY29tXHJcZiIKLSAgICAgICAgICAgICsgIlRvOiBjb3lvdGVAZGVzZXJ0LmV4YW1wbGUub3JnXHJcZiIKLSAgICAgICAgICAgICsgIlN1YmplY3Q6IFdobydzIFRoZSBGb29sP1xyXGYiICsgIlxyXGYiICsgIkJlZXAtQmVlcFxyXGYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUExFX1RPX0VNQUlMID0gIkRhdGU6IFN1biwgMSBBcHIgMjAwNyAxMTAwOjAwOjAwICswMTAwIChCU1QpXHJcZiIKLSAgICAgICAgICAgICsgIkZyb206IHJvYWRydW5uZXJAYWNtZS5leGFtcGxlLmNvbVxyXGYiCi0gICAgICAgICAgICArICJUbzogY295b3RlQGRlc2VydC5leGFtcGxlLm9yZywgYnVnc0BleGFtcGxlLm9yZywgIgotICAgICAgICAgICAgKyAiICAgIGVsbWVyQGh1bnRlcnMuZXhhbXBsZS5vcmcsXHJcZiIKLSAgICAgICAgICAgICsgIlN1YmplY3Q6IFdobydzIFRoZSBGb29sP1xyXGYiICsgIlxyXGYiICsgIkJlZXAtQmVlcFxyXGYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUl9TQ1JJUFQgPSAicmVxdWlyZSBcImZpbGVpbnRvXCI7XHJcZiIKLSAgICAgICAgICAgICsgImlmIGFkZHJlc3MgOmlzIDphbGwgXCJ0b1wiIFwiY295b3RlQGRlc2VydC5leGFtcGxlLm9yZ1wiIHtcclxmIgotICAgICAgICAgICAgKyAiICBmaWxlaW50byBcImNveW90ZVwiO1xyXGZ9XHJcZiIKLSAgICAgICAgICAgICsgImlmIGFkZHJlc3MgOmlzIDphbGwgXCJ0b1wiIFwiYnVnc0BleGFtcGxlLm9yZ1wiIHtcclxmIgotICAgICAgICAgICAgKyAiICBmaWxlaW50byBcImJ1Z3NcIjtcclxmfVxyXGYiCi0gICAgICAgICAgICArICJpZiBhZGRyZXNzIDppcyA6YWxsIFwidG9cIiBcInJvYWRydW5uZXJhY21lLkBleGFtcGxlLm9yZ1wiIHtcclxmIgotICAgICAgICAgICAgKyAiICBmaWxlaW50byBcInJyXCI7XHJcZn1cclxmIgotICAgICAgICAgICAgKyAiaWYgYWRkcmVzcyA6aXMgOmFsbCBcInRvXCIgXCJlbG1lckBodW50ZXJzLmV4YW1wbGUub3JnXCIge1xyXGYiCi0gICAgICAgICAgICArICIgIGZpbGVpbnRvIFwiZWxtZXJcIjtcclxmfVxyXGYiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNjcmlwdENoZWNrZXIgY2hlY2tlciA9IG5ldyBTY3JpcHRDaGVja2VyKCk7Ci0gICAgICAgIFNjcmlwdENoZWNrZXIuUmVzdWx0cyByZXN1bHRzID0gY2hlY2tlci5jaGVjayh0b1N0cmVhbShTT0xPX1RPX0VNQUlMKSwKLSAgICAgICAgICAgICAgICB0b1N0cmVhbShGSUxURVJfU0NSSVBUKSk7Ci0gICAgICAgIGlmIChyZXN1bHRzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwocmVzdWx0cy5nZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBMaXN0IGFjdGlvbnNFeGVjdXRlZCA9IHJlc3VsdHMuZ2V0QWN0aW9uc0V4ZWN1dGVkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhY3Rpb25zRXhlY3V0ZWQuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzQWN0aW9uRmlsZUludG8oImNveW90ZSIsIDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTY3JpcHRDaGVja2VyIGNoZWNrZXIgPSBuZXcgU2NyaXB0Q2hlY2tlcigpOwotICAgICAgICBTY3JpcHRDaGVja2VyLlJlc3VsdHMgcmVzdWx0cyA9IGNoZWNrZXIuY2hlY2soCi0gICAgICAgICAgICAgICAgdG9TdHJlYW0oTVVMVElQTEVfVE9fRU1BSUwpLCB0b1N0cmVhbShGSUxURVJfU0NSSVBUKSk7Ci0gICAgICAgIGlmIChyZXN1bHRzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwocmVzdWx0cy5nZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBMaXN0IGFjdGlvbnNFeGVjdXRlZCA9IHJlc3VsdHMuZ2V0QWN0aW9uc0V4ZWN1dGVkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBhY3Rpb25zRXhlY3V0ZWQuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzQWN0aW9uRmlsZUludG8oImNveW90ZSIsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzQWN0aW9uRmlsZUludG8oImJ1Z3MiLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0cy5pc0FjdGlvbkZpbGVJbnRvKCJlbG1lciIsIDIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIHRvU3RyZWFtKFN0cmluZyBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IGluLmdldEJ5dGVzKCJVUy1BU0NJSSIpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Ob3RUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvTm90VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTgyYWUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9Ob3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBDbGFzcyBOb3RUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnbm90JwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJZk5vdEZhbHNlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIG5vdCBmYWxzZSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ3RydWUnIHdpdGggaW52YWxpZCBhcmd1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJndW1lbnQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgbm90IDEge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvT3BlbmVkQWRkcmVzcy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL09wZW5lZEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MmM2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvT3BlbmVkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS50ZXN0cy5BZGRyZXNzOwotCi1maW5hbCBjbGFzcyBPcGVuZWRBZGRyZXNzIGV4dGVuZHMgQWRkcmVzcyB7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaChNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgYWRkcmVzc1BhcnQsCi0gICAgICAgICAgICBTdHJpbmcgY29tcGFyYXRvciwgU3RyaW5nIG1hdGNoVHlwZSwgU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLm1hdGNoKG1haWwsIGFkZHJlc3NQYXJ0LCBjb21wYXJhdG9yLCBtYXRjaFR5cGUsCi0gICAgICAgICAgICAgICAgaGVhZGVyTmFtZSwga2V5LCBjb250ZXh0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9RdW90aW5nVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1F1b3RpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTA1NDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1F1b3RpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuU2lldmVNYWlsQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFF1b3RpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5RdW90ZWRTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBoZWFkZXIgOmlzIFwiWC1UZXN0XCIgXCJCZWZvcmVcXFwiQWZ0ZXJcIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIGZpbmFsIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzCi0gICAgICAgICAgICAgICAgLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJYLVRlc3QiLCAiQmVmb3JlXCJBZnRlciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGhlYWRlciB0byBiZSBtYXRjaGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvUmVqZWN0VGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1JlamVjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5ODQ3OC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvUmVqZWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uQ29tbWFuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLQotLyoqCi0gKiBDbGFzcyBSZWplY3RUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWplY3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVqZWN0JyB3aXRoIGludmFsaWQgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBcmd1bWVudHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVqZWN0IDEgOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlamVjdCcgd2l0aCBhbiBpbnZhbGlkIGJsb2NrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRCbG9jaygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgXCJTcGFtIG5vdCBjb25zdW1lZCBoZXJlIVwiIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlamVjdCcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdCBcIlNwYW0gbm90IGNvbnN1bWVkIGhlcmUhXCI7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFpbC5nZXRBY3Rpb25zKCkuc2l6ZSgpID09IDEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5nZXQoMCkgaW5zdGFuY2VvZiBBY3Rpb25SZWplY3QpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdGx5IHBhc3NlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWplY3RNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlNwYW0gbm90IGNvbnN1bWVkIGhlcmUhIjsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgXCIiICsgbWVzc2FnZSArICJcIjsiOwotICAgICAgICBBY3Rpb25SZWplY3QgcmVqZWN0aW9uID0gcnVuUmVqZWN0U2NyaXB0KHNjcmlwdCk7ICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHJlamVjdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQWN0aW9uUmVqZWN0IHJ1blJlamVjdFNjcmlwdChTdHJpbmcgc2NyaXB0KSB0aHJvd3MgU2lldmVFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLnNpemUoKSA9PSAxKTsKLSAgICAgICAgT2JqZWN0IGFjdGlvbiA9IG1haWwuZ2V0QWN0aW9ucygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25SZWplY3QpOwotICAgICAgICBBY3Rpb25SZWplY3QgcmVqZWN0aW9uID0gKEFjdGlvblJlamVjdCkgYWN0aW9uOwotICAgICAgICByZXR1cm4gcmVqZWN0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZWplY3QnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdE1pc3NpbmdNZXNzYWdlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdDsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLmdldCgwKSBpbnN0YW5jZW9mIEFjdGlvblJlamVjdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgZHVwbGljYXRlIENvbW1hbmQgJ3JlamVjdCcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlUmVqZWN0KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlamVjdCBcIlNwYW0gbm90IGNvbnN1bWVkIGhlcmUhXCI7IHJlamVjdCBcIlNwYW0gbm90IGNvbnN1bWVkIGhlcmUhXCI7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFpbEFkYXB0ZXIgbWFpbCA9IEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVqZWN0JyBwcmVjZWRlZCBieSBhbm90aGVyIGNvbW1hbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0QW5kQVByZWNlZGluZ0NvbW1hbmQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAia2VlcDsgcmVqZWN0IFwiU3BhbSBub3QgY29uc3VtZWQgaGVyZSFcIjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZWplY3QnIGZvbGxvd2VkIGJ5IGFub3RoZXIgY29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWplY3RBbmRBRm9sbG93aW5nQ29tbWFuZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZWplY3QgXCJTcGFtIG5vdCBjb25zdW1lZCBoZXJlIVwiOyBrZWVwOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1haWxBZGFwdGVyIG1haWwgPSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1JlcXVpcmVNaXNzaW5nVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1JlcXVpcmVNaXNzaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NlOTU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9SZXF1aXJlTWlzc2luZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLS8qKgotICogQ2xhc3MgQWRkcmVzc1Rlc3QKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVNaXNzaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdW5zdXBwb3J0ZWQgcmVxdWlyZXMgYXJlIGNhdWdodCBiZWZvcmUgc2NyaXB0IGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRSZXF1aXJlTm9CcmFja2V0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlcXVpcmUgXCJ3aGF0ZXZlclwiOyBpZiBhZGRyZXNzIDpjb250YWlucyBbXCJUb1wiLCBcIkZyb21cIl0gXCJGaXNoIVwieyBmaWxlaW50byBcImFGb2xkZXJcIjsgfSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLnBhcnNlKHNjcmlwdCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3QgZXhjZXB0aW9uIHRvIGJlIHRocm93IGR1cmluZyBwYXJzZSBzaW5jZSBjb21tYW5kIGlzIHVuc3VwcG9ydGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHVuc3VwcG9ydGVkIHJlcXVpcmVzIGFyZSBjYXVnaHQgYmVmb3JlIHNjcmlwdCBleGVjdXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkUmVxdWlyZU11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBbXCJmaWxlaW50b1wiLFwid2hhdGV2ZXJcIl07IGlmIGFkZHJlc3MgOmNvbnRhaW5zIFtcIlRvXCIsIFwiRnJvbVwiXSBcIkZpc2ghXCJ7IGZpbGVpbnRvIFwiYUZvbGRlclwiOyB9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMucGFyc2Uoc2NyaXB0KTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdCBleGNlcHRpb24gdG8gYmUgdGhyb3cgZHVyaW5nIHBhcnNlIHNpbmNlIGNvbW1hbmQgaXMgdW5zdXBwb3J0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdW5zdXBwb3J0ZWQgcmVxdWlyZXMgYXJlIGNhdWdodCBiZWZvcmUgc2NyaXB0IGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRSZXF1aXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBbXCJ3aGF0ZXZlclwiXTsgaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgZmlsZWludG8gXCJhRm9sZGVyXCI7IH0iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5wYXJzZShzY3JpcHQpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0IGV4Y2VwdGlvbiB0byBiZSB0aHJvdyBkdXJpbmcgcGFyc2Ugc2luY2UgY29tbWFuZCBpcyB1bnN1cHBvcnRlZCIpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgMi4xMC41IEV4dGVuc2lvbnMgYW5kIE9wdGlvbmFsIEZlYXR1cmVzOiBJZiBhbiBleHRlbnNpb24gaXMgbm90Ci0gICAgICogZW5hYmxlZCB3aXRoICJyZXF1aXJlZCIgdGhleSBtdXN0IHRyZWF0IGl0IGFzIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgaXQKLSAgICAgKiBhdCBhbGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdSZXF1aXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgYm9ndXMgXCJhRm9sZGVyXCI7IH0iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5wYXJzZShzY3JpcHQpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0IGV4Y2VwdGlvbiB0byBiZSB0aHJvdyBkdXJpbmcgcGFyc2Ugc2luY2UgY29tbWFuZCBpcyBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyAzLjIgQ29udHJvbCBTdHJ1Y3R1cmUgUmVxdWlyZTogUmVxdWlyZSBNVVNUIE5PVCBiZSB1c2VkIGFmdGVyIGFueQotICAgICAqIG90aGVyIGNvbW1hbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVBZnRlck90aGVyQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmNvbnRhaW5zIFtcIlRvXCIsIFwiRnJvbVwiXSBcIkZpc2ghXCJ7IGZpbGVpbnRvIFwiYUZvbGRlclwiOyB9IHJlcXVpcmUgW1wid2hhdGV2ZXJcIl07ICI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLnBhcnNlKHNjcmlwdCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3QgZXhjZXB0aW9uIHRvIGJlIHRocm93IGR1cmluZyBwYXJzZSIpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1JlcXVpcmVUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvUmVxdWlyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkMTEzNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvUmVxdWlyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIFJlcXVpcmVUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1aXJlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlcXVpcmUnIHdpdGggYSBzaW5nbGUgY29tbWFuZCB0aGF0IGlzIHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ29tbWFuZFNhdGlzZmllZCgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlIFwiaWZcIjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZXF1aXJlJyB3aXRoIGEgc2luZ2xlIHRlc3QgdGhhdCBpcyBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVRlc3RTYXRpc2ZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlIFwidHJ1ZVwiOyI7Ci0gICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlcXVpcmUnIHdpdGggbXVsdGlwbGUgY29tbWFuZHMgdGhhdCBhcmUgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNvbW1hbmRTYXRpc2ZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlIFtcImlmXCIsIFwiZWxzaWZcIiwgXCJlbHNlXCJdOyI7Ci0gICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlcXVpcmUnIHdpdGggbXVsdGlwbGUgdGVzdHMgdGhhdCBhcmUgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRlc3RTYXRpc2ZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlIFtcInRydWVcIiwgXCJmYWxzZVwiLCBcIm5vdFwiXTsiOwotICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZXF1aXJlJyB3aXRoIGEgc2luZ2xlIGNvbW1hbmQgdGhhdCBpcyBhYnNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ29tbWFuZFVuc2F0aXNmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBcImFic2VudFwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZXF1aXJlJyB3aXRoIGEgc2luZ2xlIHRlc3QgdGhhdCBpcyBhYnNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVGVzdFVuc2F0aXNmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBcImFic2VudFwiOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZXF1aXJlJyBmb3IgbWlzc2luZyBhcmd1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVxdWlyZScgZm9yIGV4dHJhIGFyZ3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJyZXF1aXJlIFwiaWZcIiAxOyI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICB9IGNhdGNoIChTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVxdWlyZScgcmVqZWN0aW5nIEJsb2NrcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWplY3RCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlcXVpcmUgXCJpZlwiIHtzdG9wO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3JlcXVpcmUnIGFmdGVyIGEgQ29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnZlbmluZ0NvbW1hbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJmaWxlaW50byBcInNvbWVwbGFjZVwiOyByZXF1aXJlIFwiZmlsZWludG9cIjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVxdWlyZScgcmVqZWN0aW5nIGludmFsaWQgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlamVjdEludmFsaWRBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlcXVpcmUgMSA7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBDb21tYW5kICdyZXF1aXJlJyB3aXRoIGEgbXVsdGlwbGUgY29tbWFuZHMgb2Ygd2hpY2ggb25lIGlzCi0gICAgICogYWJzZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ29tbWFuZHNVbnNhdGlzZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInJlcXVpcmUgW1wiaWZcIiwgXCJlbHNpZlwiLCBcImFic2VudFwiXTsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAncmVxdWlyZScgd2l0aCBhIG11bHRpcGxlIHRlc3RzIG9mIHdoaWNoIG9uZSBpcyBhYnNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUZXN0c1Vuc2F0aXNmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJhYnNlbnRcIl07IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NpZXZlUGFyc2VyVmlzaXRvckltcGxRdW90ZVRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9TaWV2ZVBhcnNlclZpc2l0b3JJbXBsUXVvdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzgzMWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NpZXZlUGFyc2VyVmlzaXRvckltcGxRdW90ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTaWV2ZVBhcnNlclZpc2l0b3JJbXBsUXVvdGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgCi0gICAgU2lldmVQYXJzZXJWaXNpdG9ySW1wbCB2aXNpdG9yOwotCi0gICAgTGlzdCBkYXRhOwotCi0gICAgQVNUc3RyaW5nIG5vZGU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOwotICAgICAgICB2aXNpdG9yID0gbmV3IFNpZXZlUGFyc2VyVmlzaXRvckltcGwobmV3IEJhc2VTaWV2ZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29tbWFuZE1hbmFnZXIoKSwgY29uZmlndXJhdGlvbk1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wYXJhdG9yTWFuYWdlcigpLCBjb25maWd1cmF0aW9uTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRlc3RNYW5hZ2VyKCksIExvZ0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2coU2lldmVQYXJzZXJWaXNpdG9ySW1wbFF1b3RlVGVzdC5jbGFzcykpKTsKLSAgICAgICAgZGF0YSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgQVNUc3RyaW5nIHN0cmluZ05vZGUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZSBub2RlID0gSlVuaXRVdGlscy5wYXJzZSgiZmlsZWludG8gIiArIHZhbHVlICsgIjsiKTsKLSAgICAgICAgcmV0dXJuIChBU1RzdHJpbmcpIG5vZGUuamp0R2V0Q2hpbGQoMCkuamp0R2V0Q2hpbGQoMCkuamp0R2V0Q2hpbGQoMCkuamp0R2V0Q2hpbGQoMCkuamp0R2V0Q2hpbGQoMCkuamp0R2V0Q2hpbGQoMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXNpdEFTVHN0cmluZ09iamVjdFF1b3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBub2RlID0gc3RyaW5nTm9kZSgiXCJ2YWx1ZVwiIik7Ci0gICAgICAgIHZpc2l0b3IudmlzaXQobm9kZSwgZGF0YSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRGF0YSB2YWx1ZSBhZGRlZCBhZnRlciBxdW90ZXMgc3RyaXBwZWQiLCAxLCBkYXRhLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRGF0YSB2YWx1ZSBhZGRlZCBhZnRlciBxdW90ZXMgc3RyaXBwZWQiLCAidmFsdWUiLCBkYXRhCi0gICAgICAgICAgICAgICAgLmdldCgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZpc2l0QVNUc3RyaW5nT2JqZWN0UXVvdGVJblF1b3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgbm9kZSA9IHN0cmluZ05vZGUoIlwidmFsXFxcInVlXCIiKTsKLSAgICAgICAgdmlzaXRvci52aXNpdChub2RlLCBkYXRhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsIDEsIGRhdGEuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsICJ2YWxcInVlIiwgZGF0YQotICAgICAgICAgICAgICAgIC5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXNpdEFTVHN0cmluZ09iamVjdERvdWJsZVNsYXNoUXVvdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbm9kZSA9IHN0cmluZ05vZGUoIlwidmFsXFxcXHVlXCIiKTsKLSAgICAgICAgdmlzaXRvci52aXNpdChub2RlLCBkYXRhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsIDEsIGRhdGEuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsICJ2YWxcXHVlIiwgZGF0YQotICAgICAgICAgICAgICAgIC5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXNpdEFTVHN0cmluZ09iamVjdFNsYXNoUXVvdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbm9kZSA9IHN0cmluZ05vZGUoIlwidmFsdWVcIiIpOwotICAgICAgICB2aXNpdG9yLnZpc2l0KG5vZGUsIGRhdGEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGEgdmFsdWUgYWRkZWQgYWZ0ZXIgcXVvdGVzIHN0cmlwcGVkIiwgMSwgZGF0YS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGEgdmFsdWUgYWRkZWQgYWZ0ZXIgcXVvdGVzIHN0cmlwcGVkIiwgInZhbHVlIiwgZGF0YQotICAgICAgICAgICAgICAgIC5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXNpdEFTVHN0cmluZ0VtcHR5UXVvdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbm9kZSA9IHN0cmluZ05vZGUoIlwiXCIiKTsKLSAgICAgICAgdmlzaXRvci52aXNpdChub2RlLCBkYXRhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsIDEsIGRhdGEuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRhIHZhbHVlIGFkZGVkIGFmdGVyIHF1b3RlcyBzdHJpcHBlZCIsICIiLCBkYXRhLmdldCgwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZpc2l0QVNUc3RyaW5nT2JqZWN0TXVsdGlTbGFzaFF1b3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIG5vZGUgPSBzdHJpbmdOb2RlKCJcInZcXFxcYWxcXFxcdVxcZVxcXFxcIiIpOwotICAgICAgICB2aXNpdG9yLnZpc2l0KG5vZGUsIGRhdGEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGEgdmFsdWUgYWRkZWQgYWZ0ZXIgcXVvdGVzIHN0cmlwcGVkIiwgMSwgZGF0YS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGEgdmFsdWUgYWRkZWQgYWZ0ZXIgcXVvdGVzIHN0cmlwcGVkIiwgInZcXGFsXFx1ZVxcIiwKLSAgICAgICAgICAgICAgICBkYXRhLmdldCgwKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1NpemVUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2l6ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxOGJiNi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU2l6ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuU2lldmVNYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5TaWV2ZU1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIFNpemVUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaXplVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIFRlc3QgJ3NpemUnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpemVJc092ZXJUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuc2V0VGV4dCgiSGkhIik7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgLy8gTmVlZCB0byBjb3B5IHRoZSBtYWlsIHRvIGdldCBKYXZhTWFpbCB0byByZXBvcnQgdGhlIG1lc3NhZ2Ugc2l6ZQotICAgICAgICAgICAgLy8gY29ycmVjdGx5IChzYXZlQ2hhbmdlcygpIG9ubHkgc2F2ZXMgdGhlIGhlYWRlcnMhKQotICAgICAgICAgICAgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNvcHlNYWlsKG1haWwpOwotICAgICAgICAgICAgc2l6ZSA9IG1haWwuZ2V0U2l6ZSgpOwotICAgICAgICB9IGNhdGNoIChTaWV2ZU1haWxFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBzaXplIDpvdmVyICIgKyBuZXcgSW50ZWdlcihzaXplIC0gMSkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICdzaXplJwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplSXNPdmVyRmFsc2UoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IG51bGw7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5zZXRUZXh0KCJIaSEiKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIGNvcHkgdGhlIG1haWwgdG8gZ2V0IEphdmFNYWlsIHRvIHJlcG9ydCB0aGUgbWVzc2FnZSBzaXplCi0gICAgICAgICAgICAvLyBjb3JyZWN0bHkgKHNhdmVDaGFuZ2VzKCkgb25seSBzYXZlcyB0aGUgaGVhZGVycyEpCi0gICAgICAgICAgICBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY29weU1haWwobWFpbCk7Ci0gICAgICAgICAgICBzaXplID0gbWFpbC5nZXRTaXplKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlTWFpbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIHNpemUgOm92ZXIgIiArIG5ldyBJbnRlZ2VyKHNpemUpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnc2l6ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZUlzVW5kZXJUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTaWV2ZU1haWxBZGFwdGVyIG1haWwgPSBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuc2V0VGV4dCgiSGkhIik7Ci0gICAgICAgICAgICBtYWlsLmdldE1lc3NhZ2UoKS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgLy8gTmVlZCB0byBjb3B5IHRoZSBtYWlsIHRvIGdldCBKYXZhTWFpbCB0byByZXBvcnQgdGhlIG1lc3NhZ2Ugc2l6ZQotICAgICAgICAgICAgLy8gY29ycmVjdGx5IChzYXZlQ2hhbmdlcygpIG9ubHkgc2F2ZXMgdGhlIGhlYWRlcnMhKQotICAgICAgICAgICAgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNvcHlNYWlsKG1haWwpOwotICAgICAgICAgICAgc2l6ZSA9IG1haWwuZ2V0U2l6ZSgpOwotICAgICAgICB9IGNhdGNoIChTaWV2ZU1haWxFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBzaXplIDp1bmRlciAiICsgbmV3IEludGVnZXIoc2l6ZSArIDEpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQobWFpbCwgc2NyaXB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnc2l6ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZUlzVW5kZXJGYWxzZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU2lldmVNYWlsQWRhcHRlciBtYWlsID0gbnVsbDsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLnNldFRleHQoIkhpISIpOwotICAgICAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY29weSB0aGUgbWFpbCB0byBnZXQgSmF2YU1haWwgdG8gcmVwb3J0IHRoZSBtZXNzYWdlIHNpemUKLSAgICAgICAgICAgIC8vIGNvcnJlY3RseSAoc2F2ZUNoYW5nZXMoKSBvbmx5IHNhdmVzIHRoZSBoZWFkZXJzISkKLSAgICAgICAgICAgIG1haWwgPSAoU2lldmVNYWlsQWRhcHRlcikgSlVuaXRVdGlscy5jb3B5TWFpbChtYWlsKTsKLSAgICAgICAgICAgIHNpemUgPSBtYWlsLmdldFNpemUoKTsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVNYWlsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgc2l6ZSA6b3ZlciAiICsgbmV3IEludGVnZXIoc2l6ZSkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIiB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhdGNoIChUaHJvd1Rlc3RFeGNlcHRpb24uVGVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAnc2l6ZScgd2l0aCBxdWFudGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpemVJc1dpdGhRdWFudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNUZXN0UGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuc2V0VGV4dCgiSGkhIik7Ci0gICAgICAgIG1haWwuZ2V0TWVzc2FnZSgpLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIC8vIE5lZWQgdG8gY29weSB0aGUgbWFpbCB0byBnZXQgSmF2YU1haWwgdG8gcmVwb3J0IHRoZSBtZXNzYWdlIHNpemUKLSAgICAgICAgLy8gY29ycmVjdGx5IChzYXZlQ2hhbmdlcygpIG9ubHkgc2F2ZXMgdGhlIGhlYWRlcnMhKQotICAgICAgICBtYWlsID0gKFNpZXZlTWFpbEFkYXB0ZXIpIEpVbml0VXRpbHMuY29weU1haWwobWFpbCk7Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBzaXplIDpvdmVyIDFHIHt0aHJvd1Rlc3RFeGNlcHRpb247fSI7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChTaWV2ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpc1Rlc3RQYXNzZWQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL1N0b3BUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU3RvcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYmNmNi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvU3RvcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5UaHJvd1Rlc3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25LZWVwOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5KVW5pdFV0aWxzOwotCi0vKioKLSAqIENsYXNzIFN0b3BUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdG9wVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIENvbW1hbmQgJ3N0b3AnLiBUaGlzIGhhcyBhbiBpbXBsaWNpdCBLZWVwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInN0b3A7IHRocm93VGVzdEV4Y2VwdGlvbjsiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYWlsQWRhcHRlciBtYWlsID0gSlVuaXRVdGlscy5jcmVhdGVNYWlsKCk7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChtYWlsLCBzY3JpcHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYWlsLmdldEFjdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1haWwuZ2V0QWN0aW9ucygpLmdldCgwKSBpbnN0YW5jZW9mIEFjdGlvbktlZXApOwotICAgICAgICAgICAgaXNUZXN0UGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dUZXN0RXhjZXB0aW9uLlRlc3RFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnc3RvcCcgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJndW1lbnRzKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gInN0b3AgMSA7IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgQ29tbWFuZCAnc3RvcCcgd2l0aCBhbiBpbnZhbGlkIGJsb2NrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRCbG9jaygpIHsKLSAgICAgICAgYm9vbGVhbiBpc1Rlc3RQYXNzZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJzdG9wIDEge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1Rlc3RQYXNzZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlzVGVzdFBhc3NlZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvVHJ1ZVRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UcnVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZkNzY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9UcnVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlRocm93VGVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLS8qKgotICogQ2xhc3MgVHJ1ZVRlc3QKLSAqLwotcHVibGljIGNsYXNzIFRydWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgVGVzdCAndHJ1ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWZUcnVlKCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIHRydWUge3Rocm93VGVzdEV4Y2VwdGlvbjt9IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93VGVzdEV4Y2VwdGlvbi5UZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBUZXN0ICd0cnVlJyB3aXRoIGludmFsaWQgYXJndW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFyZ3VtZW50KCkgewotICAgICAgICBib29sZWFuIGlzVGVzdFBhc3NlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIHRydWUgMSB7dGhyb3dUZXN0RXhjZXB0aW9uO30iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICAgICAgfSBjYXRjaCAoU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzVGVzdFBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoU2lldmVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaXNUZXN0UGFzc2VkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9XaWVyZEFkZHJlc3NUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvV2llcmRBZGRyZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU0MGRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9XaWVyZEFkZHJlc3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbHMuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlscy5TaWV2ZU1haWxBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgV2llcmRBZGRyZXNzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIE15IGdvZCAtIGl0J3MgZnVsbCBvZiBzdGFycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRQYXJzZUFkZHJlc3NXaXRoTG90c09mU3RhcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpZiBhbnlvZiAoaGVhZGVyIDptYXRjaGVzIFwiZnJvbVwiIiArCi0gICAgICAgICAgICAiXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqYWRkcmVzc0B5YWhvby5jb21cIiAsIiArCi0gICAgICAgICAgICAiaGVhZGVyIDppcyBcInN1YmplY3RcIiBcIjVcIiApIiArCi0gICAgICAgICAgICAieyBmaWxlaW50byBcIldoYXRldmVyXCI7IHN0b3A7fSI7Ci0gICAgICAgIFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCA9IChTaWV2ZU1haWxBZGFwdGVyKSBKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKTsKLSAgICAgICAgbWFpbC5nZXRNZXNzYWdlKCkuYWRkSGVhZGVyKCJGcm9tIiwgInVzZXJAZG9tYWluIik7Ci0gICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KG1haWwsIHNjcmlwdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL1Rocm93VGVzdEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzL1Rocm93VGVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhhMjRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9UaHJvd1Rlc3RFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotCi0vKioKLSAqIENsYXNzIFRocm93VGVzdEV4Y2VwdGlvbiBpbXBsZW1lbnRzIGEgU2lldmUgQ29tbWFuZCB0byB0aHJvdyBhIFRlc3RFeGNlcHRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJvd1Rlc3RFeGNlcHRpb24gaW1wbGVtZW50cyBFeGVjdXRhYmxlQ29tbWFuZCB7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyBUZXN0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBTaWV2ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXN0RXhjZXB0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRlc3RFeGNlcHRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXN0RXhjZXB0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdEV4Y2VwdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBUZXN0RXhjZXB0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNhdXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFRocm93VGVzdEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dUZXN0RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUuRXhlY3V0YWJsZUNvbW1hbmQjZXhlY3V0ZShNYWlsQWRhcHRlciwgQXJndW1lbnRzLAotICAgICAqICAgICAgQmxvY2ssIFNpZXZlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoTWFpbEFkYXB0ZXIgbWFpbCwgQXJndW1lbnRzIGFyZ3VtZW50cywgQmxvY2sgYmxvY2ssCi0gICAgICAgICAgICBTaWV2ZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFRlc3RFeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9vcHRpb25hbC9GaWxlSW50b1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kcy9vcHRpb25hbC9GaWxlSW50b1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MDBiZi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHMvb3B0aW9uYWwvRmlsZUludG9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Bcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQmFzZVNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TY3JpcHRDb29yZGluYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TdHJpbmdMaXN0QXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGVzdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25GaWxlSW50bzsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsLmNoZWNrLlNjcmlwdENoZWNrTWFpbEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlSW50b1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBGaWxlSW50byBzdWJqZWN0OwotICAgIAotICAgIFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIgbW9ja0FkYXB0ZXI7Ci0gICAgQXJndW1lbnRzIGR1bW15QXJndW1lbnRzOwotICAgIFNpZXZlQ29udGV4dCBkdW1teUNvbnRleHQ7Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbW9ja0FkYXB0ZXIgPSBuZXcgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlcigpOwotICAgICAgICBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBzdHJpbmdMaXN0LmFkZCgiV2hhdGV2ZXIiKTsKLSAgICAgICAgTGlzdDxBcmd1bWVudD4gYXJndW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxBcmd1bWVudD4oKTsKLSAgICAgICAgYXJndW1lbnRMaXN0LmFkZChuZXcgU3RyaW5nTGlzdEFyZ3VtZW50KHN0cmluZ0xpc3QpKTsKLSAgICAgICAgZHVtbXlBcmd1bWVudHMgPSBuZXcgQXJndW1lbnRzKGFyZ3VtZW50TGlzdCwgbmV3IFRlc3RMaXN0KENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgZHVtbXlDb250ZXh0ID0gbmV3IEJhc2VTaWV2ZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0Q29tbWFuZE1hbmFnZXIoKSwgY29uZmlndXJhdGlvbk1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wYXJhdG9yTWFuYWdlcigpLCBjb25maWd1cmF0aW9uTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRlc3RNYW5hZ2VyKCksIExvZ0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2codGhpcy5nZXRDbGFzcygpKSk7Ci0gICAgICAgIGR1bW15Q29udGV4dC5zZXRDb29yZGluYXRlKG5ldyBTY3JpcHRDb29yZGluYXRlKDAsIDAsIDAsIDApKTsKLSAgICAgICAgc3ViamVjdCA9IG5ldyBGaWxlSW50bygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVJbnRvU2hvdWxkTm90QWxsb3dNdWx0aXBsZUZpbGVJbnRvQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdWJqZWN0LmV4ZWN1dGUobW9ja0FkYXB0ZXIsIGR1bW15QXJndW1lbnRzLCBudWxsLCBkdW1teUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja0FkYXB0ZXIuZ2V0QWN0aW9ucygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobW9ja0FkYXB0ZXIuZ2V0QWN0aW9ucygpLmdldCgwKSBpbnN0YW5jZW9mIEFjdGlvbkZpbGVJbnRvKTsKLSAgICAgICAgCi0gICAgICAgIHN1YmplY3QuZXhlY3V0ZShtb2NrQWRhcHRlciwgZHVtbXlBcmd1bWVudHMsIG51bGwsIGR1bW15Q29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtb2NrQWRhcHRlci5nZXRBY3Rpb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrQWRhcHRlci5nZXRBY3Rpb25zKCkuZ2V0KDApIGluc3RhbmNlb2YgQWN0aW9uRmlsZUludG8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yL0NvbXBhcmF0b3JVdGlsc1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9jb21wYXJhdG9yL0NvbXBhcmF0b3JVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlNjc5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvci9Db21wYXJhdG9yVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmNvbXBhcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5jb21wYXJhdG9ycy5Db21wYXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlUGF0dGVybkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENvbXBhcmF0b3JVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc1N0cmluZ1N0cmluZygpIHRocm93cyBTaWV2ZVBhdHRlcm5FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2lldmVtYXRjaCA9ICJbdGVzdF0gP1xcXFw/XFw/KlxcXFwqXFwqXFwiOwotICAgICAgICBhc3NlcnRUcnVlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF0gYVxceD9mb29cXGJhcipcXCIsCi0gICAgICAgICAgICAgICAgc2lldmVtYXRjaCkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb21wYXJhdG9yVXRpbHMubWF0Y2hlcygiW3Rlc3RdIGFiXFx4P2Zvb1xcYmFyKlxcIiwKLSAgICAgICAgICAgICAgICBzaWV2ZW1hdGNoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF1hXFx4P2Zvb1xcYmFyKlxcIiwKLSAgICAgICAgICAgICAgICBzaWV2ZW1hdGNoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdHN0XSBhXFx4P2Zvb1xcYmFyKlxcIiwKLSAgICAgICAgICAgICAgICBzaWV2ZW1hdGNoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF0gYVxcXFx4P2Zvb1xcYmFyKlxcIiwKLSAgICAgICAgICAgICAgICBzaWV2ZW1hdGNoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF0gYVxcP2Zvb1xcYmFyKlxcIiwKLSAgICAgICAgICAgICAgICBzaWV2ZW1hdGNoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF0gYVxceGFmb29cXGJhcipcXCIsCi0gICAgICAgICAgICAgICAgc2lldmVtYXRjaCkpOwotICAgICAgICBhc3NlcnRUcnVlKENvbXBhcmF0b3JVdGlscy5tYXRjaGVzKCJbdGVzdF0gYVxceD9cXGJhcipcXCIsIHNpZXZlbWF0Y2gpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShDb21wYXJhdG9yVXRpbHMubWF0Y2hlcygiW3Rlc3RdIGFcXHg/Zm9vXFxcXGJhcipcXCIsCi0gICAgICAgICAgICAgICAgc2lldmVtYXRjaCkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb21wYXJhdG9yVXRpbHMKLSAgICAgICAgICAgICAgICAubWF0Y2hlcygiW3Rlc3RdIGFcXHg/Zm9vYmFyKlxcIiwgc2lldmVtYXRjaCkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb21wYXJhdG9yVXRpbHMubWF0Y2hlcygiW3Rlc3RdIGFcXHg/Zm9vXFxiYXIuXFwiLAotICAgICAgICAgICAgICAgIHNpZXZlbWF0Y2gpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQ29tcGFyYXRvclV0aWxzLm1hdGNoZXMoIlt0ZXN0XSBhXFx4P2Zvb1xcYmFyKlxcXFwiLAotICAgICAgICAgICAgICAgIHNpZXZlbWF0Y2gpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQ29tcGFyYXRvclV0aWxzCi0gICAgICAgICAgICAgICAgLm1hdGNoZXMoIlt0ZXN0XSBhXFx4P2Zvb1xcYmFyKiIsIHNpZXZlbWF0Y2gpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgIjptYXRjaGVzIiB2ZXJzaW9uIHNwZWNpZmllcyBhIHdpbGRjYXJkIG1hdGNoIHVzaW5nIHRoZSBjaGFyYWN0ZXJzCi0gICAgICogIioiIGFuZCAiPyIuICIqIiBtYXRjaGVzIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCBhbmQgIj8iIG1hdGNoZXMgYQotICAgICAqIHNpbmdsZSBjaGFyYWN0ZXIuICI/IiBhbmQgIioiIG1heSBiZSBlc2NhcGVkIGFzICJcXD8iIGFuZCAiXFwqIiBpbgotICAgICAqIHN0cmluZ3MgdG8gbWF0Y2ggYWdhaW5zdCB0aGVtc2VsdmVzLiBUaGUgZmlyc3QgYmFja3NsYXNoIGVzY2FwZXMgdGhlCi0gICAgICogc2Vjb25kIGJhY2tzbGFzaDsgdG9nZXRoZXIsIHRoZXkgZXNjYXBlIHRoZSAiKiIuIFRoaXMgaXMgYXdrd2FyZCwgYnV0IGl0Ci0gICAgICogaXMgY29tbW9ucGxhY2UgaW4gc2V2ZXJhbCBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdCB1c2UgZ2xvYnMgYW5kCi0gICAgICogcmVndWxhciBleHByZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2lldmVUb0phdmFSZWdleCgpIHsKLSAgICAgICAgU3RyaW5nIHNpZXZlbWF0Y2ggPSAiW3Rlc3RdID9cXFxcP1xcPypcXFxcKlxcKlxcIjsKLSAgICAgICAgU3RyaW5nIHJlcyA9IENvbXBhcmF0b3JVdGlscy5zaWV2ZVRvSmF2YVJlZ2V4KHNpZXZlbWF0Y2gpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiXFxbdGVzdFxcXSAuXFxcXC5cXD8uKlxcXFwuKlxcKlxcXFwiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQXNjaWlOdW1lcmljVGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL0FzY2lpTnVtZXJpY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyOWRkNS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvQXNjaWlOdW1lcmljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uRmVhdHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBc2NpaU51bWVyaWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIEFzY2lpTnVtZXJpYyBzdWJqZWN0OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgc3ViamVjdCA9IG5ldyBBc2NpaU51bWVyaWMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZmljYXRpb25GYWlsc1doZW5Bc2NpaU51bWVyaWNJc05vdFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiaWYgaGVhZGVyIDpjb250YWlucyA6Y29tcGFyYXRvciBcImk7YXNjaWktbnVtZXJpY1wiIFwiU3ViamVjdFwiIFwiNjlcIiB7c3RvcDt9IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgICAgICAgICAgZmFpbCgiQ29tcGFyYXRvciBtdXN0IGJlIGRlY2xhcmVkIGluIHJlcXVpcmUgc3RhdGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmaWNhdGlvblBhc3Nlc1doZW5Bc2NpaU51bWVyaWNJc1JlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAicmVxdWlyZSBbXCJjb21wYXJhdG9yLWk7YXNjaWktbnVtZXJpY1wiXTsgaWYgaGVhZGVyIDppcyA6Y29tcGFyYXRvciBcImk7YXNjaWktbnVtZXJpY1wiIFwiU3ViamVjdFwiIFwiNjlcIiB7c3RvcDt9IjsKLSAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY051bWJlcmljRXF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc3ViamVjdC5lcXVhbHMoIjEiLCAiMiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWJqZWN0LmVxdWFscygiMSIsICIxIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxpdHlTaG91bGRJZ25vcmVUcmFpbGluZ0NoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWJqZWN0LmVxdWFscygiMDEiLCAiMUEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc3ViamVjdC5lcXVhbHMoIjEiLCAiMDAwMDAwMDAwMDAwMDAwMDFBIikpOwotICAgICAgICBhc3NlcnRUcnVlKHN1YmplY3QuZXF1YWxzKCIyMzRTIiwgIjIzNFlUR1NEQkJTRCIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsaXR5U2hvdWxkSWdub3JlTGVhZGluZ1plcm9zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUoc3ViamVjdC5lcXVhbHMoIjAxIiwgIjEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc3ViamVjdC5lcXVhbHMoIjAwMDAwMSIsICIxIikpOwotICAgICAgICBhc3NlcnRGYWxzZShzdWJqZWN0LmVxdWFscygiMDAwMDAxIiwgIjEwIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RpbmdzVGhhdERvTm90U3RhcnRXaXRoQURpZ2l0UmVwcmVzZW50UG9zaXRpdmVJbmZpbml0eVdoZW5Vc2VkSW5FcXVhbGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZShzdWJqZWN0LmVxdWFscygiMSIsICJBNCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc3ViamVjdC5lcXVhbHMoIngiLCAiNCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWJqZWN0LmVxdWFscygiR1QiLCAiQTQiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJzdHJpbmdJc05vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3ViamVjdC5jb250YWlucygiMjM0MjM0IiwgIjM0Iik7Ci0gICAgICAgICAgICBmYWlsKCJTdWJzdHJpbmcgaXMgdW5zdXBwb3J0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRmVhdHVyZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaE5vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3ViamVjdC5tYXRjaGVzKCIyMzQyMzQiLCAiMzQiKTsKLSAgICAgICAgICAgIGZhaWwoIlN1YnN0cmluZyBpcyB1bnN1cHBvcnRlZCIpOwotICAgICAgICB9IGNhdGNoIChGZWF0dXJlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvUmVxdWlyZUNvbXBhcmF0b3JUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvY29tcGFyYXRvcnMvUmVxdWlyZUNvbXBhcmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Nzg3M2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2NvbXBhcmF0b3JzL1JlcXVpcmVDb21wYXJhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUuY29tcGFyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlQ29tcGFyYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaUNhc2VtYXBTaG91bGRCZUltcGxpY2l0bHlEZWNsYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6Y29udGFpbnMgOmNvbXBhcmF0b3IgXCJpO2FzY2lpLWNhc2VtYXBcIiBcIlN1YmplY3RcIiBcIjY5XCIge3N0b3A7fSI7Ci0gICAgICAgIEpVbml0VXRpbHMuaW50ZXJwcmV0KEpVbml0VXRpbHMuY3JlYXRlTWFpbCgpLCBzY3JpcHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0ZXRTaG91bGRCZUltcGxpY2l0bHlEZWNsYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6Y29udGFpbnMgOmNvbXBhcmF0b3IgXCJpO29jdGV0XCIgXCJTdWJqZWN0XCIgXCI2OVwiIHtzdG9wO30iOwotICAgICAgICBKVW5pdFV0aWxzLmludGVycHJldChKVW5pdFV0aWxzLmNyZWF0ZU1haWwoKSwgc2NyaXB0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJvZ3VzQ29tcGFyYXRvclNob3VsZEZhaWxBdFBhcnNlVGltZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2NyaXB0ID0gImlmIGhlYWRlciA6Y29udGFpbnMgOmNvbXBhcmF0b3IgXCJpO2JvZ3VzXCIgXCJTdWJqZWN0XCIgXCI2OVwiIHtzdG9wO30iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlVuaXRVdGlscy5pbnRlcnByZXQoSlVuaXRVdGlscy5jcmVhdGVNYWlsKCksIHNjcmlwdCk7Ci0gICAgICAgICAgICBmYWlsKCJCb2d1cyBjb21wYXJhdG9yIHNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGNhdGNoIG1vcmUgZmluZWx5IGdyYWluZWQgZXhjZXB0aW9uCi0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2phdmF4bWFpbC9Nb2NrTWltZU1lc3NhZ2UuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9qYXZheG1haWwvTW9ja01pbWVNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjcwODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL2phdmF4bWFpbC9Nb2NrTWltZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLmphdmF4bWFpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgubWFpbC5BZGRyZXNzOwotaW1wb3J0IGphdmF4Lm1haWwuRmxhZ3M7Ci1pbXBvcnQgamF2YXgubWFpbC5Gb2xkZXI7Ci1pbXBvcnQgamF2YXgubWFpbC5IZWFkZXI7Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuTXVsdGlwYXJ0OwotaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0QWRkcmVzczsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0SGVhZGVyczsKLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlOwotaW1wb3J0IGphdmF4Lm1haWwuc2VhcmNoLlNlYXJjaFRlcm07Ci0KLS8qKgotICogRm9ya2VkIGZyb20gSkFNRVMgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9ja01pbWVNZXNzYWdlIGV4dGVuZHMgTWltZU1lc3NhZ2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IG1fZnJvbUFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgQWRkcmVzcyBtX3NlbmRlckFkZHJlc3M7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgbV90b1JlY2VwaWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgbV9jY1JlY2VwaWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgbV9iY2NSZWNlcGllbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IG1fcmVwbHlUb0FkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1fc3ViamVjdDsKLQotICAgIHByaXZhdGUgaW50IG1faU1lc3NhZ2VOdW1iZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbV9iSXNFeHB1bmdlZDsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1fY29udGVudDsKLQotICAgIHByaXZhdGUgRGF0ZSBtX3NlbnREYXRlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtX2NvbnRlbnRMYW5ndWFnZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1fZmlsZU5hbWU7Ci0KLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIG1fZGF0YUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgbV9jb250ZW50SGVhZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIEZsYWdzIG1fc2V0RmxhZ3MgPSBuZXcgRmxhZ3MoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtX2RvTWF0Y2g7Ci0KLSAgICBwcml2YXRlIGludCBtX3NpemUgPSAtMTsKLQotICAgIHB1YmxpYyBNb2NrTWltZU1lc3NhZ2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKFNlc3Npb24pIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2NrTWltZU1lc3NhZ2UoaW50IG1lc3NhZ2VOdW1iZXIpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzdXBlcigoU2Vzc2lvbikgbnVsbCk7Ci0gICAgICAgIG1faU1lc3NhZ2VOdW1iZXIgPSBtZXNzYWdlTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2NrTWltZU1lc3NhZ2UoTWltZU1lc3NhZ2UgbWltZU1lc3NhZ2UpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzdXBlcihtaW1lTWVzc2FnZSk7IC8vIHRyaXZpYWwgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc1tdIGdldEZyb20oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChBZGRyZXNzW10pIG1fZnJvbUFkZHJlc3Nlcy50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShBZGRyZXNzIGFkZHJlc3MpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX2Zyb21BZGRyZXNzZXMuY2xlYXIoKTsKLSAgICAgICAgbV9mcm9tQWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1fZnJvbUFkZHJlc3Nlcy5jbGVhcigpOwotICAgICAgICBtX2Zyb21BZGRyZXNzZXMuYWRkKEludGVybmV0QWRkcmVzcy5nZXRMb2NhbEFkZHJlc3MobnVsbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZyb20oQWRkcmVzc1tdIGFkZHJlc3NlcykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1fZnJvbUFkZHJlc3Nlcy5hZGQoYWRkcmVzc2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzcyBnZXRTZW5kZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1fc2VuZGVyQWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoQWRkcmVzcyBhZGRyZXNzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgbV9zZW5kZXJBZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc1tdIGdldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlIHJlY2lwaWVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCByZWNpcGllbnRzTGlzdCA9IGdldFJlY2lwaWVudHNMaXN0KHJlY2lwaWVudFR5cGUpOwotICAgICAgICBMaXN0IHJlY2lwaWVudEFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2lwaWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyByZWNpcGllbnQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICByZWNpcGllbnRBZGRyZXNzZXMuYWRkKG5ldyBJbnRlcm5ldEFkZHJlc3MocmVjaXBpZW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBZGRyZXNzW10pIChyZWNpcGllbnRBZGRyZXNzZXMudG9BcnJheShuZXcgQWRkcmVzc1tdIHt9KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldFJlY2lwaWVudHNMaXN0KE1lc3NhZ2UuUmVjaXBpZW50VHlwZSByZWNpcGllbnRUeXBlKSB7Ci0gICAgICAgIGlmIChNZXNzYWdlLlJlY2lwaWVudFR5cGUuVE8uZXF1YWxzKHJlY2lwaWVudFR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG1fdG9SZWNlcGllbnRzOwotICAgICAgICBpZiAoTWVzc2FnZS5SZWNpcGllbnRUeXBlLkNDLmVxdWFscyhyZWNpcGllbnRUeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBtX2NjUmVjZXBpZW50czsKLSAgICAgICAgaWYgKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5CQ0MuZXF1YWxzKHJlY2lwaWVudFR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG1fYmNjUmVjZXBpZW50czsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZHJlc3NbXSBnZXRBbGxSZWNpcGllbnRzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgYWxsUmVjaXBpZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYWxsUmVjaXBpZW50cy5hZGRBbGwobV90b1JlY2VwaWVudHMpOwotICAgICAgICBhbGxSZWNpcGllbnRzLmFkZEFsbChtX2NjUmVjZXBpZW50cyk7Ci0gICAgICAgIGFsbFJlY2lwaWVudHMuYWRkQWxsKG1fYmNjUmVjZXBpZW50cyk7Ci0gICAgICAgIHJldHVybiAoQWRkcmVzc1tdKSBhbGxSZWNpcGllbnRzLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZSByZWNpcGllbnRUeXBlLAotICAgICAgICAgICAgQWRkcmVzc1tdIGFkZHJlc3NlcykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJlY2lwaWVudHNMaXN0KHJlY2lwaWVudFR5cGUpLmFkZEFsbChBcnJheXMuYXNMaXN0KGFkZHJlc3NlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlIHJlY2lwaWVudFR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVjaXBpZW50KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0UmVjaXBpZW50c0xpc3QocmVjaXBpZW50VHlwZSkuYWRkKHJlY2lwaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUgcmVjaXBpZW50VHlwZSwKLSAgICAgICAgICAgIEFkZHJlc3NbXSBhZGRyZXNzZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBnZXRSZWNpcGllbnRzTGlzdChyZWNpcGllbnRUeXBlKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChhZGRyZXNzZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZSByZWNpcGllbnRUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHJlY2lwaWVudCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJlY2lwaWVudHNMaXN0KHJlY2lwaWVudFR5cGUpLmFkZChyZWNpcGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGRyZXNzW10gZ2V0UmVwbHlUbygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKEFkZHJlc3NbXSkgbV9yZXBseVRvQWRkcmVzc2VzLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKEFkZHJlc3NbXSBhZGRyZXNzZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX3JlcGx5VG9BZGRyZXNzZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYWRkcmVzc2VzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJqZWN0KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtX3N1YmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1fc3ViamVjdCA9IHN1YmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCwgU3RyaW5nIGNoYXJzZXQpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN1YmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbV9zdWJqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbV9zdWJqZWN0ID0gbmV3IFN0cmluZyhzdWJqZWN0LmdldEJ5dGVzKGNoYXJzZXQpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJzZXR0aW5nIHN1YmplY3QgZmFpbGVkIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRTZW50RGF0ZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9zZW50RGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW50RGF0ZShEYXRlIGRhdGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX3NlbnREYXRlID0gZGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBnZXRSZWNlaXZlZERhdGUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1fc2l6ZTsgLy8gdHJpdmlhbCBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAtMTsgLy8gdHJpdmlhbCBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlcigiQ29udGVudC1UeXBlIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWltZVR5cGUuc3RhcnRzV2l0aChnZXRDb250ZW50VHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3Bvc2l0aW9uKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwb3NpdGlvbihTdHJpbmcgZGlzcG9zaXRpb24pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCBkaXNwb3NpdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SUQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlcigiQ29udGVudC1JRCIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRJRChTdHJpbmcgY29udGVudElEKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0SGVhZGVyKCJDb250ZW50LUlEIiwgY29udGVudElEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRNRDUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlcigiQ29udGVudC1NRDUiLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TUQ1KFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNldEhlYWRlcigiQ29udGVudC1NRDUiLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0SGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGNoYXJzZXQpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldERlc2NyaXB0aW9uKG5ldyBTdHJpbmcoZGVzY3JpcHRpb24uZ2V0Qnl0ZXMoY2hhcnNldCkpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJzZXR0aW5nIGRlc2NyaXB0aW9uIGZhaWxlZCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRMYW5ndWFnZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9jb250ZW50TGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudExhbmd1YWdlKFN0cmluZ1tdIGNvbnRlbnRMYW5ndWFnZSkKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX2NvbnRlbnRMYW5ndWFnZSA9IGNvbnRlbnRMYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJRCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIklELSIgKyBtX2lNZXNzYWdlTnVtYmVyOyAvLyB0cml2aWFsIGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9maWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX2ZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsgLy8gdHJpdmlhbCBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOyAvLyB0cml2aWFsIGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJhd0lucHV0U3RyZWFtKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtX2NvbnRlbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obV9jb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmltcGxlbWVudGF0ZWQgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcigpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9kYXRhSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgbV9kYXRhSGFuZGxlciA9IGRhdGFIYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1fY29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KE9iamVjdCBvYmplY3QsIFN0cmluZyBtaW1lVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX2NvbnRlbnQgPSBvYmplY3Q7IC8vIHRyaXZpYWwgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzZXRDb250ZW50KHN0cmluZywgInRleHQvcGxhaW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcsIFN0cmluZyBjaGFyc2V0KQotICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDb250ZW50KG5ldyBTdHJpbmcoc3RyaW5nLmdldEJ5dGVzKGNoYXJzZXQpKSwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJzZXR0aW5nIHRleHQgY29udGVudCBmYWlsZWQiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoTXVsdGlwYXJ0IG11bHRpcGFydCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIG1fY29udGVudCA9IG11bHRpcGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSByZXBseShib29sZWFuIGIpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IE1vY2tNaW1lTWVzc2FnZSh0aGlzKTsgLy8gdHJpdmlhbCBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgOyAvLyB0cml2aWFsIGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBTdHJpbmdbXSBzdHJpbmdzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICA7IC8vIHRyaXZpYWwgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbV9jb250ZW50SGVhZGVycy5nZXQobmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgc3RyaW5nVmFsdWUgfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlbGltaXRlcikKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBoZWFkZXIgPSBnZXRIZWFkZXIobmFtZSk7Ci0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCB8fCBoZWFkZXIubGVuZ3RoID09IDApCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGhlYWRlclswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgbmV3VmFsdWU7Ci0gICAgICAgIE9iamVjdCBleGlzdGluZ1ZhbHVlID0gbV9jb250ZW50SGVhZGVycy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKGV4aXN0aW5nVmFsdWUpOwotICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3QgdmFsdWVzID0gKExpc3QpIGV4aXN0aW5nVmFsdWU7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWVzOwotICAgICAgICB9Ci0gICAgICAgIG1fY29udGVudEhlYWRlcnMucHV0KG5hbWUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBtX2NvbnRlbnRIZWFkZXJzLnJlbW92ZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsSGVhZGVycygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb24gZW50cmllcyA9IG1fY29udGVudEhlYWRlcnMuZW50cnlTZXQoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIHZhbHVlOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlclZhbHVlcyA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBpdGVyVmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobmV3IEhlYWRlcihuYW1lLCBzdHJpbmdWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobmV3IEhlYWRlcihuYW1lLCB2YWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHJlc3VsdHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IG1hdGNoaW5nSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEhlYWRlcihuYW1lLCBudWxsKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgbWF0Y2hpbmdIZWFkZXJzLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKG1hdGNoaW5nSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5vbk1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBMaXN0IGV4aXN0aW5nSGVhZGVycyA9IEFycmF5cy5hc0xpc3QobmFtZXMpOwotCi0gICAgICAgIEFycmF5TGlzdCBub25NYXRjaGluZ0hlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtX2NvbnRlbnRIZWFkZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGV4aXN0aW5nSGVhZGVycy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEhlYWRlcihuYW1lLCBudWxsKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgbm9uTWF0Y2hpbmdIZWFkZXJzLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKG5vbk1hdGNoaW5nSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyTGluZShTdHJpbmcgaGVhZGVyTGluZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzZXBhcmF0b3JJbmRleCA9IGhlYWRlckxpbmUuaW5kZXhPZigiOiIpOwotICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgImhlYWRlciBsaW5lIGRvZXMgbm90IGNvbmZvcm0gdG8gc3RhbmRhcmQiKTsKLQotICAgICAgICBhZGRIZWFkZXIoaGVhZGVyTGluZS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpLCBoZWFkZXJMaW5lCi0gICAgICAgICAgICAgICAgLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCwgaGVhZGVyTGluZS5sZW5ndGgoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxIZWFkZXJMaW5lcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oZ2V0SGVhZGVyc0FzU3RyaW5ncyhtX2NvbnRlbnRIZWFkZXJzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0SGVhZGVyc0FzU3RyaW5ncyhIYXNoTWFwIGNvbnRlbnRIZWFkZXJzKSB7Ci0gICAgICAgIEFycmF5TGlzdCBoZWFkZXJMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250ZW50SGVhZGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29udGVudEhlYWRlcnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICBoZWFkZXJMaW5lcy5hZGQoa2V5ICsgIjoiICsgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJMaW5lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgbWF0Y2hpbmdIZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0SGVhZGVyKG5hbWUsIG51bGwpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBtYXRjaGluZ0hlYWRlcnMuYWRkKG5hbWUgKyAiOiIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKG1hdGNoaW5nSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5vbk1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBleGlzdGluZ0hlYWRlcnMgPSBuYW1lcyAhPSBudWxsID8gQXJyYXlzLmFzTGlzdChuYW1lcykgOiBudWxsOwotCi0gICAgICAgIEFycmF5TGlzdCBub25NYXRjaGluZ0hlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtX2NvbnRlbnRIZWFkZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGV4aXN0aW5nSGVhZGVycyAhPSBudWxsICYmIGV4aXN0aW5nSGVhZGVycy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEhlYWRlcihuYW1lLCBudWxsKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgbm9uTWF0Y2hpbmdIZWFkZXJzLmFkZChuYW1lICsgIjoiICsgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihub25NYXRjaGluZ0hlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRmxhZ3MgZ2V0RmxhZ3MoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGbGFncyhtX3NldEZsYWdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTZXQoRmxhZ3MuRmxhZyBmbGFnKQotICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtX3NldEZsYWdzLmNvbnRhaW5zKGZsYWcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGbGFncyhGbGFncyBmbGFncywgYm9vbGVhbiBzZXQpCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNldCkKLSAgICAgICAgICAgIG1fc2V0RmxhZ3MuYWRkKGZsYWdzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9zZXRGbGFncy5yZW1vdmUoZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNhdmVDaGFuZ2VzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIDsgLy8gdHJpdmlhbCBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlYWRlcnMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgOyAvLyB0cml2aWFsIGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIEludGVybmV0SGVhZGVycyBjcmVhdGVJbnRlcm5ldEhlYWRlcnMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5ldEhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWNpcGllbnQoTWVzc2FnZS5SZWNpcGllbnRUeXBlIHJlY2lwaWVudFR5cGUsCi0gICAgICAgICAgICBBZGRyZXNzIGFkZHJlc3MpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBzZXRSZWNpcGllbnRzKHJlY2lwaWVudFR5cGUsIG5ldyBBZGRyZXNzW10geyBhZGRyZXNzIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlY2lwaWVudChNZXNzYWdlLlJlY2lwaWVudFR5cGUgcmVjaXBpZW50VHlwZSwKLSAgICAgICAgICAgIEFkZHJlc3MgYWRkcmVzcykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFJlY2lwaWVudHMocmVjaXBpZW50VHlwZSwgbmV3IEFkZHJlc3NbXSB7IGFkZHJlc3MgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmxhZyhGbGFncy5GbGFnIGZsYWcsIGJvb2xlYW4gc2V0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNldCkKLSAgICAgICAgICAgIG1fc2V0RmxhZ3MuYWRkKGZsYWcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3NldEZsYWdzLnJlbW92ZShmbGFnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBtX2lNZXNzYWdlTnVtYmVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2VOdW1iZXIoaW50IGkpIHsKLSAgICAgICAgbV9pTWVzc2FnZU51bWJlciA9IGk7Ci0gICAgfQotCi0gICAgcHVibGljIEZvbGRlciBnZXRGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhwdW5nZWQoKSB7Ci0gICAgICAgIHJldHVybiBtX2JJc0V4cHVuZ2VkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4cHVuZ2VkKGJvb2xlYW4gYikgewotICAgICAgICBtX2JJc0V4cHVuZ2VkID0gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaG91bGRNYXRjaChib29sZWFuIGRvTWF0Y2gpIHsKLSAgICAgICAgbV9kb01hdGNoID0gZG9NYXRjaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTZWFyY2hUZXJtIHNlYXJjaFRlcm0pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbV9kb01hdGNoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpIHsKLSAgICAgICAgdGhpcy5tX3NpemUgPSBzaXplOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvU2lldmVOb2RlQ29tbWVudFRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvU2lldmVOb2RlQ29tbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmNmQ3My4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL1NpZXZlTm9kZUNvbW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzLkpVbml0VXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTaWV2ZU5vZGVDb21tZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9Db21tZW50c0JlZm9yZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTaWV2ZU5vZGUgbm9kZSA9IChTaWV2ZU5vZGUpIEpVbml0VXRpbHMucGFyc2UoImlmIGFkZHJlc3MgOmNvbnRhaW5zIFtcIlRvXCIsIFwiRnJvbVwiXSBcIkZpc2ghXCJ7IH0iKTsKLSAgICAgICAgTGlzdCBjb21tZW50cyA9IG5vZGUuZ2V0UHJlY2VkaW5nQ29tbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21tZW50cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjb21tZW50cy5zaXplKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnJhY2tldENvbW1lbnRzQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpZXZlTm9kZSBub2RlID0gKFNpZXZlTm9kZSkgSlVuaXRVdGlscy5wYXJzZSgiLyogQSBDb21tZW50ICovLyogQW5vdGhlciBjb21tZW50ICovaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgfSIpOwotICAgICAgICBMaXN0IGNvbW1lbnRzID0gbm9kZS5nZXRQcmVjZWRpbmdDb21tZW50cygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbW1lbnRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbW1lbnRzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIEEgQ29tbWVudCAiLCBjb21tZW50cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiBBbm90aGVyIGNvbW1lbnQgIiwgY29tbWVudHMuZ2V0KDEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEhhc2hDb21tZW50c0JlZm9yZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTaWV2ZU5vZGUgbm9kZSA9IChTaWV2ZU5vZGUpIEpVbml0VXRpbHMucGFyc2UoIi8qIEEgQ29tbWVudCAqLyNBIExpbmUgQ29tbWVudFxuaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgfSIpOwotICAgICAgICBMaXN0IGNvbW1lbnRzID0gbm9kZS5nZXRQcmVjZWRpbmdDb21tZW50cygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbW1lbnRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbW1lbnRzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIEEgQ29tbWVudCAiLCBjb21tZW50cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkEgTGluZSBDb21tZW50IiwgY29tbWVudHMuZ2V0KDEpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEhhc2hDb21tZW50c0JlZm9yZUNSTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2lldmVOb2RlIG5vZGUgPSAoU2lldmVOb2RlKSBKVW5pdFV0aWxzLnBhcnNlKCIvKiBBIENvbW1lbnQgKi8jQSBMaW5lIENvbW1lbnRcclxuaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgfSIpOwotICAgICAgICBMaXN0IGNvbW1lbnRzID0gbm9kZS5nZXRQcmVjZWRpbmdDb21tZW50cygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbW1lbnRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbW1lbnRzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIEEgQ29tbWVudCAiLCBjb21tZW50cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkEgTGluZSBDb21tZW50IiwgY29tbWVudHMuZ2V0KDEpKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFzdENvbW1lbnROb25lQmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpZXZlTm9kZSBub2RlID0gKFNpZXZlTm9kZSkgSlVuaXRVdGlscy5wYXJzZSgiaWYgYWRkcmVzcyA6Y29udGFpbnMgW1wiVG9cIiwgXCJGcm9tXCJdIFwiRmlzaCFcInsgfSIpOwotICAgICAgICBhc3NlcnROdWxsKG5vZGUuZ2V0TGFzdENvbW1lbnQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCcmFja2V0TGFzdENvbW1lbnRCZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2lldmVOb2RlIG5vZGUgPSAoU2lldmVOb2RlKSBKVW5pdFV0aWxzLnBhcnNlKCIvKiBBIENvbW1lbnQgKi8vKiBBbm90aGVyIGNvbW1lbnQgKi9pZiBhZGRyZXNzIDpjb250YWlucyBbXCJUb1wiLCBcIkZyb21cIl0gXCJGaXNoIVwieyB9Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIEFub3RoZXIgY29tbWVudCAiLCBub2RlLmdldExhc3RDb21tZW50KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGFzaExhc3RDb21tZW50QmVmb3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpZXZlTm9kZSBub2RlID0gKFNpZXZlTm9kZSkgSlVuaXRVdGlscy5wYXJzZSgiLyogQSBDb21tZW50ICovI0EgTGluZSBDb21tZW50XG5pZiBhZGRyZXNzIDpjb250YWlucyBbXCJUb1wiLCBcIkZyb21cIl0gXCJGaXNoIVwieyB9Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQSBMaW5lIENvbW1lbnQiLCBub2RlLmdldExhc3RDb21tZW50KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGFzaExhc3RDb21tZW50QmVmb3JlQ1JMRigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTaWV2ZU5vZGUgbm9kZSA9IChTaWV2ZU5vZGUpIEpVbml0VXRpbHMucGFyc2UoIi8qIEEgQ29tbWVudCAqLyNBIExpbmUgQ29tbWVudFxyXG5pZiBhZGRyZXNzIDpjb250YWlucyBbXCJUb1wiLCBcIkZyb21cIl0gXCJGaXNoIVwieyB9Iik7OwotICAgICAgICBhc3NlcnRFcXVhbHMoIkEgTGluZSBDb21tZW50Iiwgbm9kZS5nZXRMYXN0Q29tbWVudCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvcGFyc2VyL2FkZHJlc3MvU2lldmVBZGRyZXNzQnVpbGRlclRlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvYWRkcmVzcy9TaWV2ZUFkZHJlc3NCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY5OWI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS9wYXJzZXIvYWRkcmVzcy9TaWV2ZUFkZHJlc3NCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5hZGRyZXNzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlci5BZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuYWRkcmVzcy5QYXJzZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpZXZlQWRkcmVzc0J1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOID0gImV4YW1wbGUub3JnIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPWU9URSA9ICJjb3lvdGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ZT1RFX0FERFJFU1MgPSBDT1lPVEUgKyAiQCIgKyBET01BSU47Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FEUlVOTkVSID0gInJvYWRydW5uZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9BRFJVTk5FUl9BRERSRVNTID0gUk9BRFJVTk5FUiArICJAIiArIERPTUFJTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVR1MgPSAiYnVncyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUdTX0FERFJFU1MgPSBCVUdTICsgIkAiICsgRE9NQUlOOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVST1MgPSBST0FEUlVOTkVSX0FERFJFU1MgKyAiICwgIgotICAgICAgICAgICAgKyBCVUdTX0FERFJFU1M7Ci0KLSAgICBTaWV2ZUFkZHJlc3NCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBidWlsZGVyID0gbmV3IFNpZXZlQWRkcmVzc0J1aWxkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRlcgotICAgICAgICAgICAgICAgICAgICAuYWRkQWRkcmVzc2VzKCJXaGF0IGEgbG9hZCBvZiBydWJiaXNoIC0gbm90IGFuIGFkZHJlc3MgaW4gc2lnaHQhIik7Ci0gICAgICAgICAgICBmYWlsKCJQYXJzaW5nIHNob3VsZCBmYWlsIHdoZW4gdGhlIGlucHV0IGlzIG5vdCBhbiBhZGRyZXNzIik7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWRkcmVzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYnVpbGRlci5nZXRBZGRyZXNzZXMoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQWRkcmVzc2VzKENPWU9URV9BRERSRVNTKTsKLSAgICAgICAgQWRkcmVzc1tdIGFkZHJlc3NlcyA9IGJ1aWxkZXIuZ2V0QWRkcmVzc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRkcmVzc2VzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ09ZT1RFLCBhZGRyZXNzZXNbMF0uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRE9NQUlOLCBhZGRyZXNzZXNbMF0uZ2V0RG9tYWluKCkpOwotICAgICAgICBidWlsZGVyLmFkZEFkZHJlc3NlcyhIRVJPUyk7Ci0gICAgICAgIGFkZHJlc3NlcyA9IGJ1aWxkZXIuZ2V0QWRkcmVzc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRkcmVzc2VzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFkZHJlc3Nlcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ09ZT1RFLCBhZGRyZXNzZXNbMF0uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRE9NQUlOLCBhZGRyZXNzZXNbMF0uZ2V0RG9tYWluKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUk9BRFJVTk5FUiwgYWRkcmVzc2VzWzFdLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERPTUFJTiwgYWRkcmVzc2VzWzFdLmdldERvbWFpbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJVR1MsIGFkZHJlc3Nlc1syXS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhET01BSU4sIGFkZHJlc3Nlc1syXS5nZXREb21haW4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYnVpbGRlci5nZXRBZGRyZXNzZXMoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQWRkcmVzc2VzKENPWU9URV9BRERSRVNTKTsKLSAgICAgICAgQWRkcmVzc1tdIGFkZHJlc3NlcyA9IGJ1aWxkZXIuZ2V0QWRkcmVzc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRkcmVzc2VzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFkZHJlc3Nlcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ09ZT1RFLCBhZGRyZXNzZXNbMF0uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRE9NQUlOLCBhZGRyZXNzZXNbMF0uZ2V0RG9tYWluKCkpOwotICAgICAgICBhZGRyZXNzZXMgPSBidWlsZGVyLmdldEFkZHJlc3NlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFkZHJlc3Nlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhZGRyZXNzZXMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPWU9URSwgYWRkcmVzc2VzWzBdLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERPTUFJTiwgYWRkcmVzc2VzWzBdLmdldERvbWFpbigpKTsKLSAgICAgICAgYnVpbGRlci5yZXNldCgpOwotICAgICAgICBhZGRyZXNzZXMgPSBidWlsZGVyLmdldEFkZHJlc3NlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFkZHJlc3Nlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBhZGRyZXNzZXMubGVuZ3RoKTsKLSAgICAgICAgYnVpbGRlci5hZGRBZGRyZXNzZXMoQ09ZT1RFX0FERFJFU1MpOwotICAgICAgICBhZGRyZXNzZXMgPSBidWlsZGVyLmdldEFkZHJlc3NlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFkZHJlc3Nlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhZGRyZXNzZXMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPWU9URSwgYWRkcmVzc2VzWzBdLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERPTUFJTiwgYWRkcmVzc2VzWzBdLmdldERvbWFpbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9Nb2NrQWN0aW9uLmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9Nb2NrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmM4OWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svTW9ja0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsLmNoZWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBNb2NrQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlci5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBmZDkxLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrTWFpbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWwuY2hlY2s7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgubWFpbC5IZWFkZXI7Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuU2lldmVDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuU2lldmVNYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5hZGRyZXNzLlNpZXZlQWRkcmVzc0J1aWxkZXI7Ci0KLS8qKgotICogQ2hlY2tzIHNjcmlwdCBleGVjdXRpb24gZm9yIGFuIGVtYWlsLiBUaGUgd3JhcHBlZCBlbWFpbCBpcyBzZXQgYnkgY2FsbGVkCi0gKiB7QGxpbmsgI3NldE1haWx9LiBBY3Rpb25zIGFyZSByZWNvcmRlZCBvbiB7QGxpbmsgI2V4ZWN1dGVkQWN0aW9uc30gYW5kIGNhbgotICogYmUgcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0RXhlY3V0ZWRBY3Rpb25zKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlciBpbXBsZW1lbnRzIE1haWxBZGFwdGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWN0aW9uPiBleGVjdXRlZEFjdGlvbnM7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2UgbWFpbCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlcigpIHsKLSAgICAgICAgYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICBleGVjdXRlZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB3cmFwcGVkIGVtYWlsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TWVzc2FnZTwvY29kZT4sIHBvc3NpYmx5IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNYWlsKCkgewotICAgICAgICByZXR1cm4gbWFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3cmFwcGVkIGVtYWlsIGFuZCB7QGxpbmsgI3Jlc2V0fXMgdGhlIGFkYXB0ZXIgcmVhZHkgZm9yIGFub3RoZXIKLSAgICAgKiBleGVjdXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPk1lc3NhZ2U8L2NvZGU+LCBwb3NzaWJseSBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFpbChNZXNzYWdlIG1haWwpIHsKLSAgICAgICAgdGhpcy5tYWlsID0gbWFpbDsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkQWN0aW9uIGFkZHMgYW4gQWN0aW9uIHRvIHRoZSBMaXN0IG9mIEFjdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGJ5Ci0gICAgICogdGhlIHJlY2VpdmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBY3Rpb24oZmluYWwgQWN0aW9uIGFjdGlvbikgewotICAgICAgICBhY3Rpb25zLmFkZChhY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBleGVjdXRlQWN0aW9ucy4gQXBwbGllcyB0aGUgQWN0aW9ucyBhY2N1bXVsYXRlZCBieSB0aGUgcmVjZWl2ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZUFjdGlvbnMoKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlZEFjdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0ZWRBY3Rpb25zLmFkZEFsbChhY3Rpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhY3Rpb25zIGFjY3VtdWxhdGVkIHdoZW4ge0BsaW5rICNleGVjdXRlZEFjdGlvbnN9IHdhcyBsYXN0Ci0gICAgICogY2FsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIEFjdGlvbn1zLCBub3QgbnVsbC4gVGhpcyBsaXN0IGlzIGEKLSAgICAgKiAgICAgICAgIG1vZGlmaWFibGUgY29weQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEFjdGlvbj4gZ2V0RXhlY3V0ZWRBY3Rpb25zKCkgewotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oZXhlY3V0ZWRBY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0QWN0aW9ucyBhbnN3ZXJzIHRoZSBMaXN0IG9mIEFjdGlvbnMgYWNjdW11bGF0ZWQgYnkgdGhlCi0gICAgICogcmVjZWl2ZXIuIEltcGxlbWVudGF0aW9ucyBtYXkgZWxlY3QgdG8gc3VwcGx5IGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIEFjdGlvbn0ncywgbm90IG51bGwsIHBvc3NpYmx5Ci0gICAgICogICAgICAgICB1bm1vZGlmaWFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBY3Rpb24+IGdldEFjdGlvbnMoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QWN0aW9uPiByZXN1bHQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyBleGVjdXRlZCBhbmQgYWNjdW1sYXRlZCBhY3Rpb25zLiBBbiBpbnN0YW5jZSBtYXkgYmUgc2FmZWx5IHJldXNlZAotICAgICAqIHRvIGNoZWNrIGEgc2NyaXB0IG9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBleGVjdXRlZEFjdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgYWN0aW9ucy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRIZWFkZXIgYW5zd2VycyBhIExpc3Qgb2YgYWxsIG9mIHRoZSBoZWFkZXJzIGluIHRoZSByZWNlaXZlcgotICAgICAqIHdob3NlIG5hbWUgaXMgZXF1YWwgdG8gdGhlIHBhc3NlZCBuYW1lLiBJZiBubyBoZWFkZXJzIGFyZSBmb3VuZCBhbiBlbXB0eQotICAgICAqIExpc3QgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkxpc3Q8L2NvZGU+IG5vdCBudWxsLCBwb3NzaWJseSBlbXB0eQotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgaWYgKG1haWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBtYWlsLmdldEhlYWRlcihuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXlzLmFzTGlzdCh2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRIZWFkZXJOYW1lcyBhbnN3ZXJzIGEgTGlzdCBvZiBhbGwgb2YgdGhlIGhlYWRlcnMgaW4gdGhlCi0gICAgICogcmVjZWl2ZXIuIE5vIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiwgbm90IG51bGwgcG9zc2libGUgZW1wdHksIHBvc3NpYmxlCi0gICAgICogICAgICAgICB1bm1vZGlmaWFibGUKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyTmFtZXMoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICBpZiAobWFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIEVudW1lcmF0aW9uIGVuID0gbWFpbC5nZXRBbGxIZWFkZXJzKCk7IGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBlbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGhlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogTWV0aG9kIGdldE1hdGNoaW5nSGVhZGVyIGFuc3dlcnMgYSBMaXN0IG9mIGFsbCBvZiB0aGUgaGVhZGVycyBpbiB0aGUKLSAgICAgKiByZWNlaXZlciB3aXRoIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gaGVhZGVycyBhcmUgZm91bmQgYW4gZW1wdHkgTGlzdCBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gZ2V0SGVhZGVyKFN0cmluZykgaW4gdGhhdCBpdCBpZ25vcmVzIGNhc2UgYW5kCi0gICAgICogdGhlIHdoaXRlc3BhY2UgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIG9mIGEgaGVhZGVyIG5hbWUgd2hlbiBwZXJmb3JtaW5nIHRoZQotICAgICAqIG1hdGNoLCBhcyByZXF1aXJlZCBieSBSRkMgMzAyOC4gVGh1cyAiRnJvbSIsICJmcm9tICIsICIgRnJvbSIgYW5kICIgZnJvbSAiCi0gICAgICogYXJlIGNvbnNpZGVyZWQgZXF1YWwuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiwgbm90IG51bGwgcG9zc2libHkgZW1wdHkKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgaWYgKG1haWwgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gTWFpbFV0aWxzLmdldE1hdGNoaW5nSGVhZGVyKHRoaXMsIG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFNpemUgYW5zd2VycyB0aGUgcmVjZWl2ZXIncyBtZXNzYWdlIHNpemUgaW4gb2N0ZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgIGlmIChtYWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFpbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0Q29udGVudFR5cGUgcmV0dXJucyBzdHJpbmcvbWltZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZQotICAgICAqIHR5cGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChtYWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFpbC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkJvZHlUZXh0KFN0cmluZyBwaHJhc2VDYXNlSW5zZW5zaXRpdmUpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBpZiAobWFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1haWwuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhwaHJhc2VDYXNlSW5zZW5zaXRpdmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc1tdIHBhcnNlQWRkcmVzc2VzKFN0cmluZyBoZWFkZXJOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZUFkZHJlc3NlcyhoZWFkZXJOYW1lLCBtYWlsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHZhbHVlIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UgaW50byBhZGRyZXNzZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlck5hbWUKLSAgICAgKiAgICAgICAgICAgIGhlYWRlciBuYW1lLCB0byBiZSBtYXRjaGVkIGNhc2UgaW5zZW5zaXRpdmVseQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICA8Y29kZT5NZXNzYWdlPC9jb2RlPiwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkFkZHJlc3M8L2NvZGU+IGFycmF5LCBub3QgbnVsbCBwb3NzaWJseSBlbXB0eQotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEFkZHJlc3NbXSBwYXJzZUFkZHJlc3NlcyhmaW5hbCBTdHJpbmcgaGVhZGVyTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBTaWV2ZUFkZHJlc3NCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2lldmVBZGRyZXNzQnVpbGRlcigpOwotCi0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVuID0gbWVzc2FnZS5nZXRBbGxIZWFkZXJzKCk7IGVuLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBlbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gaGVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXJOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFkZHJlc3NlcyhoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBBZGRyZXNzW10gcmVzdWx0cyA9IGJ1aWxkZXIuZ2V0QWRkcmVzc2VzKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZXgpOwotICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTaWV2ZUNvbnRleHQgY29udGV4dCkge30KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlckFjdGlvbnNUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyQWN0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NmNkOS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyQWN0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWwuY2hlY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTY3JpcHRDaGVja01haWxBZGFwdGVyQWN0aW9uc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBTY3JpcHRDaGVja01haWxBZGFwdGVyIGFkYXB0ZXI7Ci0KLSAgICBBY3Rpb24gYWN0aW9uOwotCi0gICAgQWN0aW9uIGFub3RoZXJBY3Rpb247Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBhZGFwdGVyID0gbmV3IFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIoKTsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vY2tBY3Rpb24oKTsKLSAgICAgICAgYW5vdGhlckFjdGlvbiA9IG5ldyBNb2NrQWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFjdGlvbigpIHsKLSAgICAgICAgYWRhcHRlci5hZGRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSdW5uaW5nIHRvdGFsIHVwZGF0ZWQiLCAxLCBhZGFwdGVyLmdldEFjdGlvbnMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJ1bm5pbmcgdG90YWwgdXBkYXRlZCIsIGFjdGlvbiwgYWRhcHRlci5nZXRBY3Rpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgIDApKTsKLSAgICAgICAgYWRhcHRlci5hZGRBY3Rpb24oYW5vdGhlckFjdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT3JkZXIgcHJlc2VydmVkIiwgMiwgYWRhcHRlci5nZXRBY3Rpb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcmRlciBwcmVzZXJ2ZWQiLCBhbm90aGVyQWN0aW9uLCBhZGFwdGVyLmdldEFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5nZXQoMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnROb3ROdWxsKGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk5vIGFjdGlvbnMgZXhlY3V0ZWQiLCAwLCBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gICAgICAgIGFkYXB0ZXIuYWRkQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTm8gYWN0aW9ucyBleGVjdXRlZCIsIDAsIGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgYWRhcHRlci5leGVjdXRlQWN0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk9uZSBhY3Rpb24gZXhlY3V0ZWQiLCAxLCBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFjdGlvbnMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRhcHRlci5nZXRBY3Rpb25zKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRhcHRlci5nZXRBY3Rpb25zKCkuYWRkKG5ldyBBY3Rpb24oKSB7fSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGJlIGFibGUgdG8gbW9kaWZ5IGNvbGxlY3Rpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotICAgICAgICBhZGFwdGVyLmFkZEFjdGlvbihhY3Rpb24pOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFkYXB0ZXIuZ2V0QWN0aW9ucygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSdW5uaW5nIHRvdGFsIHVwZGF0ZWQiLCAxLCBhZGFwdGVyLmdldEFjdGlvbnMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJ1bm5pbmcgdG90YWwgdXBkYXRlZCIsIGFjdGlvbiwgYWRhcHRlci5nZXRBY3Rpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgIDApKTsKLSAgICAgICAgYWRhcHRlci5hZGRBY3Rpb24oYW5vdGhlckFjdGlvbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRhcHRlci5nZXRBY3Rpb25zKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk9yZGVyIHByZXNlcnZlZCIsIDIsIGFkYXB0ZXIuZ2V0QWN0aW9ucygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT3JkZXIgcHJlc2VydmVkIiwgYW5vdGhlckFjdGlvbiwgYWRhcHRlci5nZXRBY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAuZ2V0KDEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhlY3V0ZWRBY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTm8gYWN0aW9ucyBleGVjdXRlZCIsIDAsIGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgYWRhcHRlci5hZGRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJObyBhY3Rpb25zIGV4ZWN1dGVkIiwgMCwgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICAgICAgICBhZGFwdGVyLmV4ZWN1dGVBY3Rpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT25lIGFjdGlvbiBleGVjdXRlZCIsIDEsIGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmUgYWN0aW9uIGV4ZWN1dGVkIiwgYWN0aW9uLCBhZGFwdGVyCi0gICAgICAgICAgICAgICAgLmdldEV4ZWN1dGVkQWN0aW9ucygpLmdldCgwKSk7Ci0gICAgICAgIGFkYXB0ZXIuYWRkQWN0aW9uKGFub3RoZXJBY3Rpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk9uZSBhY3Rpb24gZXhlY3V0ZWQiLCAxLCBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT25lIGFjdGlvbiBleGVjdXRlZCIsIGFjdGlvbiwgYWRhcHRlcgotICAgICAgICAgICAgICAgIC5nZXRFeGVjdXRlZEFjdGlvbnMoKS5nZXQoMCkpOwotICAgICAgICBhZGFwdGVyLmV4ZWN1dGVBY3Rpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHdvIGFjdGlvbnMgZXhlY3V0ZWQiLCAyLCBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHdvIGFjdGlvbnMgZXhlY3V0ZWQiLCBhY3Rpb24sIGFkYXB0ZXIKLSAgICAgICAgICAgICAgICAuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUd28gYWN0aW9ucyBleGVjdXRlZCIsIGFub3RoZXJBY3Rpb24sIGFkYXB0ZXIKLSAgICAgICAgICAgICAgICAuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkuZ2V0KDEpKTsKLSAgICAgICAgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKS5hZGQobmV3IEFjdGlvbigpe30pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIGV4ZWN1dGVkIiwgMiwgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIGV4ZWN1dGVkIiwgYWN0aW9uLCBhZGFwdGVyCi0gICAgICAgICAgICAgICAgLmdldEV4ZWN1dGVkQWN0aW9ucygpLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHdvIGFjdGlvbnMgZXhlY3V0ZWQiLCBhbm90aGVyQWN0aW9uLCBhZGFwdGVyCi0gICAgICAgICAgICAgICAgLmdldEV4ZWN1dGVkQWN0aW9ucygpLmdldCgxKSk7Ci0gICAgICAgIGFkYXB0ZXIuZXhlY3V0ZUFjdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUd28gYWN0aW9ucyBleGVjdXRlZCIsIDIsIGFkYXB0ZXIuZ2V0RXhlY3V0ZWRBY3Rpb25zKCkKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUd28gYWN0aW9ucyBleGVjdXRlZCIsIGFjdGlvbiwgYWRhcHRlcgotICAgICAgICAgICAgICAgIC5nZXRFeGVjdXRlZEFjdGlvbnMoKS5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIGV4ZWN1dGVkIiwgYW5vdGhlckFjdGlvbiwgYWRhcHRlcgotICAgICAgICAgICAgICAgIC5nZXRFeGVjdXRlZEFjdGlvbnMoKS5nZXQoMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhZGFwdGVyLmFkZEFjdGlvbihhY3Rpb24pOwotICAgICAgICBhZGFwdGVyLmFkZEFjdGlvbihhbm90aGVyQWN0aW9uKTsKLSAgICAgICAgYWRhcHRlci5leGVjdXRlQWN0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIGV4ZWN1dGVkIiwgMiwgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIiwgMiwgYWRhcHRlci5nZXRBY3Rpb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgYWRhcHRlci5yZXNldCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIGV4ZWN1dGVkIiwgMCwgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byBhY3Rpb25zIiwgMCwgYWRhcHRlci5nZXRBY3Rpb25zKCkuc2l6ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVySGVhZGVyc1Rlc3QuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrTWFpbEFkYXB0ZXJIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI0NzhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrTWFpbEFkYXB0ZXJIZWFkZXJzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbC5jaGVjazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuamF2YXhtYWlsLk1vY2tNaW1lTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFNjcmlwdENoZWNrTWFpbEFkYXB0ZXJIZWFkZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkNDID0gIkJjYyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE8gPSAiVG8iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZST00gPSAiRnJvbSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TSVpFID0gMTAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJDQ19BRERSRVNTX09ORSA9ICJidWdzQHRvb25zLmV4YW1wbGUub3JnIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQ0NfQUREUkVTU19UV08gPSAiZGFmZnlAdG9vbnMuZXhhbXBsZS5vcmciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX0FERFJFU1MgPSAicm9hZHJ1bm5lckBhY21lLmV4YW1wbGUuY29tIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYX0hFQURFUl9OQU1FID0gIlgtVG9vbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9IRUFERVJfV0lUSF9XUyA9ICIgICAiCi0gICAgICAgICAgICArIFhfSEVBREVSX05BTUUudG9Mb3dlckNhc2UoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYX0hFQURFUl9WQUxVRSA9ICJSb2FkIFJ1bm5lciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9IRUFERVJfVkFMVUVfQUxUID0gIldpbGUgRS4gQ295b3RlIEFuZCBSb2FkIFJ1bm5lciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJPTV9BRERSRVNTID0gImNveW90ZUBkZXNlcnQuZXhhbXBsZS5vcmciOwotCi0gICAgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlciBhZGFwdGVyOwotCi0gICAgTW9ja01pbWVNZXNzYWdlIG1lc3NhZ2U7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBhZGFwdGVyID0gbmV3IFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIoKTsKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBNb2NrTWltZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5hZGRIZWFkZXIoRlJPTSwgRlJPTV9BRERSRVNTKTsKLSAgICAgICAgbWVzc2FnZS5hZGRIZWFkZXIoVE8sIFRPX0FERFJFU1MpOwotICAgICAgICBtZXNzYWdlLmFkZEhlYWRlcihCQ0MsIEJDQ19BRERSRVNTX09ORSk7Ci0gICAgICAgIG1lc3NhZ2UuYWRkSGVhZGVyKEJDQywgQkNDX0FERFJFU1NfVFdPKTsKLSAgICAgICAgbWVzc2FnZS5hZGRIZWFkZXIoWF9IRUFERVJfTkFNRSwgWF9IRUFERVJfVkFMVUUpOwotICAgICAgICBtZXNzYWdlLmFkZEhlYWRlcihYX0hFQURFUl9OQU1FLnRvTG93ZXJDYXNlKCksIFhfSEVBREVSX1ZBTFVFCi0gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICBtZXNzYWdlLmFkZEhlYWRlcihYX0hFQURFUl9XSVRIX1dTLCBYX0hFQURFUl9WQUxVRV9BTFQpOwotICAgICAgICBtZXNzYWdlLnNldFNpemUoTUVTU0FHRV9TSVpFKTsKLSAgICAgICAgYWRhcHRlci5zZXRNYWlsKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlcihGUk9NKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcm9tIGhlYWRlciIsIDEsIGhlYWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcm9tIGhlYWRlciIsIEZST01fQUREUkVTUywgaGVhZGVycy5nZXQoMCkpOwotICAgICAgICBoZWFkZXJzID0gYWRhcHRlci5nZXRIZWFkZXIoQkNDKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCY2MgaGVhZGVycyIsIDIsIGhlYWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQmNjIGhlYWRlcnMiLCBoZWFkZXJzLmNvbnRhaW5zKEJDQ19BRERSRVNTX09ORSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJCY2MgaGVhZGVycyIsIGhlYWRlcnMuY29udGFpbnMoQkNDX0FERFJFU1NfVFdPKSk7Ci0gICAgICAgIGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlcihYX0hFQURFUl9OQU1FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYXNlIGFuZCB3aGl0ZXNwYWNlIHNlbnNpdGl2ZSIsIDEsIGhlYWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYXNlIGFuZCB3aGl0ZXNwYWNlIHNlbnNpdGl2ZSIsIFhfSEVBREVSX1ZBTFVFLCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgLmdldCgwKSk7Ci0gICAgICAgIGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlcihYX0hFQURFUl9OQU1FLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNhc2UgYW5kIHdoaXRlc3BhY2Ugc2Vuc2l0aXZlIiwgMSwgaGVhZGVycy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNhc2UgYW5kIHdoaXRlc3BhY2Ugc2Vuc2l0aXZlIiwgWF9IRUFERVJfVkFMVUUKLSAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKSwgaGVhZGVycy5nZXQoMCkpOwotICAgICAgICBoZWFkZXJzID0gYWRhcHRlci5nZXRIZWFkZXIoWF9IRUFERVJfV0lUSF9XUyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2FzZSBhbmQgd2hpdGVzcGFjZSBzZW5zaXRpdmUiLCAxLCBoZWFkZXJzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2FzZSBhbmQgd2hpdGVzcGFjZSBzZW5zaXRpdmUiLCBYX0hFQURFUl9WQUxVRV9BTFQsCi0gICAgICAgICAgICAgICAgaGVhZGVycy5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIZWFkZXJOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlck5hbWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWxsIGhlYWRlcnMgc2V0IHJldHVybmVkIiwgNiwgaGVhZGVycy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJBbGwgaGVhZGVycyBzZXQgcmV0dXJuZWQiLCBoZWFkZXJzLmNvbnRhaW5zKEJDQykpOwotICAgICAgICBhc3NlcnRUcnVlKCJBbGwgaGVhZGVycyBzZXQgcmV0dXJuZWQiLCBoZWFkZXJzLmNvbnRhaW5zKFRPKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkFsbCBoZWFkZXJzIHNldCByZXR1cm5lZCIsIGhlYWRlcnMuY29udGFpbnMoRlJPTSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJBbGwgaGVhZGVycyBzZXQgcmV0dXJuZWQiLCBoZWFkZXJzLmNvbnRhaW5zKFhfSEVBREVSX05BTUUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsIGhlYWRlcnMgc2V0IHJldHVybmVkIiwgaGVhZGVycy5jb250YWlucyhYX0hFQURFUl9OQU1FCi0gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxsIGhlYWRlcnMgc2V0IHJldHVybmVkIiwgaGVhZGVycwotICAgICAgICAgICAgICAgIC5jb250YWlucyhYX0hFQURFUl9XSVRIX1dTKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1hdGNoaW5nSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJzID0gYWRhcHRlci5nZXRNYXRjaGluZ0hlYWRlcihGUk9NKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcm9tIGhlYWRlcnMgc2V0IHJldHVybmVkIiwgMSwgaGVhZGVycy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJGcm9tIGhlYWRlcnMgc2V0IHJldHVybmVkIiwgaGVhZGVycy5jb250YWlucyhGUk9NX0FERFJFU1MpKTsKLSAgICAgICAgaGVhZGVycyA9IGFkYXB0ZXIuZ2V0TWF0Y2hpbmdIZWFkZXIoWF9IRUFERVJfTkFNRSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiTWF0Y2hlcyBpZ25vcmluZyB3aGl0ZXNwYWNlIGFuZCBjYXBpdGFsaXNhdGlvbiBoZWFkZXJzIHNldCByZXR1cm5lZCIsCi0gICAgICAgICAgICAgICAgMywgaGVhZGVycy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICJNYXRjaGVzIGlnbm9yaW5nIHdoaXRlc3BhY2UgYW5kIGNhcGl0YWxpc2F0aW9uIGhlYWRlcnMgc2V0IHJldHVybmVkIiwKLSAgICAgICAgICAgICAgICBoZWFkZXJzLmNvbnRhaW5zKFhfSEVBREVSX1ZBTFVFKSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIk1hdGNoZXMgaWdub3Jpbmcgd2hpdGVzcGFjZSBhbmQgY2FwaXRhbGlzYXRpb24gaGVhZGVycyBzZXQgcmV0dXJuZWQiLAotICAgICAgICAgICAgICAgIGhlYWRlcnMuY29udGFpbnMoWF9IRUFERVJfVkFMVUVfQUxUKSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIk1hdGNoZXMgaWdub3Jpbmcgd2hpdGVzcGFjZSBhbmQgY2FwaXRhbGlzYXRpb24gaGVhZGVycyBzZXQgcmV0dXJuZWQiLAotICAgICAgICAgICAgICAgIGhlYWRlcnMuY29udGFpbnMoWF9IRUFERVJfVkFMVUUudG9Mb3dlckNhc2UoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaXplID0gYWRhcHRlci5nZXRTaXplKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBzaXplIHNldCIsIE1FU1NBR0VfU0laRSwgc2l6ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlck1haWxUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyTWFpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOTQyYS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyTWFpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbC5jaGVjazsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlck1haWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlciBhZGFwdGVyOwotCi0gICAgQWN0aW9uIGFjdGlvbjsKLQotICAgIEFjdGlvbiBhbm90aGVyQWN0aW9uOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgYWRhcHRlciA9IG5ldyBTY3JpcHRDaGVja01haWxBZGFwdGVyKCk7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb2NrQWN0aW9uKCk7Ci0gICAgICAgIGFub3RoZXJBY3Rpb24gPSBuZXcgTW9ja0FjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFkYXB0ZXIuYWRkQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgIGFkYXB0ZXIuYWRkQWN0aW9uKGFub3RoZXJBY3Rpb24pOwotICAgICAgICBhZGFwdGVyLmV4ZWN1dGVBY3Rpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHdvIGFjdGlvbnMgZXhlY3V0ZWQiLCAyLCBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHdvIGFjdGlvbnMiLCAyLCBhZGFwdGVyLmdldEFjdGlvbnMoKS5zaXplKCkpOwotICAgICAgICBhZGFwdGVyLnNldE1haWwobnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2V0IG1haWwgcmVzZXRzIiwgMCwgYWRhcHRlci5nZXRFeGVjdXRlZEFjdGlvbnMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNldCBtYWlsIHJlc2V0cyIsIDAsIGFkYXB0ZXIuZ2V0QWN0aW9ucygpLnNpemUoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyTm9NZXNzYWdlU2V0VGVzdC5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlck5vTWVzc2FnZVNldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZjZlOC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyTm9NZXNzYWdlU2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsLmNoZWNrOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTY3JpcHRDaGVja01haWxBZGFwdGVyTm9NZXNzYWdlU2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIgYWRhcHRlcjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGFkYXB0ZXIgPSBuZXcgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlcigiRnJvbSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRIZWFkZXJOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IGhlYWRlcnMgPSBhZGFwdGVyLmdldEhlYWRlck5hbWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1hdGNoaW5nSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgaGVhZGVycyA9IGFkYXB0ZXIuZ2V0TWF0Y2hpbmdIZWFkZXIoIkZyb20iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXNHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaXplID0gYWRhcHRlci5nZXRTaXplKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2hlbiBtYWlsIG5vdCBzZXQsIHNpemUgaXMgemVybyIsIDAsIHNpemUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrZXIuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5ZDQwMS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsLmNoZWNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25GaWxlSW50bzsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbktlZXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb25SZWRpcmVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIENoZWNrcyBhIDxjb2RlPnNpZXZlPC9jb2RlPiBzY3JpcHQgYnkgZXhlY3V0aW5nIGl0IGFnYWluc3QgYSBnaXZlbiBtYWlsIGFuZAotICogcmVwb3J0aW5nIHRoZSByZXN1bHRzLgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0Q2hlY2tlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIgYWRhcHRlcjsKLQotICAgIHB1YmxpYyBTY3JpcHRDaGVja2VyKCkgewotICAgICAgICBhZGFwdGVyID0gbmV3IFNjcmlwdENoZWNrTWFpbEFkYXB0ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIDxjb2RlPnNpZXZlPC9jb2RlPiBzY3JpcHQgY29udGFpbmVkIGluIHRoZSBnaXZlbiBmaWxlIGJ5Ci0gICAgICogZXhlY3V0aW5nIGl0IGFnYWluc3QgdGhlIGdpdmVuIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPkZpbGU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG1haWwgbWVzc2FnZSB0byBiZSBmZWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBzY3JpcHQsIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHNjcmlwdAotICAgICAqICAgICAgICAgICAgPGNvZGU+RmlsZTwvY29kZT4gY29udGFpbmluZyB0aGUgc2NyaXB0IHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlJlc3VsdHM8L2NvZGU+IG9mIHRoYXQgZXhlY3V0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBSZXN1bHRzIGNoZWNrKGZpbmFsIEZpbGUgbWVzc2FnZSwgZmluYWwgRmlsZSBzY3JpcHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBtZXNzYWdlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtZXNzYWdlKTsKLSAgICAgICAgZmluYWwgRmlsZUlucHV0U3RyZWFtIHNjcmlwdFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2NyaXB0KTsKLSAgICAgICAgZmluYWwgUmVzdWx0cyByZXN1bHRzID0gY2hlY2sobWVzc2FnZVN0cmVhbSwgc2NyaXB0U3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSA8Y29kZT5zaWV2ZTwvY29kZT4gc2NyaXB0IGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gZmlsZSBieQotICAgICAqIGV4ZWN1dGluZyBpdCBhZ2FpbnN0IHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzY3JpcHQKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlJlc3VsdHM8L2NvZGU+IG9mIHRoZSBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0cyBjaGVjayhmaW5hbCBJbnB1dFN0cmVhbSBtZXNzYWdlLCBmaW5hbCBJbnB1dFN0cmVhbSBzY3JpcHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1pbWVNZXNzYWdlIG1pbWVNZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKG51bGwsIG1lc3NhZ2UpOwotICAgICAgICBhZGFwdGVyLnNldE1haWwobWltZU1lc3NhZ2UpOwotICAgICAgICBSZXN1bHRzIHJlc3VsdHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKS5idWlsZCgpLmludGVycHJldChhZGFwdGVyLCBzY3JpcHQpOwotICAgICAgICAgICAgZmluYWwgTGlzdCBleGVjdXRlZEFjdGlvbnMgPSBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpOwotICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBSZXN1bHRzKGV4ZWN1dGVkQWN0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXN1bHRzID0gbmV3IFJlc3VsdHMoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXN1bHRzID0gbmV3IFJlc3VsdHMoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udGFpbnMgcmVzdWx0cyBvZiBzY3JpcHQgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVzdWx0cyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwYXNzOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3QgYWN0aW9uc0V4ZWN1dGVkOwotCi0gICAgICAgIHB1YmxpYyBSZXN1bHRzKGZpbmFsIEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleDsKLSAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGFjdGlvbnNFeGVjdXRlZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVzdWx0cyhmaW5hbCBMaXN0IGFjdGlvbnMpIHsKLSAgICAgICAgICAgIHRoaXMucGFzcyA9IHRydWU7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOwotICAgICAgICAgICAgdGhpcy5hY3Rpb25zRXhlY3V0ZWQgPSBhY3Rpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoaXMgYSBwYXNzPwotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzY3JpcHQgZXhlY3V0ZWQgd2l0aG91dCBlcnJvciwgZmFsc2UgaWYgZXJyb3JzCi0gICAgICAgICAqICAgICAgICAgd2VyZSBlbmNvdW50ZXJlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXNzKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhc3M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgZXhjZXB0aW9uIHdoaWNoIHdhcyB0aHJvd24gZHVyaW5nIGV4ZWN1dGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYWN0aW9ucyBleGVjdXRlZCBieSB0aGUgc2NyaXB0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiBvZiBhY3Rpb25zIG9yIG51bGwgaWYgdGhlIHNjcmlwdCBmYWlsZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldEFjdGlvbnNFeGVjdXRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb25zRXhlY3V0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSXMgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGEgPGNvZGU+RmlsZUludG88L2NvZGU+Ci0gICAgICAgICAqIHdpdGggZ2l2ZW4gZGVzdGluYXRpb24/Ci0gICAgICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiA8Y29kZT5TdHJpbmc8L2NvZGU+IGRlc3RpbmF0aW9uIGZvciB0aGUgZmlsZSBpbnRvCi0gICAgICAgICAqIEBwYXJhbSBuIGluZGV4IHRvIGNoZWNrCi0gICAgICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGlzIGEgPGNvZGU+RmlsZUludG88L2NvZGU+Ci0gICAgICAgICAqIHdpdGggZ2l2ZW4gZGVzdGluYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uRmlsZUludG8oU3RyaW5nIGRlc3RpbmF0aW9uLCBpbnQgbikgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIE9iamVjdCBhY3Rpb24gPSBhY3Rpb25zRXhlY3V0ZWQuZ2V0KG4pOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkZpbGVJbnRvKSB7Ci0gICAgICAgICAgICAgICAgQWN0aW9uRmlsZUludG8gYWN0aW9uRmlsZUludG8gPSAoQWN0aW9uRmlsZUludG8pIGFjdGlvbjsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXN0aW5hdGlvbi5lcXVhbHMoYWN0aW9uRmlsZUludG8uZ2V0RGVzdGluYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBhIDxjb2RlPlJlZGlyZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIGFkZHJlc3M/Ci0gICAgICAgICAqIEBwYXJhbSBhZGRyZXNzIDxjb2RlPlN0cmluZzwvY29kZT4gcmVkaXJlY3QgYWRkcmVzcwotICAgICAgICAgKiBAcGFyYW0gbiBpbmRleCB0byBjaGVjawotICAgICAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBpcyBhIDxjb2RlPlJlZGlyZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIHJlZGlyZWN0IGFkZHJlc3MKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uUmVkaXJlY3QoU3RyaW5nIGFkZHJlc3MsIGludCBuKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgT2JqZWN0IGFjdGlvbiA9IGFjdGlvbnNFeGVjdXRlZC5nZXQobik7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uUmVkaXJlY3QpIHsKLSAgICAgICAgICAgICAgICBBY3Rpb25SZWRpcmVjdCBhY3Rpb25SZWRpcmVjdCA9IChBY3Rpb25SZWRpcmVjdCkgYWN0aW9uOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFkZHJlc3MuZXF1YWxzKGFjdGlvblJlZGlyZWN0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBhIDxjb2RlPlJlamVjdDwvY29kZT4KLSAgICAgICAgICogd2l0aCBnaXZlbiBtZXNzYWdlPwotICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlamVjdGlvbiBtZXNzYWdlCi0gICAgICAgICAqIEBwYXJhbSBuIGluZGV4IHRvIGNoZWNrCi0gICAgICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGlzIGEgPGNvZGU+UmVqZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIHJlamVjdCBtZXNzYWdlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvblJlamVjdChTdHJpbmcgbWVzc2FnZSwgaW50IG4pIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBPYmplY3QgYWN0aW9uID0gYWN0aW9uc0V4ZWN1dGVkLmdldChuKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25SZWplY3QpIHsKLSAgICAgICAgICAgICAgICBBY3Rpb25SZWplY3QgYWN0aW9uUmVqZWN0ID0gKEFjdGlvblJlamVjdCkgYWN0aW9uOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UuZXF1YWxzKGFjdGlvblJlamVjdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJcyB0aGUgPGNvZGU+bjxjb2RlPid0aCBhY3Rpb24gYSA8Y29kZT5LZWVwPC9jb2RlPj8KLSAgICAgICAgICogQHBhcmFtIG4gaW5kZXggdG8gY2hlY2sKLSAgICAgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgPGNvZGU+bjxjb2RlPid0aCBhY3Rpb24gaXMgYSA8Y29kZT5LZWVwPC9jb2RlPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25LZWVwKGludCBuKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgT2JqZWN0IGFjdGlvbiA9IGFjdGlvbnNFeGVjdXRlZC5nZXQobik7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uS2VlcCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByaW50cyBvdXQgZGV0YWlscyBvZiByZXN1bHRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXN1bHRzOiAiKTsKLSAgICAgICAgICAgIGlmIChwYXNzKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiUEFTUyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJGQUlMOiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJDYW5ub3QgcGFyc2Ugc2NyaXB0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJDYW5ub3QgZXhjdXRlIHNjcmlwdCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja2VyVGVzdEFjdGlvbnNUZXN0LmphdmEgYi90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja2VyVGVzdEFjdGlvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODRlMmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tlclRlc3RBY3Rpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbC5jaGVjazsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uS2VlcDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlZGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uUmVqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0Q2hlY2tlclRlc3RBY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURJUkVDVF9BRERSRVNTX1RXTyA9ICJyb2FkcnVubmVyQGFjbWUuZXhhbXBsZS5vcmciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRElSRUNUX0FERFJFU1NfT05FID0gImNveW90ZUBkZXNlcnQuZXhhbXBsZS5vcmciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFSkVDVF9NRVNTQUdFX1RXTyA9ICJPaCB3ZWxsIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUpFQ1RfTUVTU0FHRV9PTkUgPSAiQmV0dGVyIGx1Y2sgbmV4dCB0aW1lIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9UV08gPSAib3JnLmFwYWNoZS5qYWthcnRhIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9PTkUgPSAib3JnLmFwYWNoZS5qYW1lcyI7Ci0KLSAgICBzdGF0aWMgZmluYWwgQWN0aW9uW10gQUNUSU9OUyA9IHsgbmV3IEFjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX09ORSksCi0gICAgICAgICAgICBuZXcgQWN0aW9uS2VlcCgpLCBuZXcgQWN0aW9uRmlsZUludG8oREVTVElOQVRJT05fVFdPKSwKLSAgICAgICAgICAgIG5ldyBBY3Rpb25SZWplY3QoUkVKRUNUX01FU1NBR0VfT05FKSwKLSAgICAgICAgICAgIG5ldyBBY3Rpb25SZWRpcmVjdChSRURJUkVDVF9BRERSRVNTX09ORSksCi0gICAgICAgICAgICBuZXcgQWN0aW9uUmVkaXJlY3QoUkVESVJFQ1RfQUREUkVTU19UV08pLAotICAgICAgICAgICAgbmV3IEFjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08pLCB9OwotCi0gICAgU2NyaXB0Q2hlY2tlci5SZXN1bHRzIHJlc3VsdDsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBTY3JpcHRDaGVja2VyLlJlc3VsdHMoQXJyYXlzLmFzTGlzdChBQ1RJT05TKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVJbnRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9PTkUsIDYpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9UV08sIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBmaWxlIGludG8gYWN0aW9uIHdpdGggcmlnaHQgZGVzdGluYXRpb24iLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25GaWxlSW50byhERVNUSU5BVElPTl9UV08sIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hlY2sgZm9yIGZpbGUgaW50byBhY3Rpb24gd2l0aCByaWdodCBkZXN0aW5hdGlvbiIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX1RXTywgMikpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIGZpbGUgaW50byBhY3Rpb24gd2l0aCByaWdodCBkZXN0aW5hdGlvbiIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX1RXTywgMykpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIGZpbGUgaW50byBhY3Rpb24gd2l0aCByaWdodCBkZXN0aW5hdGlvbiIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX1RXTywgNCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIGZpbGUgaW50byBhY3Rpb24gd2l0aCByaWdodCBkZXN0aW5hdGlvbiIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX1RXTywgNSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIGZpbGUgaW50byBhY3Rpb24gd2l0aCByaWdodCBkZXN0aW5hdGlvbiIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvbkZpbGVJbnRvKERFU1RJTkFUSU9OX1RXTywgNikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIHJlZGlyZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWRpcmVjdChSRURJUkVDVF9BRERSRVNTX09ORSwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIHJlZGlyZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWRpcmVjdChSRURJUkVDVF9BRERSRVNTX09ORSwgMSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIHJlZGlyZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWRpcmVjdChSRURJUkVDVF9BRERSRVNTX09ORSwgMikpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQ2hlY2sgZm9yIHJlZGlyZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWRpcmVjdChSRURJUkVDVF9BRERSRVNTX09ORSwgMykpOwotICAgICAgICBhc3NlcnRUcnVlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfT05FLCA0KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfT05FLCA1KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfT05FLCA2KSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfVFdPLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfVFdPLCAxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfVFdPLCAyKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfVFdPLCAzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVkaXJlY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlZGlyZWN0KFJFRElSRUNUX0FERFJFU1NfVFdPLCA0KSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNoZWNrIGZvciByZWRpcmVjdCBhY3Rpb24gd2l0aCByaWdodCBtZXNzYWdlIiwgcmVzdWx0Ci0gICAgICAgICAgICAgICAgLmlzQWN0aW9uUmVkaXJlY3QoUkVESVJFQ1RfQUREUkVTU19UV08sIDUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWRpcmVjdCBhY3Rpb24gd2l0aCByaWdodCBtZXNzYWdlIiwgcmVzdWx0Ci0gICAgICAgICAgICAgICAgLmlzQWN0aW9uUmVkaXJlY3QoUkVESVJFQ1RfQUREUkVTU19UV08sIDYpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVqZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWplY3QoUkVKRUNUX01FU1NBR0VfT05FLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVqZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWplY3QoUkVKRUNUX01FU1NBR0VfT05FLCAxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3IgcmVqZWN0IGFjdGlvbiB3aXRoIHJpZ2h0IG1lc3NhZ2UiLCByZXN1bHQKLSAgICAgICAgICAgICAgICAuaXNBY3Rpb25SZWplY3QoUkVKRUNUX01FU1NBR0VfT05FLCAyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9PTkUsIDMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9PTkUsIDQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9PTkUsIDUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9PTkUsIDYpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciByZWplY3QgYWN0aW9uIHdpdGggcmlnaHQgbWVzc2FnZSIsIHJlc3VsdAotICAgICAgICAgICAgICAgIC5pc0FjdGlvblJlamVjdChSRUpFQ1RfTUVTU0FHRV9UV08sIDUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2hlY2sgZm9yIHJlamVjdCBhY3Rpb24gd2l0aCByaWdodCBtZXNzYWdlIiwgcmVzdWx0Ci0gICAgICAgICAgICAgICAgLmlzQWN0aW9uUmVqZWN0KFJFSkVDVF9NRVNTQUdFX1RXTywgNikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJDaGVjayBmb3Iga2VlcCBhY3Rpb24gIiwgcmVzdWx0LmlzQWN0aW9uS2VlcCgwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkNoZWNrIGZvciBrZWVwIGFjdGlvbiAiLCByZXN1bHQuaXNBY3Rpb25LZWVwKDYpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbHMvSlVuaXRVdGlscy5qYXZhIGIvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWxzL0pVbml0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwZjUxZC4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbHMvSlVuaXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5TZXNzaW9uOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLk5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5QYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBKVW5pdFV0aWxzIGltcGxlbWVudHMgdXRpbGl0eSBtZXRob2RzIHVzZWQgZHVyaW5nIHVuaXQgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEpVbml0VXRpbHMgewotICAgIC8qKgotICAgICAqIE1ldGhvZCBpbnRlcnByZXQgcGFyc2VzIGEgc2NyaXB0IGFuZCBldmFsdWF0ZXMgaXQgYWdhaW5zdCBhIE1haWxBZGFwdGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYWlsCi0gICAgICogQHBhcmFtIHNjcmlwdAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIGludGVycHJldChNYWlsQWRhcHRlciBtYWlsLCBTdHJpbmcgc2NyaXB0KQotICAgICAgICAgICAgdGhyb3dzIFNpZXZlRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpLmJ1aWxkKCkuaW50ZXJwcmV0KG1haWwsCi0gICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdC5nZXRCeXRlcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGludGVycHJldCBwYXJzZXMgYSBzY3JpcHQgYW5kIGV2YWx1YXRlcyBpdCBhZ2FpbnN0IGEgTWFpbEFkYXB0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcGFyYW0gc2NyaXB0Ci0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIE5vZGUgcGFyc2UoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uLAotICAgICAgICAgICAgUGFyc2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuYnVpbGQoKS5wYXJzZSgKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2NyaXB0LmdldEJ5dGVzKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY3JlYXRlTWltZU1lc3NhZ2UgYW5zd2VycyBhbiBlbXB0eSBNaW1lTWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1pbWVNZXNzYWdlCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBNaW1lTWVzc2FnZSBjcmVhdGVNaW1lTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNaW1lTWVzc2FnZShTZXNzaW9uLmdldERlZmF1bHRJbnN0YW5jZShTeXN0ZW0KLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydGllcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGNyZWF0ZU1haWwgYW5zd2VycyBhIFNpZXZlTWFpbEFkYXB0ZXIgd3JhcHBpbmcgYW4gZW1wdHkKLSAgICAgKiBNaW1lTWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlcgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgTWFpbEFkYXB0ZXIgY3JlYXRlTWFpbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaWV2ZU1haWxBZGFwdGVyKGNyZWF0ZU1pbWVNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBjcmVhdGVFbnZlbG9wZU1haWwgYW5zd2VycyBhIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciB3cmFwcGluZyBhbgotICAgICAqIGVtcHR5IE1pbWVNZXNzYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIgY3JlYXRlRW52ZWxvcGVNYWlsKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlcihjcmVhdGVNaW1lTWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgY29weU1haWwgYW5zd2VycyBhIGNvcHkgb2Ygb3VyIG1vY2sgTWFpbEFkYXB0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiBAcmV0dXJuIE1haWxBZGFwdGVyCi0gICAgICogQHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIE1haWxBZGFwdGVyIGNvcHlNYWlsKFNpZXZlTWFpbEFkYXB0ZXIgbWFpbCkKLSAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgICAgICBNaW1lTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKG1haWwuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaWV2ZU1haWxBZGFwdGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBKVW5pdFV0aWxzLgotICAgICAqLwotICAgIHByaXZhdGUgSlVuaXRVdGlscygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlscy9TaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlscy9TaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MjVkZS4uMDAwMDAwMAotLS0gYS90cnVuay9tYWluL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbHMvU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29yczsKLQotLyoqCi0gKiA8cD4KLSAqIENsYXNzIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlciBleHRlbmRzIGNsYXNzIFNpZXZlTWFpbEFkYXB0ZXIsIGEgbW9jawotICogaW1wbGVtZW50YXRpb24gb2YgYSBNYWlsQWRhcHRlciwgdG8gYWRkIHN1cHBvcnQgZm9yIEVudmVsb3BlQWNjZXNzb3JzLgotICogPHA+Ci0gKiAKLSAqIDxwPgotICogQXMgdGhlIEVudmVsb3BlIFRlc3QgaXMgYW4gb3B0aW9uYWwgU2lldmUgdGVzdCwgTWFpbEFkYXB0ZXIgc3VwcG9ydCBmb3IgdGhlCi0gKiBpbnRlcmZhY2UgaXMgb3B0aW9uYWwgdG9vLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU2lldmVFbnZlbG9wZU1haWxBZGFwdGVyIGV4dGVuZHMgU2lldmVNYWlsQWRhcHRlciBpbXBsZW1lbnRzCi0gICAgICAgIEVudmVsb3BlQWNjZXNzb3JzIHsKLSAgICAvKioKLSAgICAgKiBUaGUgRlJPTSBhZGRyZXNzIHVzZWQgaW4gdGhlIFNNVFAgTUFJTCBjb21tYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkRW52ZWxvcGVGcm9tOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRPIGFkZHJlc3MgdXNlZCBpbiB0aGUgU01UUCBSQ1BUIGNvbW1hbmQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0gICAgICogbWVzc2FnZSBnZXR0aW5nIGRlbGl2ZXJlZCB0byB0aGlzIHVzZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRFbnZlbG9wZVRvOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIFNpZXZlRW52ZWxvcGVNYWlsQWRhcHRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUVudmVsb3BlTWFpbEFkYXB0ZXIoTWltZU1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0RW52ZWxvcGVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RW52ZWxvcGVzKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmVsb3BlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigyKTsKLSAgICAgICAgaWYgKG51bGwgIT0gZ2V0RW52ZWxvcGVGcm9tKCkpCi0gICAgICAgICAgICBlbnZlbG9wZXMucHV0KCJGcm9tIiwgZ2V0RW52ZWxvcGVGcm9tKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBnZXRFbnZlbG9wZVRvKCkpCi0gICAgICAgICAgICBlbnZlbG9wZXMucHV0KCJUbyIsIGdldEVudmVsb3BlVG8oKSk7Ci0gICAgICAgIHJldHVybiBlbnZlbG9wZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLm9wdGlvbmFsLkVudmVsb3BlQWNjZXNzb3JzI2dldEVudmVsb3BlKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVudmVsb3BlKFN0cmluZyBuYW1lKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0RW52ZWxvcGVzKCkuZ2V0KG5hbWUpOwotICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkKLSAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5vcHRpb25hbC5FbnZlbG9wZUFjY2Vzc29ycyNnZXRFbnZlbG9wZU5hbWVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVudmVsb3BlTmFtZXMoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihnZXRFbnZlbG9wZXMoKS5rZXlTZXQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLm9wdGlvbmFsLkVudmVsb3BlQWNjZXNzb3JzI2dldE1hdGNoaW5nRW52ZWxvcGUoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdFbnZlbG9wZShTdHJpbmcgbmFtZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIGVudmVsb3BlTmFtZXNJdGVyID0gZ2V0RW52ZWxvcGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBtYXRjaGVkRW52ZWxvcGVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMzIpOwotICAgICAgICB3aGlsZSAoZW52ZWxvcGVOYW1lc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZW52ZWxvcGVOYW1lID0gKFN0cmluZykgZW52ZWxvcGVOYW1lc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGVudmVsb3BlTmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLSAgICAgICAgICAgICAgICBtYXRjaGVkRW52ZWxvcGVWYWx1ZXMuYWRkQWxsKGdldEVudmVsb3BlKGVudmVsb3BlTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoZWRFbnZlbG9wZVZhbHVlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmcm9tLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnZlbG9wZUZyb20oKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEVudmVsb3BlRnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWNpcGllbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVudmVsb3BlVG8oKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEVudmVsb3BlVG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnJvbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbQotICAgICAqICAgICAgICAgICAgVGhlIGZyb20gdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW52ZWxvcGVGcm9tKFN0cmluZyBmcm9tKSB7Ci0gICAgICAgIGZpZWxkRW52ZWxvcGVGcm9tID0gZnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWNpcGllbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlY2lwaWVudAotICAgICAqICAgICAgICAgICAgVGhlIHJlY2lwaWVudCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnZlbG9wZVRvKFN0cmluZyByZWNpcGllbnQpIHsKLSAgICAgICAgZmllbGRFbnZlbG9wZVRvID0gcmVjaXBpZW50OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWxzL1NpZXZlTWFpbEFkYXB0ZXIuamF2YSBiL3RydW5rL21haW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlscy9TaWV2ZU1haWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmM4YzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWxzL1NpZXZlTWFpbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5tYWlsLkhlYWRlcjsKLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLlNpZXZlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLlNpZXZlTWFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuYWRkcmVzcy5TaWV2ZUFkZHJlc3NCdWlsZGVyOwotCi0vKioKLSAqIDxwPgotICogQ2xhc3MgU2lldmVNYWlsQWRhcHRlciBpbXBsZW1lbnRzIGEgbW9jayBNYWlsQWRhcHRlciBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBCZWluZyBhIG1vY2sgb2JqZWN0LCBBY3Rpb25zIGFyZSBub3QgcGVyZm9ybWVkIGFnYWluc3QgYSBtYWlsIHNlcnZlciwgYnV0IGluCi0gKiBtb3N0IG90aGVyIHJlc3BlY3RzIGl0IGJlaGF2ZXMgYXMgd291bGQgZXhwZWN0IGEgTWFpbEFkYXB0ZXIgd3JhcHBpbmcgYQotICogSmF2YU1haWwgbWVzc2FnZSBzaG91bGQuIFRvIHRoaXMgZXh0ZW50LCBpdCBpcyBhIHVzZWZ1bCBkZW1vbnN0cmF0aW9uIG9mIGhvdwotICogdG8gY3JlYXRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgTWFpbEFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaWV2ZU1haWxBZGFwdGVyIGltcGxlbWVudHMgTWFpbEFkYXB0ZXIgewotICAgIHByaXZhdGUgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpZXZlTWFpbEFkYXB0ZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1lc3NhZ2UgYmVpbmcgYWRhcHRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1pbWVNZXNzYWdlIGZpZWxkTWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgQWN0aW9ucyB0byBwZXJmb3JtLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxBY3Rpb24+IGZpZWxkQWN0aW9uczsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRBc0xvd2VyQ2FzZVN0cmluZzsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBTaWV2ZU1haWxBZGFwdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgU2lldmVNYWlsQWRhcHRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2lldmVNYWlsQWRhcHRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZU1haWxBZGFwdGVyKE1pbWVNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBzZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBNaW1lTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBNaW1lTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZmllbGRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIHRvIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2UoTWltZU1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICBmaWVsZE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIExpc3Qgb2YgYWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBY3Rpb24+IGdldEFjdGlvbnMoKSB7Ci0gICAgICAgIExpc3Q8QWN0aW9uPiBhY3Rpb25zID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgPT0gKGFjdGlvbnMgPSBnZXRBY3Rpb25zQmFzaWMoKSkpIHsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGlvbnMoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRBY3Rpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBMaXN0IG9mIGFjdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBMaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Q8QWN0aW9uPiBjb21wdXRlQWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIExpc3Qgb2YgYWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8QWN0aW9uPiBnZXRBY3Rpb25zQmFzaWMoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEFjdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBBY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIGFjdGlvbiB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBY3Rpb24oQWN0aW9uIGFjdGlvbikgewotICAgICAgICBnZXRBY3Rpb25zKCkuYWRkKGFjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyI2V4ZWN1dGVBY3Rpb25zKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlQWN0aW9ucygpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLSAgICAgICAgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnMgPSBnZXRBY3Rpb25zKCk7Ci0gICAgICAgIGZvciAoZmluYWwgQWN0aW9uIGFjdGlvbjphY3Rpb25zKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGVjdXRpbmcgIiArIGFjdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9ucwotICAgICAqICAgICAgICAgICAgVGhlIGFjdGlvbnMgdG8gc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9ucyhMaXN0PEFjdGlvbj4gYWN0aW9ucykgewotICAgICAgICBmaWVsZEFjdGlvbnMgPSBhY3Rpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGFjdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLSAgICAgICAgc2V0QWN0aW9ucyhjb21wdXRlQWN0aW9ucygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0SGVhZGVyKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhlYWRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBoZWFkZXJzID0gZ2V0TWVzc2FnZSgpLmdldEhlYWRlcihuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAoaGVhZGVycyA9PSBudWxsID8gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDApIDogQXJyYXlzLmFzTGlzdChoZWFkZXJzKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0SGVhZGVyTmFtZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyTmFtZXMoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PFN0cmluZz4gaGVhZGVyTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBhbGxIZWFkZXJzID0gZ2V0TWVzc2FnZSgpLmdldEFsbEhlYWRlcnMoKTsKLSAgICAgICAgICAgIHdoaWxlIChhbGxIZWFkZXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTmFtZXMuYWRkKCgoSGVhZGVyKSBhbGxIZWFkZXJzLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGhlYWRlck5hbWVzKTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsQWRhcHRlciNnZXRNYXRjaGluZ0hlYWRlcihTdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNYXRjaGluZ0hlYWRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNYWlsVXRpbHMuZ2V0TWF0Y2hpbmdIZWFkZXIodGhpcywgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLk1haWxBZGFwdGVyI2dldFNpemUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKS5nZXRTaXplKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXIjZ2V0Q29udGVudFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRNZXNzYWdlKCkuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoZmluYWwgU3RyaW5nIGhlYWRlck5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlQWRkcmVzc2VzKGhlYWRlck5hbWUsIGdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBtZXNzYWdlIGludG8gYWRkcmVzc2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBoZWFkZXJOYW1lCi0gICAgICogICAgICAgICAgICBoZWFkZXIgbmFtZSwgdG8gYmUgbWF0Y2hlZCBjYXNlIGluc2Vuc2l0aXZlbHkKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgPGNvZGU+TWVzc2FnZTwvY29kZT4sIG5vdCBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBhcnJheSwgbm90IG51bGwgcG9zc2libHkgZW1wdHkKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoZmluYWwgU3RyaW5nIGhlYWRlck5hbWUsCi0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU2lldmVBZGRyZXNzQnVpbGRlciBidWlsZGVyID0gbmV3IFNpZXZlQWRkcmVzc0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlbiA9IG1lc3NhZ2UuZ2V0QWxsSGVhZGVycygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBIZWFkZXIgaGVhZGVyID0gKEhlYWRlcikgZW4ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGhlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRBZGRyZXNzZXMoaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgQWRkcmVzc1tdIHJlc3VsdHMgPSBidWlsZGVyLmdldEFkZHJlc3NlcygpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5hZGRyZXNzLlBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Cb2R5VGV4dChTdHJpbmcgcGhyYXNlQ2FzZUluc2Vuc2l0aXZlKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZW50QXNUZXh0KCkuaW5kZXhPZihwaHJhc2VDYXNlSW5zZW5zaXRpdmUudG9Mb3dlckNhc2UoKSkgIT0gLTE7Ci0gICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRBc1RleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50QXNMb3dlckNhc2VTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudEFzTG93ZXJDYXNlU3RyaW5nID0gZ2V0TWVzc2FnZSgpLmdldENvbnRlbnQoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRBc0xvd2VyQ2FzZVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFNpZXZlQ29udGV4dCBjb250ZXh0KSB7fQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL21haW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjRkMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvbWFpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAKLSMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAKLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAKLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAKLSMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAKLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAKLSMgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAKLSMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAKLSMgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAKLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSMgIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAgIAotIyBTZXQgcm9vdCBsb2dnZXIgbGV2ZWwgdG8gREVCVUcgYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIEExLgotbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgQTEKLQotIyBBMSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIuCi1sb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotCi0jIEExIHVzZXMgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lLTRyIFsldF0gJS01cCAlYyAleCAtICVtJW4KZGlmZiAtLWdpdCBhL3RydW5rL21haW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzbWFwLnByb3BlcnRpZXMgYi90cnVuay9tYWluL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJhNGExLi4wMDAwMDAwCi0tLSBhL3RydW5rL21haW4vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvanNpZXZlL2NvbW1hbmRzbWFwLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAjCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAjCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAjCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAjCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAjCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAjCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAjCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAjCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAjCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAjCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAjCi0jIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLklmCi1lbHNlPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2UKLWVsc2lmPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkVsc2lmCi1yZXF1aXJlPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlJlcXVpcmUKLXN0b3A9b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuU3RvcAotIyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCB0aGVzZQota2VlcD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5LZWVwCi1kaXNjYXJkPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLkRpc2NhcmQKLXJlZGlyZWN0PW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlJlZGlyZWN0Ci0jIFJGQzMwODIgLSBJbXBsZW1lbnRhdGlvbnMgU0hPVUxEIHN1cHBvcnQgdGhlc2UKLXJlamVjdD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbC5SZWplY3QKLWZpbGVpbnRvPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLm9wdGlvbmFsLkZpbGVJbnRvCi0jIEpVbml0IENvbW1hbmRzIGZvciBUZXN0aW5nCi10aHJvd3Rlc3RleGNlcHRpb249b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuVGhyb3dUZXN0RXhjZXB0aW9uCi0jIEV4dGVuc2lvbiBDb21tYW5kcwotbG9nPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLmV4dGVuc2lvbnMuTG9nCmRpZmYgLS1naXQgYS90cnVuay9wb20ueG1sIGIvdHJ1bmsvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NTc2OC4uMDAwMDAwMAotLS0gYS90cnVuay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTE1Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAgLS0+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+anNpZXZlLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkFwYWNoZSBKQU1FUyBKU2lldmUgUHJvamVjdDwvbmFtZT4KLSAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgQXBhY2hlIEpBTUVTIEpTaWV2ZSBQcm9qZWN0Ci0gIDwvZGVzY3JpcHRpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5qYW1lcy1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuNTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDx1cmw+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlLzwvdXJsPgotICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotICAKLSAgPHByb3BlcnRpZXM+Ci0gICAgPCEtLQotICAgIFRoZSB3ZWJzaXRlIGlzIGNvbW1pdHRlZCB0byBzdWJ2ZXJzaW9uLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBvdmVycmlkZW4KLSAgICB0byB1cGxvYWQgdGhlIHNpdGUgdG8gYSBsb2NhbCBzdGFnaW5nIGxvY2F0aW9uLgotICAgIEZvciBleGFtcGxlLCBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB+Ly5tMi9zZXR0aW5ncy54bWwgd2lsbCB1cGxvYWQKLSAgICB0byBsb2NhbGhvc3Q6Ci0gICAgCi0gICAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICA8aWQ+bWFpbjwvaWQ+Ci0gICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KLSAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgPGphbWVzLnd3dz5zY3A6Ly9sb2NhbGhvc3Qvd3d3PC9qYW1lcy53d3c+Ci0gICAgICAgICAgICAgIDxqYW1lcy53d3cuaWQ+bG9jYWxob3N0PC9qYW1lcy53d3cuaWQ+Ci0gICAgICAuLi4KLSAgICAtLT4KLSAgICA8IS0tIEdlbmVyYWwgbG9jYXRpb24gZm9yIHNpdGUgc3RhZ2UgLS0+Ci0gICAgPGphbWVzLnd3dz5zY3A6Ly9wZW9wbGUuYXBhY2hlLm9yZy93d3cvamFtZXMuYXBhY2hlLm9yZy88L2phbWVzLnd3dz4KLSAgICA8IS0tIFByb2plY3Qgc3BlY2lmaWMgbG9jYXRpb24sIGFsbG93aW5nIHNwZWNpZmljIG92ZXJyaWRlIC0tPgotICAgIDxqYW1lcy5qc2lldmUud3d3PiR7amFtZXMud3d3fS9qc2lldmUvPC9qYW1lcy5qc2lldmUud3d3PgotICAgIDwhLS0gT3ZlcnJpZGRpbmcgdGhpcyB2YWx1ZSBhbGxvd3Mgc2luZ2xlIHNldCBvZiBsb29wYmFjayBzZXR0aW5ncyB0byBiZSBtYWludGFpbmVkIC0tPgotICAgIDxqYW1lcy53d3cuaWQ+anNpZXZlLXdlYnNpdGU8L2phbWVzLnd3dy5pZD4KLSAgPC9wcm9wZXJ0aWVzPgotICAKLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+bWFpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bWFpbGV0PC9tb2R1bGU+Ci0gICAgPG1vZHVsZT51dGlsPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5hc3NlbWJsZTwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICA8ZW5jb2Rpbmc+aXNvODg1OS0xPC9lbmNvZGluZz4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPiAKLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgIDxtYW5pZmVzdEZpbGU+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L21hbmlmZXN0RmlsZT4KLSAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1UaXRsZT4ke3BvbS5uYW1lfTwvU3BlY2lmaWNhdGlvbi1UaXRsZT4KLSAgICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1WZXJzaW9uPiR7cG9tLnZlcnNpb259PC9TcGVjaWZpY2F0aW9uLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPFNwZWNpZmljYXRpb24tVmVuZG9yPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvU3BlY2lmaWNhdGlvbi1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPiR7cG9tLm5hbWV9PC9JbXBsZW1lbnRhdGlvbi1UaXRsZT4KLSAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvSW1wbGVtZW50YXRpb24tVmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvSW1wbGVtZW50YXRpb24tVmVuZG9yPgotICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ+b3JnLmFwYWNoZTwvSW1wbGVtZW50YXRpb24tVmVuZG9yLUlkPgotICAgICAgICAgICAgICAgIDx1cmw+JHtwb20udXJsfTwvdXJsPgotICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTM8L3ZlcnNpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS40LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8aWQ+YnVuZGxlLW1hbmlmZXN0PC9pZD4KLSAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5tYW5pZmVzdDwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5hcGFjaGUuanNpZXZlLio8L0V4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICA8RW1iZWQtRGVwZW5kZW5jeT4qO3Njb3BlPXJ1bnRpbWU8L0VtYmVkLURlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kb2FwLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5zaXRlPC9pZD4KLSAgICAgICAgICAgICAgPHBoYXNlPnNpdGU8L3BoYXNlPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGU8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgIDxkb2FwT3B0aW9ucz4KLSAgICAgICAgICAgICA8cHJvZ3JhbW1pbmdMYW5ndWFnZT5qYXZhPC9wcm9ncmFtbWluZ0xhbmd1YWdlPgotICAgICAgICAgICAgIDxjYXRlZ29yeT5tYWlsPC9jYXRlZ29yeT4KLSAgICAgICAgICAgICA8ZG93bmxvYWQtcGFnZT5odHRwOi8vamFtZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5jZ2k8L2Rvd25sb2FkLXBhZ2U+Ci0gICAgICAgICAgIDwvZG9hcE9wdGlvbnM+Ci0gIAotICAgICAgICAgICA8YXNmRXh0T3B0aW9ucz4KLSAgICAgICAgICAgICA8aW5jbHVkZWQ+dHJ1ZTwvaW5jbHVkZWQ+Ci0gICAgICAgICAgICAgPHBtYz5odHRwOi8vamFtZXMuYXBhY2hlLm9yZzwvcG1jPgotICAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBKQU1FUzwvbmFtZT4KLSAgICAgICAgICAgICA8c3RhbmRhcmRzPgotICAgICAgICAgICAgICA8c3RhbmRhcmQ+Ci0gICAgICAgICAgICAgICAgPGlkPlJGQzMwMjg8L2lkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5TaWV2ZTogQSBNYWlsIEZpbHRlcmluZyBMYW5ndWFnZTwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgPGJvZHk+SUVGVDwvYm9keT4KLSAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMwMjgudHh0PC91cmw+Ci0gICAgICAgICAgICAgIDwvc3RhbmRhcmQ+Ci0gICAgICAgICAgICAgPC9zdGFuZGFyZHM+Ci0gICAgICAgICAgIDwvYXNmRXh0T3B0aW9ucz4KLSAgCi0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNpdGU+Ci0gICAgICA8aWQ+JHtqYW1lcy53d3cuaWR9PC9pZD4KLSAgICAgIDx1cmw+JHtqYW1lcy5qc2lldmUud3d3fTwvdXJsPgotICAgIDwvc2l0ZT4KLSAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5KSVJBPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRTwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPgotICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2phbWVzL2pzaWV2ZS90YWdzL2pzaWV2ZS1wcm9qZWN0LTAuNAotICAgIDwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgIHNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvamFtZXMvanNpZXZlL3RhZ3MvanNpZXZlLXByb2plY3QtMC40Ci0gICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+Ci0gICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFtZXMvanNpZXZlL3RhZ3MvanNpZXZlLXByb2plY3QtMC40P3Jvb3Q9QXBhY2hlLVNWTgotICAgIDwvdXJsPgotICA8L3NjbT4KLQotICA8bWFpbGluZ0xpc3RzPgotICAgIDxtYWlsaW5nTGlzdD4KLQkgICAgPG5hbWU+QXBhY2hlIEpBTUVTIFNlcnZlciBMaXN0PC9uYW1lPgotCSAgICA8c3Vic2NyaWJlPnNlcnZlci1kZXYtc3Vic2NyaWJlQGphbWVzLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLQkgICAgPHVuc3Vic2NyaWJlPnNlcnZlci1kZXYtdW5zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0JICAgIDxwb3N0PnNlcnZlci1kZXZAamFtZXMuYXBhY2hlLm9yZzwvcG9zdD4KLQkgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9qYW1lcy1zZXJ2ZXItZGV2LzwvYXJjaGl2ZT4KLSAgICA8L21haWxpbmdMaXN0PgotICA8L21haWxpbmdMaXN0cz4KLSAgCi0gIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KLSAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZS1tYWlsZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1qc2lldmUtdXRpbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLW1haWxldDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLW1haWxldC1iYXNlPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmFwYWNoZS1taW1lNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4wLjY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+YXZhbG9uLWZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF2YWxvbi1mcmFtZXdvcms8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPmxvZ2tpdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZ2tpdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qbW9jazwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmptb2NrPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4xLjA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4xNDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYWlsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4LmFjdGl2YXRpb248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5hY3RpdmF0aW9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgIDwvZGVwZW5kZW5jaWVzPgotICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8b25seUN1cnJlbnRWZXJzaW9uPnRydWU8L29ubHlDdXJyZW50VmVyc2lvbj4KLSAgICAgICAgICAgIDxyZXNvbHV0aW9uSWRzPkNsb3NlZDwvcmVzb2x1dGlvbklkcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8cmVwb3J0U2V0cz4KLSAgICAgICAgICAgIDxyZXBvcnRTZXQ+Ci0gICAgICAgICAgICAgICAgPHJlcG9ydHM+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+amlyYS1yZXBvcnQ8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICA8L3JlcG9ydHM+Ci0gICAgICAgICAgICA8L3JlcG9ydFNldD4KLSAgICAgICAgPC9yZXBvcnRTZXRzPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2l0ZS9hcHQvcmVsZWFzZS1ub3Rlcy5hcHQgYi90cnVuay9zcmMvc2l0ZS9hcHQvcmVsZWFzZS1ub3Rlcy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliM2NmYjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3NpdGUvYXB0L3JlbGVhc2Utbm90ZXMuYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSAtLS0tLS0KLSBSZWxlYXNlIE5vdGVzCi0gLS0tLS0tCi0gQXBhY2hlIEpBTUVTIFByb2plY3QgVGVhbQotIC0tLS0tLQotIDIwMDktMDQtMDkKLSAtLS0tLS0KLSAgCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1SZWxlYXNlIE5vdGVzCi0KLUFwYWNoZSBKU2lldmUKLQotIGpTaWV2ZSBpcyBhIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNpZXZlIG1haWwgZmlsdGVyaW5nIGxhbmd1YWdlIGRlZmluZWQgYnkgCi0gUkZDIDMwMjguIGpTaWV2ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIGxhbmdhdWdlIHByb2Nlc3NvciB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gYW55Ci0gaW50ZXJuZXQgbWFpbCBhcHBsaWNhdGlvbiB0byBhZGQgU2lldmUgc3VwcG9ydC4KLQotKkNvbW1lbnRzLCBRdWVzdGlvbnMgYW5kIElzc3VlcwotCi0galNpZXZlIGlzIGEgc3ViLXByb2plY3Qgb2YgQXBhY2hlIEphbWVzLiBQbGVhc2UgZGlyZWN0IHlvdXIgY29tbWVudHMgYW5kIHF1ZXN0aW9ucyB0byAKLSB0aGUgcmVsZXZhbnQgSmFtZXMgbGlzdC4KLQotIFRvIHJlcG9ydCBpc3N1ZXMsIHN1Y2ggYXMgYnVncywgZ28gdG8gCi0gaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRQotIEFzIGpTaWV2ZSBjb21lcyB3aXRoIGEgZmFpcmx5IGV4dGVuc2l2ZSBzdWl0ZSBvZiBqVW5pdCBUZXN0cywgaXQgd291bGQgYmUgbW9zdCAKLSBoZWxwZnVsIGZvciBidWcgcmVwb3J0cyB0byBiZSBhY2NvbXBhbmllZCBieSBhbiBpbGx1c3RyYXRpdmUgalVuaXQgdGVzdCBjYXNlLgotCi0qTGljZW5zaW5nIGFuZCBsZWdhbCBpc3N1ZXMKLQotIEZvciBsZWdhbCBhbmQgbGljZW5zaW5nIGlzc3VlcywgcGxlYXNlIGxvb2sgaW4gdGhlIGxlZ2FsIHNlY3Rpb24gb2YKLSB0aGUgZG9jdW1lbnRhdGlvbiBvciByZWFkIHRoZSBMSUNFTlNFIGFuZCBOT1RJQ0UgZmlsZXMuCi0KLVZlcnNpb24gMC4zCi0gCi0gVGhpcyByZWxlYXNlIGlzIHRoZSBmaXJzdCB0byBpbmNsdWRlIG1haWxldCBhbmQgdXRpbGl0eSBtb2R1bGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgY29yZSBwYXJzaW5nCi0gbGlicmFyeS4gVGhlIGNvbmZpZ3VyYXRpb24gQVBJIGhhcyBjaGFuZ2VkIHNpZ25pZmljYW50bHkgdG8gcmVwbGFjZSBtYWdpYyBzaW5nbGV0b25zIHdpdGggUE9KT3MKLSBzdWl0YWJsZSBmb3IgSW9DLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSBoYXMgYmVlbiByZXRhaW5lZCBzbyB0aG91Z2ggY2FsbHMgaGF2ZQotIGNoYW5nZWQsIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBzdGlsbCBiZSBjb21wYXRpYmxlLgotIAotIFV0aWxpdGllcyBpbmNsdWRlIG5vZGUgc2VyaWFsaXplcnMgdG8geG1sIGFuZCBzaWV2ZSBzY3JpcHQuIFRoZSBtYWlsZXQgbW9kdWxlIHByb3ZpZGVzIFNpZXZlCi0gaW4gdGhlIEphbWVzIDMgY29kZWJhc2UuCi0gCi0qQ2hhbmdlcyAgIAotCi0qKlN1Yi10YXNrcyBDb21wbGV0ZWQKLQotICogW3t7e2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTI3fUpTSUVWRS0yN319XSAtICAgICAgICAgUmVmYWN0b3IgQ29tcGFyYXRvck1hbmFnZXIKLSAKLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS0yOX1KU0lFVkUtMjl9fV0gLSAgICAgICAgIFJlZmFjdG9yIENvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMzJ9SlNJRVZFLTMyfX1dIC0gICAgICAgICBSZWZhY3RvciBUZXN0TWFuYWdlcgotIAotICogW3t7e2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTM3fUpTSUVWRS0zN319XSAtICAgICAgICAgUHVzaCBtYWluIHNvdXJjZSBkb3duIGEgbGV2ZWwKLSAKLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS0zOH1KU0lFVkUtMzh9fV0gLSAgICAgICAgIE1vZHVsYXIgQW50IEJ1aWxkCi0gCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDR9SlNJRVZFLTQ0fX1dIC0gICAgICAgICBDcmVhdGUgQ2hlY2sgTW9kdWxlCi0gCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDV9SlNJRVZFLTQ1fX1dIC0gICAgICAgICBFeHRyYWN0IFJldXNhYmxlIEFudCBNYWNyb3MKLSAKLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS00Nn1KU0lFVkUtNDZ9fV0gLSAgICAgICAgIFVuaWZpZWQgRGlzdHJpYnV0aW9uCi0gCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDh9SlNJRVZFLTQ4fX1dIC0gICAgICAgICBSZWxlYXNlIFF1YWxpdHkgTWF2ZW4gQnVpbGQKLSAgICAKLSoqIEJ1Z3MgRml4ZWQKLQotICogW3t7e2hyZWY9J2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTQ5fUpTSUVWRS00OX19XSAtICAgICAgICAgQ1BVIHNwaW5zIHdoZW4gOm1hdGNoZXMgZXhwcmVzc2lvbiBjb250YWlucyAmcXVvdDsqKioqKioqKioqKioqJnF1b3Q7Ci0KLSoqIEltcHJvdmVtZW50cyBNYWRlCi0KLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS00N31KU0lFVkUtNDd9fV0gLSAgICAgICAgIEFjY2VzcyB0byBzY3JpcHQgY29tbWVudHMKLSAKLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS01Mn1KU0lFVkUtNTJ9fV0gLSAgICAgICAgIENoZWNrIFN1cHBvcnQgRm9yIE51bWVyaWMgUXVhbnRpZmllcnMKLSAgICAKLSoqIE5ldyBGZWF0dXJlcyBBZGRlZAotCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtNDN9SlNJRVZFLTQzfX1dIC0gICAgICAgICBBZGQgQVBJIGZvciBnZW5lcmF0aW5nIGEgU2lldmUgc2NyaXB0IGZyb20gYSBwYXJzZSB0cmVlIAotIAotICogW3t7e2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTUwfUpTSUVWRS01MH19XSAtICAgICAgICAgU2lldmUtSW4tWE1MIChFeHBlcmltZW50YWwgUHJldmlldykKLSAKLSAgICAgICAgICAgICAgICAKLSoqIFRhc2tzIENvbXBsZXRlZAotCi0gKiBbe3t7aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KU0lFVkUtMTZ9SlNJRVZFLTE2fX1dIC0gICAgICAgICBTaW5nbGV0b25zIC0+IElvQwotIAotICogW3t7e2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTI0fUpTSUVWRS0yNH19XSAtICAgICAgICAgSW5jbHVkZSBidWlsZCB0aW1lIGxpYnJhcmllcyAoamF2YWNjLCBqYXZhbWFpbCwgYWN0aXZhdGlvbikgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24KLSAKLSAqIFt7e3todHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRS0zM31KU0lFVkUtMzN9fV0gLSAgICAgICAgIFJlbW92ZSAuanVuaXQuIHBhY2thZ2UgbmFtZSBmcm9tIHRlc3RzLgotIAotICogW3t7e2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFLTM0fUpTSUVWRS0zNH19XSAtICAgICAgICAgbWFrZSBqc2lldmUgYSBtdWx0aW1vZHVsZSBwcm9qZWN0Ci0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWYgYi90cnVuay9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NjMTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2phbWVzLWpzaWV2ZS1sb2dvLmdpZiBiL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdlMzRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3NpdGUvc2l0ZS54bWwgYi90cnVuay9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2NTc5ZC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0tLT4NCi08cHJvamVjdCBuYW1lPSJqU2lldmUiPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5KQU1FUyBqU2lldmU8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0KLSAgPGJhbm5lclJpZ2h0Pg0KLSAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+DQotICAgIDxzcmM+aW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmPC9zcmM+DQotICAgIDxocmVmPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPg0KLSAgPC9iYW5uZXJSaWdodD4NCi0NCi0gIDxza2luPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gIDwvc2tpbj4KLQotICA8Ym9keT4KLSAgICA8bWVudSBuYW1lPSJqU2lldmUiPgotICAgICAgPGl0ZW0gbmFtZT0iTWFpbiIgaHJlZj0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlL21haW4vaW5kZXguaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJNYWlsZXQiIGhyZWY9Imh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2pzaWV2ZS9tYWlsZXQvaW5kZXguaHRtbCIgLz4NCi0gICAgICA8aXRlbSBuYW1lPSJVdGlsIiBocmVmPSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9qc2lldmUvdXRpbC9pbmRleC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iQ2hhbmdlcyIgaHJlZj0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlL2ppcmEtcmVwb3J0Lmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJSZWxlYXNlIE5vdGVzIiBocmVmPSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9qc2lldmUvcmVsZWFzZS1ub3Rlcy5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iSmF2YURvY3MiIGhyZWY9Imh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2pzaWV2ZS9hcGlkb2NzL2luZGV4Lmh0bWwiIC8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0nU3BlY2lmaWNhdGlvbnMnIGluaGVyaXQ9J2JvdHRvbSc+Ci0gICAgICA8aXRlbSBuYW1lPSJSRkMgMjIzNCBBQk5GIgotICAgICAgICBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMjM0LnR4dCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlJGQyAyMjQ0IEFDQVAiCi0gICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIyNDQudHh0IiAvPgotICAgICAgPGl0ZW0gbmFtZT0iUkZDIDIyOTggTUROIgotICAgICAgICBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMjk4LnR4dCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlJGQyA1MjI4IFNpZXZlIgotICAgICAgICBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MjI4IiAvPgotICAgICAgPGl0ZW0gbmFtZT0nUkZDIDQ3OTAgSUFQQ1InCi0gICAgICAgIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ3OTAnLz4KLSAgICAgIDxpdGVtIG5hbWU9J1JGQyA1MTczIEJvZHkgRXh0ZW5zaW9uJwotICAgICAgICBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MTczJy8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0nMC4zIFJlbGVhc2UnPgotICAgICAgPGl0ZW0gbmFtZT0nUmVsZWFzZSBOb3RlcycgaHJlZj0nMC4zL3JlbGVhc2Utbm90ZXMuaHRtbCcvPgotICAgICAgPGl0ZW0gbmFtZT0nRG9jdW1lbnRhdGlvbicgaHJlZj0nMC4zL2luZGV4Lmh0bWwnLz4KLSAgICA8L21lbnU+Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sIGIvdHJ1bmsvc3JjL3NpdGUveGRvYy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTI0NmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3NpdGUveGRvYy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIAotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgIAotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAKLSAgCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgIAotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAKLS0tPgotPGRvY3VtZW50PgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5PdmVydmlldzwvdGl0bGU+Ci0gICAgPGF1dGhvciBlbWFpbD0ic2VydmVyLWRldkBqYW1lcy5hcGFjaGUub3JnIj5qU2lldmUgUHJvamVjdDwvYXV0aG9yPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iV2hhdCBpcyBqU2lldmU/Ij4KLSAgICAgIDxwPgotICAgICAgICBqU2lldmUgaXMgYSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTaWV2ZSBtYWlsIGZpbHRlcmluZwotICAgICAgICBsYW5ndWFnZSBkZWZpbmVkIGJ5Ci0gICAgICAgIDxhIGhyZWY9J2h0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzMwMjgudHh0Jz5SRkMgMzAyODwvYT4KLSAgICAgICAgLiBqU2lldmUgaXMgaW1wbGVtZW50ZWQgYXMgYSBsYW5ndWFnZSBwcm9jZXNzb3IgdGhhdCBjYW4gYmUKLSAgICAgICAgcGx1Z2dlZCBpbnRvIGFueSBpbnRlcm5ldCBtYWlsIGFwcGxpY2F0aW9uIHRvIGFkZCBTaWV2ZSBzdXBwb3J0LgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIGpTaWV2ZSBpcyBhIHN1YnByb2plY3Qgb2YKLSAgICAgICAgPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcnPkFwYWNoZSBKQU1FUzwvYT4KLSAgICAgICAgLiBBbGwgd2hvIGFyZSBpbnRlcmVzdGVkIGluIGRldmVsb3BpbmcgalNpZXZlIGFuZCBKQU1FUyB3aWxsIGJlCi0gICAgICAgIHdhcm1seSB3ZWxjb21lZCBvbiB0aGUKLSAgICAgICAgPGEgaHJlZj0nbWFpbC1saXN0cy5odG1sJz5tYWlsaW5nIGxpc3RzPC9hPgotICAgICAgICAuCi0gICAgICA8L3A+Ci0gICAgICA8cD5qU2lldmUgY29uc2lzdHMgb2YgdGhyZWUgcHJvZHVjdHM6PC9wPgotICAgICAgPG9sPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0nbWFpbi9pbmRleC5odG1sJz5BcGFjaGUgSlNpZXZlPC9hPgotICAgICAgICAgIGlzIGEgU2lldmUgbGlicmFyeSBjb2RlZCBpbiBKYXZhLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0nbWFpbGV0L2luZGV4Lmh0bWwnPkFwYWNoZSBKU2lldmUgTWFpbGV0PC9hPgotICAgICAgICAgIGlzIGEKLSAgICAgICAgICA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9tYWlsZXQnPk1haWxldDwvYT4KLSAgICAgICAgICB3aGljaCBidWlsZHMgb24gdGhlIEpTaWV2ZSBsaWJyYXJ5IHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUKLSAgICAgICAgICBzZXJ2ZXIgc2lkZSBTaWV2ZSBmaWx0ZXJpbmcgc3lzdGVtLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0ndXRpbC9pbmRleC5odG1sJz5BcGFjaGUgSlNpZXZlIFV0aWxpdGllczwvYT4KLSAgICAgICAgICBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMgaGVscGZ1bCB3aGVuIHVzaW5nIFNpZXZlIGJ1dCBub3QKLSAgICAgICAgICBjb25zaWRlcmVkIHN1ZmZpY2llbnRseSBjb3JlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtYWluCi0gICAgICAgICAgbGlicmFyeS4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvb2w+Ci0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSdXaGF0IGlzIFNpZXZlPyc+Ci0gICAgICAgIDxwPgotICAgICAgICAgIFNpZXZlIGlzIGFuIGV4dGVuc2libGUgbWFpbCBmaWx0ZXJpbmcgbGFuZ3VhZ2UuIEl0J3MgbGltaXRlZAotICAgICAgICAgIGV4cHJlc3NpdmVuZXNzIChubyBsb29wcyBvciB2YXJpYWJsZXMsIG5vIHRlc3RzIHdpdGggc2lkZQotICAgICAgICAgIGVmZmVjdHMpIGFsbG93cyB1c2VyIGNyZWF0ZWQgc2NyaXB0cyB0byBiZSBydW4gc2FmZWx5IG9uIGVtYWlsCi0gICAgICAgICAgc2VydmVycy4gU2lldmUgaXMgdGFyZ2V0ZWQgYXQgdGhlIGZpbmFsIGRlbGl2ZXJ5IHBoYXNlICh3aGVyZQotICAgICAgICAgIGFuIGluY29taW5nIGVtYWlsIGlzIHRyYW5zZmVycmVkIHRvIGEgdXNlcidzIG1haWxib3gpLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgIFNpZXZlIHNjcmlwdHMgYXJlIGNvbXBvc2VkIG9mIGNvbW1hbmRzLiBDb250cm9sIGNvbW1hbmRzCi0gICAgICAgICAgbWFuYWdlIHRoZSBleGVjdXRpb24gb2YgdGhlIHNjcmlwdC4gVGVzdCBjb21tYW5kcyBkZWZpbmUKLSAgICAgICAgICBzaWRlLWVmZmVjdCBmcmVlIGNyaXRlcmlhLiBBY3Rpb24gY29tbWFuZHMgYXJlIG1haWwgb3BlcmF0aW9ucwotICAgICAgICAgIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgICAgPC9wPgotICAgICAgPC9zdWJzZWN0aW9uPgotICAgIDwvc2VjdGlvbj4KLSAgICA8c2VjdGlvbiBuYW1lPSdFeHRlbnNpb25zIFN1cHBvcnRlZCc+Ci0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSdCb2R5IEV4dGVuc2lvbic+Ci0gICAgICAgIDxhYmJyIHRpdGxlPSdTaWV2ZSBFbWFpbCBGaWx0ZXJpbmc6IEJvZHkgRXh0ZW5zaW9uJz48YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MTczJz5SRkMgNTE3MzwvYT48L2FiYnI+IGRlc2NyaWJlcyAKLSAgICAgICAgYW4gZXh0ZW5zaW9uIGNvbW1hbmQgdGhhdCB0ZXN0cyB0aGUgYm9keSBvZiBhbiBlbWFpbCBmb3Igb25lIG9yIG1vcmUgc3RyaW5ncy4KLSAgICAgIDwvc3Vic2VjdGlvbj4KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9J1NpZXZlLUluLVhtbCc+Ci0gICAgICAgICAgPHA+Ci0gICAgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZnJlZWQtc2lldmUtaW4teG1sLTA0JyByZWw9J3RhZyc+U2lldmUtaW4teG1sPC9hPiBpcyBhbiBJbnRlcm5ldCBEcmFmdC4KLSAgICBJdCBkZXNjcmliZXMgYSBtZXRob2QgZm9yIGNvbnZlcnRpbmcgU2lldmUgc2NyaXB0cyB0byBhbmQgZnJvbSBYTUwgZnJhZ21lbnRzLgotICAgIDxhIGhyZWY9J3V0aWwvaW5kZXguaHRtbCc+SlNpZXZlIFV0aWxpdGllczwvYT4gY29udGFpbnMgYW4gZXhwZXJpbWVudGFsIHByZXZpZXcgb2YgYSBzdWJzZXQgb2YgdGhpcyBkcmFmdAotICAgIHRvIGFsbG93IGVhcmx5IGZlZWRiYWNrLiA8YSBocmVmPSd1dGlsL2luZGV4Lmh0bWwjU2lldmUgSW4gWG1sJz5Nb3JlLi4uPC9hPgotICAgICAgICA8L3A+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotICAgIDxzZWN0aW9uIG5hbWU9Ik5ld3MiPgotICAgICAgICA8aDQ+SnVuLzIwMDggLSBqU2lldmUtMC4zIHJlbGVhc2VkPC9oND4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgVGhlIEFwYWNoZSBKQU1FUyB0ZWFtIGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YKLSAgICAgICAgICA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5jZ2kjQXBhY2hlJTIwSlNpZXZlJz4KLSAgICAgICAgICAgIEFwYWNoZSBqU2lldmUgMC4zCi0gICAgICAgICAgPC9hPgotICAgICAgICAgIC4gVGhpcyBpcyB0aGUgZmlyc3QgbW9kdWxhciByZWxlYXNlIGluY2x1ZGluZyBhIGZpbHRlcmluZyAKLSAgICAgICAgICA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9tYWlsZXQnPm1haWxldDwvYT4gYXMgd2VsbCBhcyBtYW55IGZpeGVzIAotICAgICAgICAgIGFuZCBpbXByb3ZlbWVudHMuIFNlZSB0aGUgCi0gICAgICAgICAgPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlLzAuMy9yZWxlYXNlLW5vdGVzLmh0bWwnPnJlbGVhc2Ugbm90ZXM8L2E+IAotICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPGg0PkF1Zy8yMDA4IC0galNpZXZlLTAuMiByZWxlYXNlZDwvaDQ+Ci0gICAgICAgIDxwPgotICAgICAgICAgIFRoZSBBcGFjaGUgSkFNRVMgdGVhbSBpcyBoYXBweSB0byBhbm5vdW5jZSB0aGUgYXZhaWxhYmlsaXR5IG9mCi0gICAgICAgICAgPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpI2pzaWV2ZSc+Ci0gICAgICAgICAgICBBcGFjaGUgalNpZXZlIDAuMgotICAgICAgICAgIDwvYT4KLSAgICAgICAgICAuIFRoaXMgZmlyc3QgcHVibGljIHJlbGVhc2UgaXMgYSBtYWpvciBtaWxlc3RvbmUgZm9yIEpTaWV2ZS4KLSAgICAgICAgPC9wPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvQlVJTERJTkcudHh0IGIvdHJ1bmsvdXRpbC9CVUlMRElORy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGY0ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9CVUlMRElORy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCVUlMRElORyBKU0lFVkUgV0lUSCBNQVZFTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotMSkgSW5zdGFsbCBtYXZlbiAyLjAuOQotCi0yKSBBZGQgbWF2ZW4gdG8geW91ciBwYXRoIGFuZCBtYWtlIHN1cmUgeW91IGFsc28gaGF2ZSBhIEpBVkFfSE9NRSBlbnZpcm9ubWVudAotICAgdmFyaWFibGUgdG8gcG9pbnQgYSBqYXZhIDEuNCsgdmlydHVhbCBtYWNoaW5lLgotCi0zKSBSdW4gIm12biBwYWNrYWdlIgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJVSUxESU5HIEpTSUVWRSBXSVRIIEFOVAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVGhlIHNvdXJjZSB0cnVuayBmb3IgSlNJRVZFIG5vIGxvbmdlciBpbmNsdWRlcyBBbnQsIHNvIGluIG9yZGVyIHRvCi1idWlsZCBKU0lFVkUsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBBbnQgYXMgd2VsbCBhcyBhY3F1aXJlIEpTSUVWRQotc291cmNlIGZyb20gc3VidmVyc2lvbiBvciBhIHNvdXJjZSB0YXJiYWxsLgotCi1KU0lFVkUgdXNlcyBKYXZhQ0MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHQgcGFyc2VyLgotVW5mb3J0dW5hdGVseSwgdGhvdWdoIHRoZSBsYXRlc3QgY29kZWJhc2UgaXMgbm93IGF2YWlsYWJsZSB1bmRlciB0aGUgQlNECi1saWNlbnNlIHRoZXJlIGlzIChhdCB0aGlzIHRpbWUpIG5vIG9mZmljaWFsIG9wZW4gc291cmNlZCByZWxlYXNlLiBTbwotdG8gYnVpbGQgSlNJRVZFIGRvd25sb2FkIHRoZSBKYXZhQ0MgNC4wIHJlbGVhc2UgZnJvbSAKLWh0dHBzOi8vamF2YWNjLmRldi5qYXZhLm5ldC8uIEV4dHJhY3QgdGhlIGphdmFjYy5qYXIgYW5kIGNvcHkgaW50byB0aGUKLXJvb3Qgb2YgdGhlIEpTSUVWRSBkaXJlY3RvcnkuIFJlbmFtZSB0aGlzIHRvIGphdmFjYy00LjAuamFyLgotCi1Zb3UgYWxzbyBoYXZlIHRvIGRvd25sb2FkIGFjdGl2YXRpb24tMS4xLjEuamFyIGFuZCBtYWlsLTEuNC4xLmphciBmaWxlcyB0byAKLXRoZSByb290IGZvbGRlciBpbiBvcmRlciB0byBidWlsZC9ydW4gdW5pdCB0ZXN0cy4KLQotU3RlcHM6Ci0KLTEpIEluc3RhbGwgQW50ICh2MS42LjUgYXMgb2YgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nKQotCi0yKSBBZGQgQW50IHRvIHlvdXIgcGF0aC4gIEZvciBtZSwgSSBkbyB0aGUgZm9sbG93aW5nOgotICAgJCB0YXIgenh2ZiBhcGFjaGUtYW50LTEuNi41LWJpbi50YXIuZ3oKLSAgICQgbXYgYXBhY2hlLWFudC0xLjYuNSAvdXNyL2xvY2FsCi0gICAkIGxuIC1zZiAvdXNyL2xvY2FsL2FwYWNoZS1hbnQtMS42LjUgL3Vzci9sb2NhbC9hbnQKLSAgICQgbG4gLXNmIC91c3IvbG9jYWwvYW50L2Jpbi9hbnQgL3Vzci9sb2NhbC9iaW4vYW50Ci0KLTMpIENoYW5nZSBhbnkgSlNJRVZFLXJlbGF0ZWQgYnVpbGQgc2NyaXB0cyB0aGF0IHlvdSBtaWdodCBoYXZlIHRvIGNhbGwKLSAgICBBbnQgZGlyZWN0bHksIGUuZy46ICAuL2J1aWxkLnNoIDx0YXJnZXQ+ID09PiBhbnQgPHRhcmdldD4KLQotVGhhdCdzIGl0LiAgUGxlYXNlIGNvbnRhY3QgZ2VuZXJhbEBqYW1lcy5hcGFjaGUub3JnIGlmIHlvdSBoYXZlIGFueQotcHJvYmxlbXMuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTRVQgVVAgSlNJRVZFIElOU0lERSBFQ0xJUFNFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotWW91IGNhbiB1c2UgbWF2ZW4gZmFjaWxpdHkgdG8gc2V0dXAgYW4gZWNsaXBzZSBwcm9qZWN0OgotbXZuIGVjbGlwc2U6ZWNsaXBzZQotCi1Zb3UgY2FuIGFsc28gdXNlIHE0ZSBwbHVnaW4gZnJvbSBlY2xpcHNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvTElDRU5TRS5hcGFjaGUgYi90cnVuay91dGlsL0xJQ0VOU0UuYXBhY2hlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4YzU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvTElDRU5TRS5hcGFjaGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay91dGlsL05PVElDRS5iYXNlIGIvdHJ1bmsvdXRpbC9OT1RJQ0UuYmFzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhMDAxMS4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL05PVElDRS5iYXNlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgID09ICAgICAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgPT0NCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAgQXBhY2hlIEphbWVzIEpTaWV2ZSBMaWJyYXJ5DQotICAgQ29weXJpZ2h0IDIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdA0KLSAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotCmRpZmYgLS1naXQgYS90cnVuay91dGlsL2J1aWxkLnhtbCBiL3RydW5rL3V0aWwvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk2Njg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIGpTaWV2ZSBidWlsZCBmaWxlIAotCi0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgIAotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAKLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgIAotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgIAotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLT4KLQotPHByb2plY3QgbmFtZT0nanNpZXZlLXV0aWwnIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotICAgIAotICAgIDwhLS0KLSAgICBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZQotICAgIChhbmQgd2l0aG91dCB0eXBpbmcgLUQgZWFjaCB0aW1lIGhlIGNvbXBpbGVzIGl0KQotICAgIC0tPgotICAgIDxwcm9wZXJ0eSBmaWxlPSIuYW50LnByb3BlcnRpZXMiIC8+Ci0gICAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS8uYW50LnByb3BlcnRpZXMiIC8+Ci0gICAgPHByb3BlcnR5IGZpbGU9Ii4uL2luY2x1ZGUucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iLi4vZGVmYXVsdC5wcm9wZXJ0aWVzIiAvPgotCi0gICAgPHBhdGggaWQ9Im1haWwuY2xhc3MucGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0nJHttYWlsLmphcn0nIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0nJHthY3RpdmF0aW9uLmphcn0nIC8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHBhdGggaWQ9InByb2plY3QuY2xhc3MucGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xvZzRqLmphcn0iIC8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0nJHtsaWIuanNpZXZlLmRpcn0vJHtuYW1lfS0ke3ZlcnNpb259LmphcicgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haWxldC5qYXJ9IiAvPgotICAgICAgICA8cGF0aCByZWZpZD0ibWFpbC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC5jbGFzc2VzfSIgLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8cGF0aCBpZD0icHJvamVjdC50ZXN0LmNsYXNzLnBhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXQuamFyfSIgLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2ptb2NrLmphcn0iIC8+Ci0gICAgPC9wYXRoPgotICAgIAotICAgIDxpbXBvcnQgZmlsZT0nLi4vYnVpbGQueG1sJy8+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJydW4tdGVzdHMiIGRlc2NyaXB0aW9uPSIgLSBtYWluIHRhcmdldCIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXNjcmlwdGlvbj0iIC0gcGFwYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgW2ludGVybmFsXSI+Ci0gICAgICAgIDxDaGVja01haWxDb25kaXRpb25zLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlcGFyZSIgZGVzY3JpcHRpb249IiAtIGNvbXBpbGVzIHRlc3QgYW5kIG1haW4gc291cmNlIj4KLSAgICAgICAgPENvbXBpbGVNYWluPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke2phdmEuZGlyfSIgLz4KLSAgICAgICAgPC9Db21waWxlTWFpbj4KLSAgICAgICAgPENvbXBpbGVUZXN0cy8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgZGVzY3JpcHRpb249IiAtIGphcnMgY2xhc3NlcyI+Ci0gICAgICAgIDxKYXIgbmFtZT0ndXRpbCcvPiAgICAKLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzIiBkZXBlbmRzPSJqYXIiIGRlc2NyaXB0aW9uPSIgLSBydW5zIGFsbCB0ZXN0cyI+Ci0gICAgICAgIDxSdW5UZXN0cy8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iIC0gY2xlYW5zIGJ1aWxkIGZpbGVzIj4KLSAgICAgICAgPENsZWFuLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idXNhZ2UiIGRlc2NyaXB0aW9uPSIgLSBwcmludHMgaGVscCI+Ci0gICAgICAgIDxVc2FnZS8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvcG9tLnhtbCBiL3RydW5rL3V0aWwvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwZTI1Zi4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICAtLT4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5qc2lldmUtcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjAuNDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZS11dGlsPC9hcnRpZmFjdElkPgotICA8bmFtZT5BcGFjaGUgSkFNRVMgalNpZXZlIFV0aWxpdGllczwvbmFtZT4KLSAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8ZGVzY3JpcHRpb24+Ci1BcGFjaGUgalNpZXZlIGlzIGEgc2VydmVyIHNpZGUgbWFpbCBmaWx0ZXJpbmcgc3lzdGVtIAotaW1wbGVtZW50aW5nIFJGQzMwMjguIEFwYWNoZSBqU2lldmUgaXMgZGV2ZWxvcGVkIGJ5IHRoZSAKLUpBTUVTIHByb2plY3QuIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgdXRpbGl0aWVzLgotICA8L2Rlc2NyaXB0aW9uPgotICA8dXJsPmh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2pzaWV2ZTwvdXJsPgotICA8aW5jZXB0aW9uWWVhcj4yMDA0PC9pbmNlcHRpb25ZZWFyPgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDwhLS0KLSAgICBUaGUgd2Vic2l0ZSBpcyBjb21taXR0ZWQgdG8gc3VidmVyc2lvbi4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgb3ZlcnJpZGVuCi0gICAgdG8gdXBsb2FkIHRoZSBzaXRlIHRvIGEgbG9jYWwgc3RhZ2luZyBsb2NhdGlvbi4KLSAgICBGb3IgZXhhbXBsZSwgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8gfi8ubTIvc2V0dGluZ3MueG1sIHdpbGwgdXBsb2FkCi0gICAgdG8gbG9jYWxob3N0OgotICAgIAotICAgICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgPGlkPm1haW48L2lkPgotICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgIDxqYW1lcy53d3c+c2NwOi8vbG9jYWxob3N0L3d3dzwvamFtZXMud3d3PgotICAgICAgICAgICAgICA8amFtZXMud3d3LmlkPmxvY2FsaG9zdDwvamFtZXMud3d3LmlkPgotICAgICAgLi4uCi0gICAgLS0+Ci0gICAgPCEtLSBHZW5lcmFsIGxvY2F0aW9uIGZvciBzaXRlIHN0YWdlIC0tPgotICAgIDxqYW1lcy53d3c+c2NwOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L2phbWVzLmFwYWNoZS5vcmcvPC9qYW1lcy53d3c+Ci0gICAgPCEtLSBQcm9qZWN0IHNwZWNpZmljIGxvY2F0aW9uLCBhbGxvd2luZyBzcGVjaWZpYyBvdmVycmlkZSAtLT4KLSAgICA8amFtZXMuanNpZXZlLnd3dz4ke2phbWVzLnd3d30vanNpZXZlLzwvamFtZXMuanNpZXZlLnd3dz4KLSAgICA8IS0tIE92ZXJyaWRkaW5nIHRoaXMgdmFsdWUgYWxsb3dzIHNpbmdsZSBzZXQgb2YgbG9vcGJhY2sgc2V0dGluZ3MgdG8gYmUgbWFpbnRhaW5lZCAtLT4KLSAgICA8amFtZXMud3d3LmlkPmpzaWV2ZS13ZWJzaXRlPC9qYW1lcy53d3cuaWQ+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8c2l0ZT4KLSAgICAgIDxpZD4ke2phbWVzLnd3dy5pZH08L2lkPgotICAgICAgPHVybD4ke2phbWVzLmpzaWV2ZS53d3d9L3V0aWw8L3VybD4KLSAgICA8L3NpdGU+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICA8aXNzdWVNYW5hZ2VtZW50PgotICAgIDxzeXN0ZW0+SklSQTwvc3lzdGVtPgotICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pTSUVWRTwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9qc2lldmUvdGFncy9qc2lldmUtcHJvamVjdC0wLjQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2phbWVzL2pzaWV2ZS90YWdzL2pzaWV2ZS1wcm9qZWN0LTAuNDwvdXJsPgotICA8L3NjbT4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLWpzaWV2ZTwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5tYWlsPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWFpbDwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qYXZheC5hY3RpdmF0aW9uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmptb2NrPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+am1vY2s8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8YnVpbGQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gICAgCi0gICAgPHBsdWdpbnM+ICAKLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAJPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgIAk8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRvYXAtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPiAKLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9jb250cm92ZXJzaWFsLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgIDxmb3JtYXQ+eG1sPC9mb3JtYXQ+Ci0gICAgICAgICAgPGxpbmtYcmVmPnRydWU8L2xpbmtYcmVmPgotICAgICAgICAgIDxzb3VyY2VFbmNvZGluZz51dGYtODwvc291cmNlRW5jb2Rpbmc+Ci0gICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNpdGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAtYmV0YS03PC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cmF0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTM8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgIDxleGNsdWRlPk5PVElDRS5iYXNlPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+TElDRU5TRS5hcGFjaGU8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5yZWxlYXNlLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+dGFnbGlzdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0gIAotICA8bWFpbGluZ0xpc3RzPgotICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgIDxuYW1lPkFwYWNoZSBKYW1lcyBVc2VyPC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5zZXJ2ZXItdXNlci1zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgPHVuc3Vic2NyaWJlPnNlcnZlci11c2VyLXVuc3Vic2NyaWJlQGphbWVzLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPHBvc3Q+c2VydmVyLXVzZXJAamFtZXMuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvamFtZXMtc2VydmVyLXVzZXIvPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+QXBhY2hlIEphbWVzIERldmVsb3BlcjwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+c2VydmVyLWRldi1zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgPHVuc3Vic2NyaWJlPnNlcnZlci1kZXYtdW5zdWJzY3JpYmVAamFtZXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICA8cG9zdD5zZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc8L3Bvc3Q+Ci0gICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2phbWVzLXNlcnZlci1kZXYvPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gIDwvbWFpbGluZ0xpc3RzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9zdXBwbGVtZW50YWwtbW9kZWxzLnhtbCBiL3RydW5rL3V0aWwvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI4MzFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzdXBwbGVtZW50YWxEYXRhTW9kZWxzPgotICA8IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TICBPRiBBTlkgS0lORCwgZWl0aGVyICBleHByZXNzICBvcgotICBpbXBsaWVkLgotICAKLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gIDwhLS0gQWxzbyBhZGRlZCBtYW51YWxseSBpbiBwb20ueG1sIGFwcGVuZWRlZCB0ZXh0IGJlY2F1c2UgdGVzdAotICAgICAgIGRlcGVuZGVuY2llcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgdGhlIE5PVElDRSAKLSAgICAgICBnZW5lcmF0b3IgLS0+Ci0gIDxzdXBwbGVtZW50PgotICAgIDxwcm9qZWN0PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxuYW1lPkpVbml0PC9uYW1lPgotICAgICAgPHVybD5odHRwOi8vd3d3Lmp1bml0Lm9yZy88L3VybD4KLSAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAJPG5hbWU+S2VudCBCZWNrLCBFcmljaCBHYW1tYSwgYW5kIERhdmlkIFNhZmY8L25hbWU+Ci0gICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgPG5hbWU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wPC9uYW1lPgotICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwucGhwPC91cmw+Ci0gICAgICAgIDwvbGljZW5zZT4KLSAgICAgIDwvbGljZW5zZXM+Ci0gICAgPC9wcm9qZWN0PgotICA8L3N1cHBsZW1lbnQ+Ci08L3N1cHBsZW1lbnRhbERhdGFNb2RlbHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYzMThmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL0hhbHRUcmF2ZXJzYWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci0KLS8qKgotICogSW5kaWNhdG9ycyB0aGF0IHRoZSBub2RlIHRyYXZlcnNhbCBzaG91bGQgYmUgYWJhbmRvbmVkLgotICovCi1wdWJsaWMgY2xhc3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiBleHRlbmRzIFNpZXZlRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjMyMDExNzUyOTg3NjU5MDQwTDsKLQotICAgIHB1YmxpYyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvSW52YWxpZFhtbEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvSW52YWxpZFhtbEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA3YWUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL0ludmFsaWRYbWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFhtbEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NTMwNzMwMzY1NTc2MTUxMTk3TDsKLQotICAgIHB1YmxpYyBJbnZhbGlkWG1sRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZhbGlkWG1sRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0gICAgICAgIHN1cGVyKHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL05vZGVIYW5kbGVyLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzk5MjJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL05vZGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUYXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rhcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RibG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rjb21tYW5kczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0YXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RyaW5nX2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1R0ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUdGVzdF9saXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2ltcGxlTm9kZTsKLQotLyoqCi0gKiBQcmVzZW50cyBhIGxvdyBsZXZlbCByZXBvcnRpbmcgdmlldyBvZiBhIFNpZXZlIG5vZGUgdHJlZS4KLSAqIEZhbWlsaWFyaXR5IHdpdGggdGhlIAotICogPGEgaHJlZj0naHR0cDovL2phbWVzLmFwYWNoZS5vcmcvanNpZXZlLyc+SlNpZXZlPC9hPiBpbXBsZW1lbnRhdGlvbiBpcyBhc3N1bWVkLgotICogQW55b25lIHJlcXVpcmluZyBhIGhpZ2ggbGV2ZWwgdmlldyBzaG91bGQgc2VlIHtAbGluayBTaWV2ZUhhbmRsZXJ9LgotICogCi0gKiBAc2VlIE5vZGVUcmF2ZXJzZXIKLSAqIEBzZWUgU2lldmVIYW5kbGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZUhhbmRsZXIgewotICAgIAotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIHRyZWUgdHJhdmVyc2FsLgotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5kcyBhIHRyZWUgdHJhdmVyYWwuCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoU2ltcGxlTm9kZSBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKFNpbXBsZU5vZGUgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQVNUc3RhcnQgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5kcyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZChBU1RzdGFydCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVGNvbW1hbmRzIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEVuZHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUY29tbWFuZHMgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1Rjb21tYW5kIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEVuZHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUY29tbWFuZCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVGJsb2NrIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEVuZHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUYmxvY2sgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1Rhcmd1bWVudHMgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5kcyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZChBU1Rhcmd1bWVudHMgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1Rhcmd1bWVudCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVGFyZ3VtZW50IG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQVNUdGVzdCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVHRlc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1R0ZXN0X2xpc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5kcyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZChBU1R0ZXN0X2xpc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1RzdHJpbmcgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5kcyB0cmF2ZXJzYWwgb2YgZ2l2ZW4gbm9kZS4KLSAgICAgKiBAcGFyYW0gbm9kZSBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZChBU1RzdHJpbmcgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdHJhdmVyc2FsIG9mIGdpdmVuIG5vZGUuCi0gICAgICogQHBhcmFtIG5vZGUgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1RzdHJpbmdfbGlzdCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmRzIHRyYXZlcnNhbCBvZiBnaXZlbiBub2RlLgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVHN0cmluZ19saXN0IG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvTm9kZVRvU2lldmVBZGFwdGVyLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVG9TaWV2ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4NTQwZi4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVG9TaWV2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuTnVtYmVyQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuVGFnQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rhcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUY29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdHJpbmdfbGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1R0ZXN0X2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5TaW1wbGVOb2RlOwotCi0vKioKLSAqIEFkYXB0ZXJzIGxvdyBsZXZlbCB7QGxpbmsgTm9kZUhhbmRsZXJ9IG91dHB1dCBpbnRvIGEKLSAqIGhpZ2ggbGV2ZWwge0BsaW5rIFNpZXZlSGFuZGxlcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlVG9TaWV2ZUFkYXB0ZXIgaW1wbGVtZW50cyBOb2RlSGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coTm9kZVRvU2lldmVBZGFwdGVyLmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFNpZXZlSGFuZGxlciBoYW5kbGVyOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYWRhcHRlciB0byB0aGUgZ2l2ZW4ge0BsaW5rIFNpZXZlSGFuZGxlcn0uCi0gICAgICogQHBhcmFtIGhhbmRsZXIgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gaGFuZGxlciBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIE5vZGVUb1NpZXZlQWRhcHRlcihmaW5hbCBTaWV2ZUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBIYXJkIHRvIGRlYnVnIGEgbnVsbCBwb2ludGVyIGR1cmluZyBwYXJzaW5nCi0gICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSGFuZGxlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotLy8gICAgICBJZ25vcmUKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotLy8gICAgICBJZ25vcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoU2ltcGxlTm9kZSBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0vLyAgICAgIElnbm9yZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZChBU1RzdGFydCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuZW5kU2NyaXB0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVGNvbW1hbmRzIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5lbmRDb21tYW5kcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZChBU1Rjb21tYW5kIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5lbmRDb21tYW5kKG5vZGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUYmxvY2sgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVyLmVuZEJsb2NrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVGFyZ3VtZW50cyBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuZW5kQXJndW1lbnRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVGFyZ3VtZW50IG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUHJvY2Vzc2VkIGluIHN0YXJ0Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVHRlc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotICAgICAgICBoYW5kbGVyLmVuZFRlc3QobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKEFTVHRlc3RfbGlzdCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuZW5kVGVzdExpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUc3RyaW5nIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUHJvY2VzcyBBU1RzdHJpbmcgb24gc3RhcnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoQVNUc3RyaW5nX2xpc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVyLmVuZFN0cmluZ0xpc3RBcmd1bWVudCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoU2ltcGxlTm9kZSBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElnbm9yZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVHN0YXJ0IG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5zdGFydFNjcmlwdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVGNvbW1hbmRzIG5vZGUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlci5zdGFydENvbW1hbmRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQVNUY29tbWFuZCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRDb21tYW5kKG5vZGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1RibG9jayBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRCbG9jaygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVGFyZ3VtZW50cyBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRBcmd1bWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChBU1Rhcmd1bWVudCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IG5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiSWdub3JpbmcgbnVsbCBhcmd1bWVudCIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyQXJndW1lbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIE51bWJlckFyZ3VtZW50IG51bWJlckFyZ3VtZW50ID0gKE51bWJlckFyZ3VtZW50KSB2YWx1ZTsKLSAgICAgICAgICAgIEludGVnZXIgaW50ZWdlciA9IG51bWJlckFyZ3VtZW50LmdldEludGVnZXIoKTsKLSAgICAgICAgICAgIGlmIChpbnRlZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIklnbm9yaW5nIG51bGwgbnVtZXJpYyBhcmd1bWVudCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtYmVyID0gaW50ZWdlci5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGhhbmRsZXIuYXJndW1lbnQobnVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRhZ0FyZ3VtZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBUYWdBcmd1bWVudCB0YWdBcmd1bWVudCA9IChUYWdBcmd1bWVudCkgdmFsdWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFnID0gdGFnQXJndW1lbnQuZ2V0VGFnKCk7Ci0gICAgICAgICAgICAvLyB0YWcgPSAiOiIgaWRlbnRpZmllcgotICAgICAgICAgICAgLy8gaGFuZGxlcnMgYXJlIG9ubHkgaW50ZXJlc3RpbmcgaW4gdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB0YWcKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZGVudGlmaWVyOwotICAgICAgICAgICAgaWYgKHRhZy5jaGFyQXQoMCkgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgaWRlbnRpZmllciA9IHRhZy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgPSB0YWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVyLmFyZ3VtZW50KGlkZW50aWZpZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQVNUdGVzdCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVHRlc3RfbGlzdCBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEFTVHN0cmluZyBub2RlKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmcgPShTdHJpbmcpIG5vZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgaGFuZGxlci5saXN0TWVtYmVyKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQVNUc3RyaW5nX2xpc3Qgbm9kZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVyLnN0YXJ0U3RyaW5nTGlzdEFyZ3VtZW50KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVHJhdmVyc2VyLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTJjNTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvTm9kZVRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5leGNlcHRpb24uU2lldmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rhcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUY29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUc3RhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdHJpbmdfbGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1R0ZXN0X2xpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2lldmVQYXJzZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuU2ltcGxlTm9kZTsKLQotLyoqCi0gKiBUcmF2ZXJzZXMgbm9kZXMuCi0gKiBPbmNlIGluc3RhbmNlIGNhbiBiZSBzYWZlbHkgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4KLSAqLwotcHVibGljIGNsYXNzIE5vZGVUcmF2ZXJzZXIgewotICAgIAotICAgIC8qKgotICAgICAqIFRyYXZlcnNlcyB0aGUgdHJlZSBzdHJ1Y3R1cmUgcm9vdGVkIGF0IHRoZSBnaXZlbiBub2RlLgotICAgICAqIFRoZSBub2RlcyBjb250YWluZWQgYXJlIHJlcG9ydGVkIHRvIHRoZSBoYW5kbGVyLgotICAgICAqIEBwYXJhbSByb290IG5vdCBudWxsCi0gICAgICogQHBhcmFtIGhhbmRsZXIgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHdoZW4gdHJhdmVyc2FsIGZhaWxzCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHdoZW4gdHJhdmVyc2FsIGlzIGhhbHRlZCBieSBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJhdmVyc2UoZmluYWwgTm9kZUhhbmRsZXIgaGFuZGxlciwgZmluYWwgTm9kZSByb290KSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBUcmF2ZXJzYWxXb3JrZXIgd29ya2VyID0gbmV3IFRyYXZlcnNhbFdvcmtlcihoYW5kbGVyKTsKLSAgICAgICAgaGFuZGxlci5zdGFydCgpOwotICAgICAgICByb290LmpqdEFjY2VwdCh3b3JrZXIsIG51bGwpOwotICAgICAgICBoYW5kbGVyLmVuZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUcmF2ZXJzZXMgdGhlIHRyZWUgc3RydWN0dXJlIHJvb3RlZCBhdCB0aGUgZ2l2ZW4gbm9kZS4KLSAgICAgKiBUaGUgbm9kZXMgY29udGFpbmVkIGFyZSByZXBvcnRlZCB0byB0aGUgaGFuZGxlci4KLSAgICAgKiBAcGFyYW0gcm9vdCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBoYW5kbGVyIG5vdCBudWxsCi0gICAgICogQHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB3aGVuIHRyYXZlcnNhbCBmYWlscwotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB3aGVuIHRyYXZlcnNhbCBpcyBoYWx0ZWQgYnkgaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRyYXZlcnNlKGZpbmFsIFNpZXZlSGFuZGxlciBoYW5kbGVyLCBmaW5hbCBOb2RlIHJvb3QpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyYXZlcnNlKG5ldyBOb2RlVG9TaWV2ZUFkYXB0ZXIoaGFuZGxlciksIHJvb3QpOwotICAgIH0KLSAgCi0KLSAgICAvKioKLSAgICAgKiA8cD5UcmF2ZXJzZXMgYSBub2RhbCB0cmVlIHN0cnVjdHVyZS4KLSAgICAgKiBBbiBpbm5lciB3b3JrZXI6Ci0gICAgICogPC9wPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QWxsb3dzIGEgbW9yZSBmbHVlbnQgcHVibGljIEFQSTwvbGk+Ci0gICAgICogPGxpPklzb2xhdGVkIHRoZSBtb25vdGhlYWRlZCBjb2RlPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRyYXZlcnNhbFdvcmtlciBpbXBsZW1lbnRzIFNpZXZlUGFyc2VyVmlzaXRvciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIE5vZGVIYW5kbGVyIGhhbmRsZXI7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHRyYXZlcnNhbCB3b3JrZXIuCi0gICAgICAgICAqIEBwYXJhbSBoYW5kbGVyIG5vdCBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVHJhdmVyc2FsV29ya2VyKGZpbmFsIE5vZGVIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0KG5vZGUpOwotICAgICAgICAgICAgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBudWxsKTsKLSAgICAgICAgICAgIGhhbmRsZXIuZW5kKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCB2aXNpdChBU1RzdGFydCBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXIuc3RhcnQobm9kZSk7Ci0gICAgICAgICAgICBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIG51bGwpOwotICAgICAgICAgICAgaGFuZGxlci5lbmQobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGNvbW1hbmRzIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUY29tbWFuZCBub2RlLCBPYmplY3QgZGF0YSkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXIuc3RhcnQobm9kZSk7Ci0gICAgICAgICAgICBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIG51bGwpOwotICAgICAgICAgICAgaGFuZGxlci5lbmQobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVGJsb2NrIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUYXJndW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0KG5vZGUpOwotICAgICAgICAgICAgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBudWxsKTsKLSAgICAgICAgICAgIGhhbmRsZXIuZW5kKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCB2aXNpdChBU1R0ZXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUdGVzdF9saXN0IG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RyaW5nIG5vZGUsIE9iamVjdCBkYXRhKSB0aHJvd3MgU2lldmVFeGNlcHRpb24gewotICAgICAgICAgICAgaGFuZGxlci5zdGFydChub2RlKTsKLSAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgbnVsbCk7Ci0gICAgICAgICAgICBoYW5kbGVyLmVuZChub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUc3RyaW5nX2xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBoYW5kbGVyLnN0YXJ0KG5vZGUpOwotICAgICAgICAgICAgbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBudWxsKTsKLSAgICAgICAgICAgIGhhbmRsZXIuZW5kKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9PcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9PcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTlkMjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU0NDczMTY1ODIyNzg1NjI4MzdMOwotCi0gICAgcHVibGljIE9wZXJhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKLSAgICAgICAgc3VwZXIocyk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL091dHB1dFV0aWxzLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9PdXRwdXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTM0ODcxLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL091dHB1dFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLk5vZGU7Ci0KLS8qKgotICogT3V0cHV0IHV0aWxpdGllcy4KLSAqIFRoZXNlIGFyZSBtb3N0bHkgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqIE1vcmUgcG93ZXIgYW5kIGZsZXhpYmlsaXR5IGlzIGF2YWlsYWJsZSB3aGVuIHVzaW5nIHRoZSBvYmplY3RzIGRpcmVjdGx5LgotICovCi1wdWJsaWMgY2xhc3MgT3V0cHV0VXRpbHMgewotCi0gICAgLyoqCi0gICAgICogPHA+V3JpdGVzIHRoZSBnaXZlbiBub2RlIGFzIHhtbC4KLSAgICAgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBmaXJzdCB3cml0ZXMgYSBwcm9sb2cgYmVmb3JlIGNhbGxpbmcge0BsaW5rICN0b1htbChOb2RlLCBXcml0ZXIpfS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIG91dHB1dCBmb3JtYXQgaXMgYSBzdWJzZXQgb2YgdGhlCi0gICAgICogPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZnJlZWQtc2lldmUtaW4teG1sLTA0Jz5zaWV2ZS1pbi14bWw8L2E+Ci0gICAgICogSW50ZXJuZXQgRHJhZnQuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHdyaXRlciBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBwcm9sb2cgY2Fubm90IGJlIHdyaXR0ZW4KLSAgICAgKiBAdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHdoZW4gc2NyaXB0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8geG1sCi0gICAgICogQHNlZSAjdG9YbWwoTm9kZSwgV3JpdGVyKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b1htbERvY3VtZW50KGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIjw/eG1sIHZlcnNpb249JzEuMCc/PiIpOwotICAgICAgICB0b1htbChub2RlLCB3cml0ZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Xcml0ZXMgdGhlIGdpdmVuIG5vZGUgYXMgeG1sLgotICAgICAqIE5vdGUgdGhhdCB0aGUgeG1sIHdpbGwgYmUgd3JpdHRlbiBhcyBhIGZyYWdtZW50LgotICAgICAqIEFuIGFwcHJvcHJpYXRlIHByb2xvZyBtdXN0IGJlIGFkZGVkIHRvIGNvbnZlcnQgdGhpcyBmcmFnbWVudCAKLSAgICAgKiB0byBhIGRvY3VtZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgb3V0cHV0IGZvcm1hdCBpcyBhIHN1YnNldCBvZiB0aGUKLSAgICAgKiA8YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1mcmVlZC1zaWV2ZS1pbi14bWwtMDQnPnNpZXZlLWluLXhtbDwvYT4KLSAgICAgKiBJbnRlcm5ldCBEcmFmdC4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBleHBlcmltZW50YWwuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHdyaXRlciBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24gd2hlbiBzY3JpcHQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB4bWwKLSAgICAgKiBAc2VlIFhtbE91dAotICAgICAqIEBzZWUgU2lldmVUb1htbAotICAgICAqIEBzZWUgU2lldmVIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRvWG1sKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgWG1sT3V0IG91dCA9IG5ldyBYbWxPdXQod3JpdGVyKTsKLSAgICAgICAgZmluYWwgU2lldmVUb1htbCBzaWV2ZVRvWG1sID0gbmV3IFNpZXZlVG9YbWwoKTsKLSAgICAgICAgZmluYWwgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBzaWV2ZVRvWG1sLmJ1aWxkKG91dCk7Ci0gICAgICAgIGZpbmFsIE5vZGVUcmF2ZXJzZXIgdHJhdmVyc2VyID0gbmV3IE5vZGVUcmF2ZXJzZXIoKTsKLSAgICAgICAgdHJhdmVyc2VyLnRyYXZlcnNlKGhhbmRsZXIsIG5vZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Xcml0ZXMgdGhlIHRyZWUgcm9vdGVkIGF0IHRoZSBnaXZlbiBub2RlIHRvIGEgU2lldmUgc2NyaXB0LgotICAgICAqIEBwYXJhbSBub2RlIG5vdCBudWxsCi0gICAgICogQHBhcmFtIHdyaXRlciBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgU2lldmVFeGNlcHRpb24gd2hlbmV2ZXIgdGhlIHNlcmlhbGl6YXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TaWV2ZShmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFdyaXRlciB3cml0ZXIpIHRocm93cyBTaWV2ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFRvU2lldmVIYW5kbGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRvU2lldmVIYW5kbGVyRmFjdG9yeSgpOwotICAgICAgICBmaW5hbCBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQod3JpdGVyKTsKLSAgICAgICAgZmluYWwgTm9kZVRyYXZlcnNlciB0cmF2ZXJzZXIgPSBuZXcgTm9kZVRyYXZlcnNlcigpOwotICAgICAgICB0cmF2ZXJzZXIudHJhdmVyc2UoaGFuZGxlciwgbm9kZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2lldmVIYW5kbGVyLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExZmEwOC4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsOwotCi0vKioKLSAqIFByZXNlbnRzIGEgaGlnaCBsZXZlbCByZXBvcnRpbmcgdmlldyBvZiBhIFNpZXZlIG5vZGUgdHJlZS4KLSAqIEZhbWlsaWFyaXR5IHdpdGggCi0gKiA8YSBocmVmPSdodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDI4LnR4dCc+U2lldmU8L2E+IGlzIGFzc3VtZWQgCi0gKiAoYnV0IG5vdCBvZiB0aGUgaW50ZXJuYWxzIG9mIHRoZSAKLSAqIDxhIGhyZWY9J2h0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2pzaWV2ZS8nPkpTaWV2ZTwvYT4gaW1wbGVtZW50YXRpb24pLgotICogQW55b25lIHdobyByZXF1aXJlcyBhIGxvdyBsZXZlbCwgPGNvZGU+SlNpZXZlPC9jb2RlPiBzcGVjaWZpYyB2aWV3Ci0gKiBzaG91bGQgc2VlIHtAbGluayBOb2RlSGFuZGxlcn0KLSAqIAotICogQHNlZSBOb2RlVHJhdmVyc2VyCi0gKiBAc2VlIE5vZGVIYW5kbGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2lldmVIYW5kbGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIFNpZXZlIHNjcmlwdC4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0U2NyaXB0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgZW5kIG9mIGEgU2lldmUgc2NyaXB0LgotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgZW5kU2NyaXB0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYSBibG9jay4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0QmxvY2soKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBlbmQgb2YgYSBibG9jay4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZEJsb2NrKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYSBibG9jayBvZiBjb21tYW5kcy4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0Q29tbWFuZHMoKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBlbmQgb2YgYSBibG9jayBvZiBjb21tYW5kcy4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZENvbW1hbmRzKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIGNvbW1hbmQuCi0gICAgICogQHBhcmFtIGNvbW1hbmROYW1lIG5hbWUgaWRlbnRpZnlpbmcgdGhlIGNvbW1hbmQKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0Q29tbWFuZChTdHJpbmcgY29tbWFuZE5hbWUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIGVuZCBvZiBhIGNvbW1hbmQuCi0gICAgICogQHBhcmFtIGNvbW1hbmROYW1lIG5hbWUgaWRlbnRpZnlpbmcgdGhlIGNvbW1hbmQKLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZENvbW1hbmQoU3RyaW5nIGNvbW1hbmROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIGJsb2NrIG9mIGFyZ3VtZW50cy4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0QXJndW1lbnRzKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgZW5kIG9mIGEgYmxvY2sgb2YgYXJndW1lbnRzLgotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgZW5kQXJndW1lbnRzKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIHRhZyBhcmd1bWVudC4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBzdXBwbGllcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHRhZwotICAgICAqIChhZnRlciB0aGUgbGVhZGluZyAnOicgaGFzIGJlZW4gc3RyaXBwZWQpLgotICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIG5vdCBudWxsCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlSGFuZGxlciBhcmd1bWVudChTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlciBhIG51bWVyaWMgYXJndW1lbnQuCi0gICAgICogQHBhcmFtIG51bWJlciBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgYXJndW1lbnQoaW50IG51bWJlcikgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gYXJndW1lbnQgd2hpY2ggaXMgYSBsaXN0IG9mIHN0cmluZ3MuCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydFN0cmluZ0xpc3RBcmd1bWVudCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIGVuZCBvZiBhbiBhcmd1bWVudCB3aGljaCBpcyBhIGxpc3Qgb2Ygc3RyaW5ncy4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFN0cmluZ0xpc3RBcmd1bWVudCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIE9uZSBzdHJpbmcgZnJvbSBhIGxpc3QuCi0gICAgICogQHBhcmFtIHN0cmluZyBub3QgbnVsbAotICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgbGlzdE1lbWJlcihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIGxpc3Qgb2YgdGVzdHMuCi0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydFRlc3RMaXN0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgZW5kIG9mIGEgbGlzdCBvZiB0ZXN0cy4KLSAgICAgKiBAdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFRlc3RMaXN0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYSB0ZXN0LgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIGlkZW50aWZ5aW5nIHRoZSB0ZXN0Ci0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBlbmQgb2YgYSB0ZXN0LgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIGlkZW50aWZ5aW5nIHRoZSB0ZXN0Ci0gICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBiYXNpYyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBBbGwgbWV0aG9kcyBkbyBub3RoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZSBpbXBsZW1lbnRzIFNpZXZlSGFuZGxlciB7Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBhcmd1bWVudChpbnQgbnVtYmVyKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgYXJndW1lbnQoU3RyaW5nIHRhZykgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZEFyZ3VtZW50cygpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRCbG9jaygpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRDb21tYW5kKFN0cmluZyBjb21tYW5kTmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZENvbW1hbmRzKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFNjcmlwdCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRTdHJpbmdMaXN0QXJndW1lbnQoKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgZW5kVGVzdChTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRUZXN0TGlzdCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBsaXN0TWVtYmVyKFN0cmluZyBzdHJpbmcpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydEFyZ3VtZW50cygpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydEJsb2NrKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0Q29tbWFuZChTdHJpbmcgY29tbWFuZE5hbWUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydENvbW1hbmRzKCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0U2NyaXB0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0U3RyaW5nTGlzdEFyZ3VtZW50KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydFRlc3RMaXN0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZVRvWG1sLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZVRvWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2U2MjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2lldmVUb1htbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPkNvbnZlcnRzIFNpZXZlIG5vZGVzIHRvIHhtbC4KLSAqIFNldHRpbmdzIGRlZmF1bHQgdG8gPGNvZGU+ZHJhZnQtZnJlZWQtc2lldmUtaW4teG1sLTAxPC9jb2RlPgotICogPGJsb2NrcXVvdGUgY2l0ZT0naHR0cDovL3Rvb2xzLmlldGYub3JnL2lkL2RyYWZ0LWZyZWVkLXNpZXZlLWluLXhtbC0wMS50eHQnPgotICogU2lldmUgRW1haWwgRmlsdGVyaW5nOiBTaWV2ZXMgYW5kIGRpc3BsYXkgZGlyZWN0aXZlcyBpbiBYTUw8L2Jsb2NrcXVvdGU+LiAKLSAqIDwvcD4KLSAqIDxoND5Lbm93biBsaW1pdGF0aW9uczwvaDQ+Ci0gKiA8cD5Gb3Igc2ltcGxpY2l0eSwgYWxsb3cgZWxlbWVudHMgYXJlIG91dCBpbnRvIGEgc2luZ2xlIG5hbWVzcGFjZS48L3A+ICAgICAgICAgICAgICAgICAgIAotICovCi1wdWJsaWMgY2xhc3MgU2lldmVUb1htbCB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRV9BQ1RJT05fQ09NTUFORCA9ICJhY3Rpb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FX0NPTlRST0xfQ09NTUFORCA9ICJjb250cm9sIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRV9URVNUID0gInRlc3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FX0xJU1QgPSAibGlzdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVfTlVNID0gIm51bSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVfVEFHID0gInRhZyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVfU1RSSU5HID0gInN0ciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSRUZJWCA9ICJzaWV2ZSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FU1BBQ0UgPSAidXJuOmlldGY6cGFyYW1zOnhtbDpuczpzaWV2ZSI7Ci0gICAgCi0gICAgLyoqIENvbnRyb2wgY29tbWFuZHMgKGFzIGxpc3RlZCBpbiBSRkMgMzAyOCkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRST0xfQ09NTUFORFMgPSB7IklmIiwgIlJlcXVpcmUiLCAiU3RvcCJ9OwotICAgIAotICAgIC8qKgotICAgICAqIDxwPlNpbXBsZSBpbmZvc2V0IG91dHB1dC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBhcHByb2FjaCB0YWtlbiB0byBuYW1lc3BhY2VzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGJvdGggCi0gICAgICogPGEgaHJlZj0naHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaS9qYXZheC94bWwvbmFtZXNwYWNlL1FOYW1lLmh0bWwnPlFOYW1lPC9hPgotICAgICAqIGFuZCA8YSBocmVmPSdodHRwOi8vd3d3LnNheHByb2plY3Qub3JnJz5TQVg8L2E+LgotICAgICAqIDwvcD4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPgotICAgICAqIFRoZSA8Y29kZT5sb2NhbFBhcnQ8L2NvZGU+IHBhcmFtZXRlciBnaXZlcyB0aGUgCi0gICAgICogPGEgaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8jTlQtTG9jYWxQYXJ0JyAgcmVsPSd0YWcnPkxvY2FsUGFydDwvYT4KLSAgICAgKiBhbmQgPGNvZGU+TVVTVDwvY29kZT4gYmUgcHJvdmlkZWQgaW4gYWxsIGNhc2VzLgotICAgICAqIFdoZW4gdGhlIG5hbWUgaXMgYW4gPGEgaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8jTlQtVW5wcmVmaXhlZE5hbWUnICByZWw9J3RhZyc+VW5wcmVmaXhlZE5hbWU8L2E+LAotICAgICAqIHRoaXMgaXMgdGhlIGNvbXBsZXRlIDxhIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI2R0LXF1YWxuYW1lJyAgcmVsPSd0YWcnPlFOYW1lPC9hPi4KLSAgICAgKiBXaGVuIHRoZSBuYW1lIGlzIGEgPGEgaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8jTlQtUHJlZml4ZWROYW1lJyAgcmVsPSd0YWcnPlByZWZpeGVkTmFtZTwvYT4sCi0gICAgICogdGhlIG91dHB1dCBtdXN0IGNvbWJpbmUgdGhpcyB3aXRoIHRoZSA8YSBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNOVC1QcmVmaXgnIHJlbD0ndGFnJz5QcmVmaXg8L2E+Ci0gICAgICogPC9saT4gIAotICAgICAqIDxsaT4KLSAgICAgKiA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT3V0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgYW4gWE1MIGVsZW1lbnQuCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBvdXRwdXQgZmFpbHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9wZW5FbGVtZW50KENoYXJTZXF1ZW5jZSBsb2NhbE5hbWUsIENoYXJTZXF1ZW5jZSB1cmksIENoYXJTZXF1ZW5jZSBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdXRwdXRzIGEgYXR0cmlidXRlLgotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdW5lc2NhcGVkIFhNTCBhdHRyaWJ1dGUgY29udGVudCwgbm90IG51bGwKLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIG91dHB1dCBmYWlscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYXR0cmlidXRlKENoYXJTZXF1ZW5jZSBsb2NhbE5hbWUsIENoYXJTZXF1ZW5jZSB1cmksIENoYXJTZXF1ZW5jZSBwcmVmaXgsIENoYXJTZXF1ZW5jZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE91dHB1dHMgYm9keSB0ZXh0LgotICAgICAgICAgKiBBbGwgYXR0cmlidXRlIHdpbGwgYmUgb3V0cHV0IGJlZm9yZSBhbnkgYm9keSB0ZXh0Ci0gICAgICAgICAqIHNvIHRoaXMgY2FsbCBpbXBsaWNpdGx5IG1hcmtzIHRoZSBlbmQgb2YgYW55IGF0dHJpYnV0ZXMKLSAgICAgICAgICogZm9yIHRoZSBlbGVtZW50LgotICAgICAgICAgKiBAcGFyYW0gdGV4dCB1bmVzY2FwZWQgYm9keSB0ZXh0LCBub3QgbnVsbAotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gb3V0cHV0IGZhaWxzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBjb250ZW50KENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogRW5kcyBhbiBYTUwgRWxlbWVudC4KLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIG91dHB1dCBmYWlscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2VFbGVtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNYXBzIG5vZGUgbmFtZXMgdG8gZWxlbWVudCBuYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIE5hbWVNYXBwZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydHMgdGhlIGdpdmVuIG5vZGUgbmFtZSB0byBhbgotICAgICAgICAgKiBlbGVtZW50IGxvY2FsIG5hbWUuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIG5vdCBudWxsCi0gICAgICAgICAqIEByZXR1cm4gZWxlbWVudCBsb2NhbCBuYW1lIHRvIHVzZSBmb3IgZ2l2ZW4gbmFtZSwgbm90IG51bGwKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9FbGVtZW50TmFtZShTdHJpbmcgbmFtZSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWFwcGVyIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzYW1lCi0gICAgICogbmFtZSBmb3IgYW55IG5vZGUuCi0gICAgICogQHBhcmFtIGVsZW1lbnRMb2NhbE5hbWUgdG8gYmUgcmV0dXJuZWQgZm9yIGFsbCBuYW1lcywgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lTWFwcGVyIHVuaWZvcm1NYXBwZXIoZmluYWwgU3RyaW5nIGVsZW1lbnRMb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOYW1lTWFwcGVyKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b0VsZW1lbnROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRMb2NhbE5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtYXBwZXIgd2hpY2ggcmV0dXJucyB2YWx1ZXMgZ2l2ZW4gaW4gCi0gICAgICogPGNvZGU+ZHJhZnQtZnJlZWQtc2lldmUtaW4teG1sLTAxPC9jb2RlPgotICAgICAqIDxibG9ja3F1b3RlIGNpdGU9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9pZC9kcmFmdC1mcmVlZC1zaWV2ZS1pbi14bWwtMDEudHh0Jz4KLSAgICAgKiBTaWV2ZSBFbWFpbCBGaWx0ZXJpbmc6IFNpZXZlcyBhbmQgZGlzcGxheSBkaXJlY3RpdmVzIGluIFhNTDwvYmxvY2txdW90ZT4uICAKLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lTWFwcGVyIHNpZXZlSW5YbWxNYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmFtZU1hcHBlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b0VsZW1lbnROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NvbnRyb2xDb21tYW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8IENPTlRST0xfQ09NTUFORFMubGVuZ3RoO2krKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoQ09OVFJPTF9DT01NQU5EU1tpXS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbnRyb2xDb21tYW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ29udHJvbENvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gREVGQVVMVF9OQU1FX0NPTlRST0xfQ09NTUFORDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBERUZBVUxUX05BTUVfQUNUSU9OX0NPTU1BTkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVXJpID0gREVGQVVMVF9OQU1FU1BBQ0U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gREVGQVVMVF9QUkVGSVg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRWxlbWVudE5hbWUgPSBERUZBVUxUX05BTUVfU1RSSU5HOwotICAgIHByaXZhdGUgU3RyaW5nIHRhZ0VsZW1lbnROYW1lID0gREVGQVVMVF9OQU1FX1RBRzsKLSAgICBwcml2YXRlIFN0cmluZyBudW1iZXJFbGVtZW50TmFtZSA9IERFRkFVTFRfTkFNRV9OVU07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdEVsZW1lbnROYW1lID0gREVGQVVMVF9OQU1FX0xJU1Q7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZUF0dHJpYnV0ZU5hbWUgPSBERUZBVUxUX05BTUVfQVRUUklCVVRFOwotICAgIHByaXZhdGUgTmFtZU1hcHBlciBjb21tYW5kTmFtZU1hcHBlciA9IHNpZXZlSW5YbWxNYXBwZXIoKTsKLSAgICBwcml2YXRlIE5hbWVNYXBwZXIgdGVzdE5hbWVNYXBwZXIgPSB1bmlmb3JtTWFwcGVyKERFRkFVTFRfTkFNRV9URVNUKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIG1hcHBlciBmb3IgY29tbWFuZCBuYW1lcy4KLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIE5hbWVNYXBwZXIgZ2V0Q29tbWFuZE5hbWVNYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb21tYW5kTmFtZU1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIG1hcHBlciBmb3IgY29tbWFuZCBuYW1lcy4KLSAgICAgKiBAcGFyYW0gY29tbWFuZE5hbWVNYXBwZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kTmFtZU1hcHBlcihOYW1lTWFwcGVyIGNvbW1hbmROYW1lTWFwcGVyKSB7Ci0gICAgICAgIHRoaXMuY29tbWFuZE5hbWVNYXBwZXIgPSBjb21tYW5kTmFtZU1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbGVtZW50IG5hbWUgdXNlZCBmb3IgbGlzdHMuCi0gICAgICogQHJldHVybiBlbGVtZW50IG5hbWUgdXNlZCBmb3IgbGlzdHMsIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaXN0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0RWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZWxlbWVudCBuYW1lIHVzZWQgZm9yIGxpc3RzLgotICAgICAqIEBwYXJhbSBsaXN0RWxlbWVudE5hbWUgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0RWxlbWVudE5hbWUoU3RyaW5nIGxpc3RFbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLmxpc3RFbGVtZW50TmFtZSA9IGxpc3RFbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCB0byBuYW1lIGNvbW1hbmQgYW5kIHRlc3RzLgotICAgICAqIEByZXR1cm4gbmFtZSwgb3IgbnVsbCB3aGVuIG5vdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVBdHRyaWJ1dGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZUF0dHJpYnV0ZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGUgY29tbWFuZCBhbmQgdGVzdCBuYW1lcy4KLSAgICAgKiBAcGFyYW0gbmFtZUF0dHJpYnV0ZU5hbWUgbmFtaW5nIGF0dHJpYnV0ZSwgCi0gICAgICogb3IgbnVsbCB3aGVuIG5vIGF0dHJpYnV0ZSBzaG91bGQgYmUgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVBdHRyaWJ1dGVOYW1lKFN0cmluZyBuYW1lQXR0cmlidXRlTmFtZSkgewotICAgICAgICB0aGlzLm5hbWVBdHRyaWJ1dGVOYW1lID0gbmFtZUF0dHJpYnV0ZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZXNwYWNlIHByZWZpeCB0byBiZSB1c2VkIGZvciBhbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0gICAgICogQHJldHVybiBuYW1lc3BhY2UgcHJlZml4LCBvciBudWxsIHdoZW4gbm8gbmFtZXNwYWNlIHNob3VsZCBiZSB1c2VkIAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlUHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWVzcGFjZSBwcmVmaXggdG8gYmUgdXNlZCBmb3IgYWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlLCBvciBudWxsIHdoZW4gbm8gbmFtZXNwYWNlIHNob3VsZCBiZSB1c2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlUHJlZml4KFN0cmluZyBuYW1lc3BhY2VQcmVmaXgpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VQcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZXNwYWNlIFVSSSB0byBiZSB1c2VkIGZvciBhbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0gICAgICogQHJldHVybiBuYW1lc3BhY2UgVVJJLCBvciBudWxsIHdoZW4gbm8gbmFtZXNwYWNlIHNob3VsZCBiZSB1c2VkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZXNwYWNlIHVyaSB0byBiZSB1c2VkIGZvciBhbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVyaSBuYW1lc3BhY2UgVVJJLCBvciBudWxsIHdoZW4gbm8gbmFtZXNwYWNlIHNob3VsZCBiZSB1c2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVXJpKFN0cmluZyBuYW1lc3BhY2VVcmkpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VVcmkgPSBuYW1lc3BhY2VVcmk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdyYXBzIGEgbnVtZXJpYyBhcmd1bWVudC4KLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROdW1iZXJFbGVtZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bWJlckVsZW1lbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3cmFwcyBhIG51bWVyaWMgYXJndW1lbnQuCi0gICAgICogQHBhcmFtIG51bWJlckVsZW1lbnROYW1lIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyRWxlbWVudE5hbWUoU3RyaW5nIG51bWJlckVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHRoaXMubnVtYmVyRWxlbWVudE5hbWUgPSBudW1iZXJFbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoYXQgd3JhcHMgYSBzdHJpbmcgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIG5vdCBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdFbGVtZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ0VsZW1lbnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3cmFwcyBhIHN0cmluZyBlbGVtZW50LgotICAgICAqIEBwYXJhbSBzdHJpbmdFbGVtZW50TmFtZSBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ0VsZW1lbnROYW1lKFN0cmluZyBzdHJpbmdFbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLnN0cmluZ0VsZW1lbnROYW1lID0gc3RyaW5nRWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdyYXBzIGEgdGFnIGVsZW1lbnQuCi0gICAgICogQHJldHVybiBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnRWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0YWdFbGVtZW50TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoYXQgd3JhcHMgYSB0YWcgZWxlbWVudAotICAgICAqIEBwYXJhbSB0YWdFbGVtZW50TmFtZSBub3QgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhZ0VsZW1lbnROYW1lKFN0cmluZyB0YWdFbGVtZW50TmFtZSkgewotICAgICAgICB0aGlzLnRhZ0VsZW1lbnROYW1lID0gdGFnRWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWFwcGVyIGZvciBuYW1lcyBvZiB0ZXN0IG5vZGVzLgotICAgICAqIEByZXR1cm4gbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZU1hcHBlciBnZXRUZXN0TmFtZU1hcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIHRlc3ROYW1lTWFwcGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1hcHBlciBmb3IgbmFtZXMgb2YgdGVzdCBub2Rlcy4KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWVNYXBwZXIgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0TmFtZU1hcHBlcihOYW1lTWFwcGVyIHRlc3ROYW1lTWFwcGVyKSB7Ci0gICAgICAgIHRoaXMudGVzdE5hbWVNYXBwZXIgPSB0ZXN0TmFtZU1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBoYW5kbGVyIHRvIHdyaXRlcyB0byB0aGUgZ2l2ZW4gb3V0cHV0LgotICAgICAqIEBwYXJhbSBvdXQgb3V0cHV0LCBub3QgbnVsbAotICAgICAqIEByZXR1cm4gaGFubGRlciwgbm90IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGJ1aWxkKGZpbmFsIE91dCBvdXQpIHsKLSAgICAgICAgZmluYWwgV29ya2VyIHdvcmtlciA9IG5ldyBXb3JrZXIobmFtZUF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZVVyaSwgbmFtZXNwYWNlUHJlZml4LCBzdHJpbmdFbGVtZW50TmFtZSwgCi0gICAgICAgICAgICAgICAgdGFnRWxlbWVudE5hbWUsIG51bWJlckVsZW1lbnROYW1lLCBsaXN0RWxlbWVudE5hbWUsIGNvbW1hbmROYW1lTWFwcGVyLCB0ZXN0TmFtZU1hcHBlciwgb3V0KTsKLSAgICAgICAgcmV0dXJuIHdvcmtlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV29ya2VyIHBlcmZvcm1zIGFjdHVhbCBjb252ZXJzaW9uIGFsbG93aW5nIGVuY2xvc2luZyB0byBiZSBzaGFyZWQgc2FmZWx5Ci0gICAgICogYmV0d2VlbiB0aHJlYWRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFdvcmtlciBleHRlbmRzIFNpZXZlSGFuZGxlci5CYXNlIHsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lQXR0cmlidXRlTmFtZTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVyaTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHJpbmdFbGVtZW50TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFnRWxlbWVudE5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG51bWJlckVsZW1lbnROYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXN0RWxlbWVudE5hbWU7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGZpbmFsIE5hbWVNYXBwZXIgY29tbWFuZE5hbWVNYXBwZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTmFtZU1hcHBlciB0ZXN0TmFtZU1hcHBlcjsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZmluYWwgT3V0IG91dDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBXb3JrZXIoZmluYWwgU3RyaW5nIG5hbWVBdHRyaWJ1dGVOYW1lLCBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVXJpLCBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nRWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB0YWdFbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIG51bWJlckVsZW1lbnROYW1lLCAKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGlzdEVsZW1lbnROYW1lLCBmaW5hbCBOYW1lTWFwcGVyIGNvbW1hbmROYW1lTWFwcGVyLCBmaW5hbCBOYW1lTWFwcGVyIHRlc3ROYW1lTWFwcGVyLCAKLSAgICAgICAgICAgICAgICBmaW5hbCBPdXQgb3V0KSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5uYW1lQXR0cmlidXRlTmFtZSA9IG5hbWVBdHRyaWJ1dGVOYW1lOwotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VVcmkgPSBuYW1lc3BhY2VVcmk7Ci0gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZVByZWZpeCA9IG5hbWVzcGFjZVByZWZpeDsKLSAgICAgICAgICAgIHRoaXMuc3RyaW5nRWxlbWVudE5hbWUgPSBzdHJpbmdFbGVtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGFnRWxlbWVudE5hbWUgPSB0YWdFbGVtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMubnVtYmVyRWxlbWVudE5hbWUgPSBudW1iZXJFbGVtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMubGlzdEVsZW1lbnROYW1lID0gbGlzdEVsZW1lbnROYW1lOwotICAgICAgICAgICAgdGhpcy5jb21tYW5kTmFtZU1hcHBlciA9IGNvbW1hbmROYW1lTWFwcGVyOwotICAgICAgICAgICAgdGhpcy50ZXN0TmFtZU1hcHBlciA9IHRlc3ROYW1lTWFwcGVyOwotICAgICAgICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRDb21tYW5kKFN0cmluZyBjb21tYW5kTmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGNsb3NlRWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTaWV2ZUhhbmRsZXIgY2xvc2VFbGVtZW50KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2VFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydENvbW1hbmQoU3RyaW5nIGNvbW1hbmROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dC5vcGVuRWxlbWVudChjb21tYW5kTmFtZU1hcHBlci50b0VsZW1lbnROYW1lKGNvbW1hbmROYW1lKSwgbmFtZXNwYWNlVXJpLCBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgIG5hbWVBdHRyaWJ1dGUoY29tbWFuZE5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgbGlzdE1lbWJlcihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dC5vcGVuRWxlbWVudChzdHJpbmdFbGVtZW50TmFtZSwgbmFtZXNwYWNlVXJpLCBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgIG91dC5jb250ZW50KHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgYXJndW1lbnQoaW50IG51bWJlcikgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQub3BlbkVsZW1lbnQobnVtYmVyRWxlbWVudE5hbWUsIG5hbWVzcGFjZVVyaSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgICAgICBvdXQuY29udGVudChJbnRlZ2VyLnRvU3RyaW5nKG51bWJlcikpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGFyZ3VtZW50KFN0cmluZyB0YWcpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0Lm9wZW5FbGVtZW50KHRhZ0VsZW1lbnROYW1lLCBuYW1lc3BhY2VVcmksIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICAgICAgb3V0LmNvbnRlbnQodGFnKTsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2VFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGNsb3NlRWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgc3RhcnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQub3BlbkVsZW1lbnQodGVzdE5hbWVNYXBwZXIudG9FbGVtZW50TmFtZSh0ZXN0TmFtZSksIG5hbWVzcGFjZVVyaSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgICAgICBuYW1lQXR0cmlidXRlKHRlc3ROYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFRlc3RMaXN0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGNsb3NlRWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgc3RhcnRUZXN0TGlzdCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0Lm9wZW5FbGVtZW50KGxpc3RFbGVtZW50TmFtZSwgbmFtZXNwYWNlVXJpLCBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG5hbWVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobmFtZUF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobmFtZUF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZVVyaSwgbmFtZXNwYWNlUHJlZml4LCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1RvU2lldmVIYW5kbGVyRmFjdG9yeS5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvVG9TaWV2ZUhhbmRsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjdkMjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvVG9TaWV2ZUhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogPHA+QnVpbGRzIHNpZXZlIGhhbmRsZXJzIHRoYXQgY29udmVydCBub2RlcyB0byBhIFNpZXZlIHNjcmlwdC48L3A+Ci0gKiA8aDQ+VXNhZ2U8L2g0PgotICogPHVsPgotICogPGxpPkNyZWF0ZSBhbiBpbnN0YW5jZTwvbGk+Ci0gKiA8bGk+Q29uZmlndXJlIHVzaW5nIHNldHRlcnM8L2xpPgotICogPGxpPntAbGluayAjYnVpbGQoV3JpdGVyKX0gY29uZmlndXJlZCB7QGxpbmsgU2lldmVIYW5kbGVyfTwvbGk+Ci0gKiA8bGk+U3VwcGx5IGhhbmRsZXIgdG8ge0BsaW5rIE5vZGVUcmF2ZXJzZXJ9PC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEhhbmRsZXIgaW5zdGFuY2VzIGFyZSBmdWxseSBjb25maWd1cmVkIHdoZW4gYnVpbHQuIAotICogQ2hhbmdlcyB0byB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uIHdpbGwgbm90IGVmZmVjdCAKLSAqIHRoZW0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUb1NpZXZlSGFuZGxlckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGEgY29uZmlndXJlZCBoYW5kbGVyLgotICAgICAqIEByZXR1cm4gbm90IG51bGwKLSAgICAgKiBAc2VlIE5vZGVUb1NpZXZlQWRhcHRlcgotICAgICAqIEBzZWUgTm9kZVRyYXZlcnNlcgotICAgICAqLwotICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgYnVpbGQoZmluYWwgV3JpdGVyIHdyaXRlcikgewotICAgICAgICByZXR1cm4gbmV3IFRvU2lldmVIYW5kbGVyKHdyaXRlcik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRocmVhZCBzYWZlIHdvcmtlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUb1NpZXZlSGFuZGxlciBleHRlbmRzIFNpZXZlSGFuZGxlci5CYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXcml0ZXIgd3JpdGVyOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbW1hUmVxdWlyZWRCZWZvcmVOZXh0VGVzdDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0VGVzdEluTGlzdDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbW1hbmRVc2VkQmxvY2s7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21tYW5kQWZ0ZXJFbmRDb21tYW5kOwotICAgICAKLSAgICAgICAgcHVibGljIFRvU2lldmVIYW5kbGVyKGZpbmFsIFdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOwotICAgICAgICAgICAgY29tbWFSZXF1aXJlZEJlZm9yZU5leHRUZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmaXJzdFRlc3RJbkxpc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbW1hbmRVc2VkQmxvY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbW1hbmRBZnRlckVuZENvbW1hbmQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEBzZWUgU2lldmVIYW5kbGVyI2VuZEJsb2NrKCkgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgZW5kQmxvY2soKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBjb21tYW5kVXNlZEJsb2NrID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBhcHBlbmQoJ30nKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBAc2VlIFNpZXZlSGFuZGxlciNzdGFydEJsb2NrKCkgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgc3RhcnRCbG9jaygpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKCd7Jyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBAc2VlIFNpZXZlSGFuZGxlciNzdGFydENvbW1hbmQoKSAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBzdGFydENvbW1hbmQoU3RyaW5nIGNvbW1hbmROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBjb21tYVJlcXVpcmVkQmVmb3JlTmV4dFRlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kQWZ0ZXJFbmRDb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kQWZ0ZXJFbmRDb21tYW5kID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKGNvbW1hbmROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEBzZWUgU2lldmVIYW5kbGVyI2VuZENvbW1hbmQoKSAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBlbmRDb21tYW5kKFN0cmluZyBjb21tYW5kTmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKCFjb21tYW5kVXNlZEJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb21tYW5kQWZ0ZXJFbmRDb21tYW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbW1hbmRVc2VkQmxvY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiogQHNlZSBTaWV2ZUhhbmRsZXIjYXJndW1lbnQoU3RyaW5nKSAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBhcmd1bWVudChTdHJpbmcgdGFnKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXBwZW5kcyB3aGl0ZSBzcGFjZS4KLSAgICAgICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgc3BhY2UoKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhcHBlbmQoJyAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBAc2VlIFNpZXZlSGFuZGxlciNhcmd1bWVudChpbnQpICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGFyZ3VtZW50KGludCBudW1iZXIpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKEludGVnZXIudG9TdHJpbmcobnVtYmVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBAc2VlIFNpZXZlSGFuZGxlciNzdGFydFN0cmluZ0xpc3RBcmd1bWVudCgpICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0U3RyaW5nTGlzdEFyZ3VtZW50KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgc3BhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBhcHBlbmQoJ1snKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEBzZWUgU2lldmVIYW5kbGVyI2VuZFN0cmluZ0xpc3RBcmd1bWVudCgpICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFN0cmluZ0xpc3RBcmd1bWVudCgpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBlbmQoJ10nKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqIEBzZWUgU2lldmVIYW5kbGVyI2xpc3RNZW1iZXIoU3RyaW5nKSAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNpZXZlSGFuZGxlciBsaXN0TWVtYmVyKFN0cmluZyBzdHJpbmcpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFwcGVuZCgnIicpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8c3RyaW5nLmxlbmd0aCgpO2krKykgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dCA9IHN0cmluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJyInIHx8IG5leHQgPT0gJ1xcJyB8fCBuZXh0ID09J1xyJyB8fCBuZXh0ID09J1xmJykgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBhcHBlbmQobmV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvKiogQHNlZSBTaWV2ZUhhbmRsZXIjc3RhcnRUZXN0TGlzdCgpICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIHN0YXJ0VGVzdExpc3QoKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaXJzdFRlc3RJbkxpc3QgPSB0cnVlOwotICAgICAgICAgICAgY29tbWFSZXF1aXJlZEJlZm9yZU5leHRUZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKCcoJyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKiBAc2VlIFNpZXZlSGFuZGxlciNlbmRUZXN0TGlzdCgpICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2lldmVIYW5kbGVyIGVuZFRlc3RMaXN0KCkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgY29tbWFSZXF1aXJlZEJlZm9yZU5leHRUZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kKCcpJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQHNlZSBTaWV2ZUhhbmRsZXIjc3RhcnRUZXN0KFN0cmluZykgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTaWV2ZUhhbmRsZXIgc3RhcnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGNvbW1hUmVxdWlyZWRCZWZvcmVOZXh0VGVzdCkgewotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmaXJzdFRlc3RJbkxpc3QpIHsKLSAgICAgICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tbWFSZXF1aXJlZEJlZm9yZU5leHRUZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZpcnN0VGVzdEluTGlzdCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGFwcGVuZCh0ZXN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXBwZW5kcyB0aGUgZ2l2ZW4gc2VxdWVuY2UuCi0gICAgICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgdG8gYmUgYXBwZW5kZWQKLSAgICAgICAgICogQHJldHVybiB0aGlzCi0gICAgICAgICAqIEB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB3aGVuIGNoYXJhY3RlciBjYW5ub3QgYmUgd3JpdHRlbgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTaWV2ZUhhbmRsZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBjaGFyYWN0ZXJTZXF1ZW5jZSkgdGhyb3dzIEhhbHRUcmF2ZXJzYWxFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGNoYXJhY3RlclNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGVuZHMgdGhlIGdpdmVuIGNoYXJhY3Rlci4KLSAgICAgICAgICogQHBhcmFtIGNoYXJhY3RlciB0byBiZSBhcHBlbmRlZAotICAgICAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgICAgICogQHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHdoZW4gY2hhcmFjdGVyIGNhbm5vdCBiZSB3cml0dGVuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNpZXZlSGFuZGxlciBhcHBlbmQoY2hhciBjaGFyYWN0ZXIpIHRocm93cyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChjaGFyYWN0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBIYWx0VHJhdmVyc2FsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvWG1sT3V0LmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9YbWxPdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3MzQ3YS4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9YbWxPdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqLyAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUudXRpbC5TaWV2ZVRvWG1sLk91dDsKLQotLyoqCi0gKiA8cD5MaWdodHdlaWdodCB7QGxpbmsgT3V0fSBpbXBsZW1lbnRhdGlvbi48L3A+Ci0gKiA8cD4KLSAqIFJlcXVpcmVzIGEgd3JhcHBlciB0byBiZSB1c2VkIHNhZmVseSBpbiBhIG11bHRpdGhyZWFkZWQKLSAqIGVudmlyb25tZW50LjwvcD4KLSAqIDxwPgotICogTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuIFBsZWFzZSBjb3B5IGFuZCBoYWNrITwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbE91dCBpbXBsZW1lbnRzIFNpZXZlVG9YbWwuT3V0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTkFNRV9TVEFSVF9NQVNLID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTkFNRV9NQVNLID0gMSA8PCAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTkFNRV9CT0RZX0NIQVIgPSBOQU1FX01BU0s7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUiA9IE5BTUVfTUFTSyB8IE5BTUVfU1RBUlRfTUFTSzsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gQUxMT1dFRF9DSEFSQUNURVJTID0gbmV3IGJvb2xlYW5bMSA8PCAxNl07IAotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFycmF5cy5maWxsKEFMTE9XRURfQ0hBUkFDVEVSUywgZmFsc2UpOwotICAgICAgICBBTExPV0VEX0NIQVJBQ1RFUlNbMHg5XSA9IHRydWU7Ci0gICAgICAgIEFMTE9XRURfQ0hBUkFDVEVSU1sweEFdID0gdHJ1ZTsKLSAgICAgICAgQUxMT1dFRF9DSEFSQUNURVJTWzB4RF0gPSB0cnVlOwotICAgICAgICBBcnJheXMuZmlsbChBTExPV0VEX0NIQVJBQ1RFUlMsIDB4MjAsIDB4RDdGRiwgdHJ1ZSk7Ci0gICAgICAgIEFycmF5cy5maWxsKEFMTE9XRURfQ0hBUkFDVEVSUywgMHhFMDAwLCAweEZGRkQsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gQ0hBUkFDVEVSX0NPREVTID0gbmV3IGJ5dGVbMSA8PCAxNl07IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWydfJ10gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWyc6J10gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgLy8gTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljCi0gICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMDQxLCAweDAwNUEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAwNjEsIDB4MDA3QSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDBDMCwgMHgwMEQ2LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMEQ4LCAweDAwRjYsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAwRjgsIDB4MDBGRiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDEwMCwgMHgwMTMxLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMTM0LCAweDAxM0UsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAxNDEsIDB4MDE0OCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDE0QSwgMHgwMTdFLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMTgwLCAweDAxQzMsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAxQ0QsIDB4MDFGMCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDFGNCwgMHgwMUY1LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMUZBLCAweDAyMTcsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAyNTAsIDB4MDJBOCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDJCQiwgMHgwMkMxLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDAzODZdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMzg4LCAweDAzOEEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDM4Q10gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAzOEUsIDB4MDNBMSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDNBMywgMHgwM0NFLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwM0QwLCAweDAzRDYsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDNEQV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDNEQ10gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDNERV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDNFMF0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAzRTIsIDB4MDNGMywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDQwMSwgMHgwNDBDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNDBFLCAweDA0NEYsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA0NTEsIDB4MDQ1QywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDQ1RSwgMHgwNDgxLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNDkwLCAweDA0QzQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA0QzcsIDB4MDRDOCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDRDQiwgMHgwNENDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNEQwLCAweDA0RUIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA0RUUsIDB4MDRGNSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDRGOCwgMHgwNEY5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNTMxLCAweDA1NTYsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDU1OV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA1NjEsIDB4MDU4NiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDVEMCwgMHgwNUVBLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNUYwLCAweDA1RjIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2MjEsIDB4MDYzQSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDY0MSwgMHgwNjRBLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNjcxLCAweDA2QjcsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2QkEsIDB4MDZCRSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDZDMCwgMHgwNkNFLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNkQwLCAweDA2RDMsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDZENV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2RTUsIDB4MDZFNiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDkwNSwgMHgwOTM5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDA5M0RdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOTU4LCAweDA5NjEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5ODUsIDB4MDk4QywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDk4RiwgMHgwOTkwLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOTkzLCAweDA5QTgsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5QUEsIDB4MDlCMCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwOUIyXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDlCNiwgMHgwOUI5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOURDLCAweDA5REQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5REYsIDB4MDlFMSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDlGMCwgMHgwOUYxLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTA1LCAweDBBMEEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBMEYsIDB4MEExMCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEExMywgMHgwQTI4LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTJBLCAweDBBMzAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBMzIsIDB4MEEzMywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEEzNSwgMHgwQTM2LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTM4LCAweDBBMzksIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBNTksIDB4MEE1QywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQTVFXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEE3MiwgMHgwQTc0LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTg1LCAweDBBOEIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MEE4RF0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBOEYsIDB4MEE5MSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEE5MywgMHgwQUE4LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQUFBLCAweDBBQjAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBQjIsIDB4MEFCMywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEFCNSwgMHgwQUI5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBBQkRdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBBRTBdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjA1LCAweDBCMEMsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCMEYsIDB4MEIxMCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEIxMywgMHgwQjI4LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjJBLCAweDBCMzAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCMzIsIDB4MEIzMywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEIzNiwgMHgwQjM5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBCM0RdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjVDLCAweDBCNUQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCNUYsIDB4MEI2MSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEI4NSwgMHgwQjhBLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjhFLCAweDBCOTAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCOTIsIDB4MEI5NSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEI5OSwgMHgwQjlBLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBCOUNdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjlFLCAweDBCOUYsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCQTMsIDB4MEJBNCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEJBOCwgMHgwQkFBLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQkFFLCAweDBCQjUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCQjcsIDB4MEJCOSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEMwNSwgMHgwQzBDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzBFLCAweDBDMTAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDMTIsIDB4MEMyOCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEMyQSwgMHgwQzMzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzM1LCAweDBDMzksIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDNjAsIDB4MEM2MSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEM4NSwgMHgwQzhDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzhFLCAweDBDOTAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDOTIsIDB4MENBOCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MENBQSwgMHgwQ0IzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQ0I1LCAweDBDQjksIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MENERV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDRTAsIDB4MENFMSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEQwNSwgMHgwRDBDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRDBFLCAweDBEMTAsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBEMTIsIDB4MEQyOCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEQyQSwgMHgwRDM5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRDYwLCAweDBENjEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFMDEsIDB4MEUyRSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRTMwXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEUzMiwgMHgwRTMzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRTQwLCAweDBFNDUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFODEsIDB4MEU4MiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRTg0XSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEU4NywgMHgwRTg4LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFOEFdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFOERdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRTk0LCAweDBFOTcsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFOTksIDB4MEU5RiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEVBMSwgMHgwRUEzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFQTVdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFQTddID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRUFBLCAweDBFQUIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFQUQsIDB4MEVBRSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRUIwXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEVCMiwgMHgwRUIzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFQkRdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRUMwLCAweDBFQzQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBGNDAsIDB4MEY0NywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEY0OSwgMHgwRjY5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxMEEwLCAweDEwQzUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDEwRDAsIDB4MTBGNiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxMTAwXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MTEwMiwgMHgxMTAzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxMTA1LCAweDExMDcsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTEwOV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDExMEIsIDB4MTEwQywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MTEwRSwgMHgxMTEyLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExM0NdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExM0VdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExNDBdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExNENdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExNEVdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExNTBdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxMTU0LCAweDExNTUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTE1OV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDExNUYsIDB4MTE2MSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxMTYzXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxMTY1XSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxMTY3XSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxMTY5XSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MTE2RCwgMHgxMTZFLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxMTcyLCAweDExNzMsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTE3NV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTE5RV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTFBOF0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTFBQl0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDExQUUsIDB4MTFBRiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MTFCNywgMHgxMUI4LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDExQkFdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxMUJDLCAweDExQzIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTFFQl0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTFGMF0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MTFGOV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFFMDAsIDB4MUU5QiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUVBMCwgMHgxRUY5LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxRjAwLCAweDFGMTUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFGMTgsIDB4MUYxRCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUYyMCwgMHgxRjQ1LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxRjQ4LCAweDFGNEQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFGNTAsIDB4MUY1NywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxRjU5XSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxRjVCXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxRjVEXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUY1RiwgMHgxRjdELCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxRjgwLCAweDFGQjQsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFGQjYsIDB4MUZCQywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgxRkJFXSA9IE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUZDMiwgMHgxRkM0LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxRkM2LCAweDFGQ0MsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFGRDAsIDB4MUZEMywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUZENiwgMHgxRkRCLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgxRkUwLCAweDFGRUMsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDFGRjIsIDB4MUZGNCwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MUZGNiwgMHgxRkZDLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDIxMjZdID0gTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgyMTJBLCAweDIxMkIsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MjEyRV0gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDIxODAsIDB4MjE4MiwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MzA0MSwgMHgzMDk0LCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgzMEExLCAweDMwRkEsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDMxMDUsIDB4MzEyQywgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4QUMwMCwgMHhEN0EzLCBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUik7Ci0gICAgICAgIC8vIElkZW9ncmFwaGljCi0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHg0RTAwLCAweDlGQTUsIE5BTUVfU1RBUlRfT1JfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MzAwN10gPSBOQU1FX1NUQVJUX09SX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDMwMjEsIDB4MzAyOSwgTkFNRV9TVEFSVF9PUl9CT0RZX0NIQVIpOwotICAgICAgICAvLyBOYW1lQ2hhciA6Oj0gTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWycuJ10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWyctJ10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgLy8gQ29tYmluaW5nQ2hhciAKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDAzMDAsIDB4MDM0NSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDM2MCwgMHgwMzYxLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNDgzLCAweDA0ODYsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA1OTEsIDB4MDVBMSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDVBMywgMHgwNUI5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNUJCLCAweDA1QkQsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDVCRl0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA1QzEsIDB4MDVDMiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwNUM0XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDY0QiwgMHgwNjUyLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDA2NzBdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNkQ2LCAweDA2REMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2REQsIDB4MDZERiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDZFMCwgMHgwNkU0LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwNkU3LCAweDA2RTgsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2RUEsIDB4MDZFRCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDkwMSwgMHgwOTAzLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDA5M0NdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOTNFLCAweDA5NEMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDk0RF0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5NTEsIDB4MDk1NCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDk2MiwgMHgwOTYzLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOTgxLCAweDA5ODMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDlCQ10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDlCRV0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDlCRl0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5QzAsIDB4MDlDNCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDlDNywgMHgwOUM4LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOUNCLCAweDA5Q0QsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MDlEN10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5RTIsIDB4MDlFMywgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQTAyXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQTNDXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQTNFXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQTNGXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEE0MCwgMHgwQTQyLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTQ3LCAweDBBNDgsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBNEIsIDB4MEE0RCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEE3MCwgMHgwQTcxLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQTgxLCAweDBBODMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MEFCQ10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBBQkUsIDB4MEFDNSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEFDNywgMHgwQUM5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQUNCLCAweDBBQ0QsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCMDEsIDB4MEIwMywgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwQjNDXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEIzRSwgMHgwQjQzLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjQ3LCAweDBCNDgsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCNEIsIDB4MEI0RCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEI1NiwgMHgwQjU3LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQjgyLCAweDBCODMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCQkUsIDB4MEJDMiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEJDNiwgMHgwQkM4LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQkNBLCAweDBCQ0QsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MEJEN10gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDMDEsIDB4MEMwMywgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEMzRSwgMHgwQzQ0LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzQ2LCAweDBDNDgsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDNEEsIDB4MEM0RCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEM1NSwgMHgwQzU2LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzgyLCAweDBDODMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDQkUsIDB4MENDNCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MENDNiwgMHgwQ0M4LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQ0NBLCAweDBDQ0QsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDRDUsIDB4MENENiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEQwMiwgMHgwRDAzLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRDNFLCAweDBENDMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBENDYsIDB4MEQ0OCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEQ0QSwgMHgwRDRELCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBENTddID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBFMzFdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRTM0LCAweDBFM0EsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFNDcsIDB4MEU0RSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRUIxXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEVCNCwgMHgwRUI5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRUJCLCAweDBFQkMsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFQzgsIDB4MEVDRCwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEYxOCwgMHgwRjE5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGMzVdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGMzddID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGMzldID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGM0VdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGM0ZdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRjcxLCAweDBGODQsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBGODYsIDB4MEY4QiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEY5MCwgMHgwRjk1LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDBGOTddID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRjk5LCAweDBGQUQsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBGQjEsIDB4MEZCNywgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRkI5XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MjBEMCwgMHgyMERDLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIENIQVJBQ1RFUl9DT0RFU1sweDIwRTFdID0gTkFNRV9CT0RZX0NIQVI7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgzMDJBLCAweDMwMkYsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MzA5OV0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgQ0hBUkFDVEVSX0NPREVTWzB4MzA5QV0gPSBOQU1FX0JPRFlfQ0hBUjsKLSAgICAgICAgLy8gRGlnaXQgCi0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwMDMwLCAweDAwMzksIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA2NjAsIDB4MDY2OSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MDZGMCwgMHgwNkY5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwOTY2LCAweDA5NkYsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDA5RTYsIDB4MDlFRiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEE2NiwgMHgwQTZGLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQUU2LCAweDBBRUYsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBCNjYsIDB4MEI2RiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEJFNywgMHgwQkVGLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwQzY2LCAweDBDNkYsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBDRTYsIDB4MENFRiwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEQ2NiwgMHgwRDZGLCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgwRTUwLCAweDBFNTksIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDBFRDAsIDB4MEVEOSwgTkFNRV9CT0RZX0NIQVIpOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MEYyMCwgMHgwRjI5LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIC8vIEV4dGVuZGVyIAotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwMEI3XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwMkQwXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwMkQxXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwMzg3XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwNjQwXSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRTQ2XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgwRUM2XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBDSEFSQUNURVJfQ09ERVNbMHgzMDA1XSA9IE5BTUVfQk9EWV9DSEFSOwotICAgICAgICBBcnJheXMuZmlsbChDSEFSQUNURVJfQ09ERVMsIDB4MzAzMSwgMHgzMDM1LCBOQU1FX0JPRFlfQ0hBUik7Ci0gICAgICAgIEFycmF5cy5maWxsKENIQVJBQ1RFUl9DT0RFUywgMHgzMDlELCAweDMwOUUsIE5BTUVfQk9EWV9DSEFSKTsKLSAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUkFDVEVSX0NPREVTLCAweDMwRkMsIDB4MzBGRSwgTkFNRV9CT0RZX0NIQVIpOwotCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxDaGFyU2VxdWVuY2U+IHByZWZpeGVzRGVmaW5lZDsKLSAgICBwcml2YXRlIGZpbmFsIFdyaXRlciB3cml0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxDaGFyU2VxdWVuY2U+IGVsZW1lbnROYW1lczsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxDaGFyU2VxdWVuY2U+IGN1cnJlbnRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8Q2hhclNlcXVlbmNlPigpOwotICAgIAotICAgIGJvb2xlYW4gZWxlbWVudHNXcml0dGVuID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpbkVsZW1lbnQgPSBmYWxzZTsKLSAgICBib29sZWFuIHByb2xvZ1dyaXR0ZW4gPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgWG1sT3V0KGZpbmFsIFdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWVzID0gbmV3IFN0YWNrPENoYXJTZXF1ZW5jZT4oKTsKLSAgICAgICAgcHJlZml4ZXNEZWZpbmVkID0gbmV3IEFycmF5TGlzdDxDaGFyU2VxdWVuY2U+KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIGRvY3VtZW50IGJ5IHdyaXRpbmcgYSBwcm9sb2cuCi0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvcHRpb25hbC4KLSAgICAgKiBXaGVuIHdyaXRpbmcgYSBkb2N1bWVudCBmcmFnbWVudCwgaXQgc2hvdWxkIDxlbT5ub3Q8L2VtPiBiZSBjYWxsZWQuCi0gICAgICogQHRocm93cyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIAotICAgICAqIGlmIGNhbGxlZCBhZnRlciB0aGUgZmlyc3QgZWxlbWVudCBoYXMgYmVlbiB3cml0dGVuCi0gICAgICogb3Igb25jZSBhIHByb2xvZyBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVsZW1lbnRzV3JpdHRlbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24oIkRvY3VtZW50IGFscmVhZHkgc3RhcnRlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9sb2dXcml0dGVuKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiT25seSBvbmUgcHJvbG9nIGFsbG93ZWQiKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGUoIjw/eG1sIHZlcnNpb249JzEuMCc/PiIpOwotICAgICAgICBwcm9sb2dXcml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEludmFsaWRYbWxFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkIGZvciBhbiB4bWwgZWxlbWVudAotICAgICAqIEB0aHJvd3MgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbiAKLSAgICAgKiBpZiBjYWxsZWQgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQgaGFzIGJlZW4gY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbkVsZW1lbnQoZmluYWwgQ2hhclNlcXVlbmNlIGVsZW1lbnROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZWxlbWVudHNXcml0dGVuICYmIGVsZW1lbnROYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uKCJSb290IGVsZW1lbnQgYWxyZWFkeSBjbG9zZWQuIENhbm5vdCBvcGVuIG5ldyBlbGVtZW50LiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNWYWxpZE5hbWUoZWxlbWVudE5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFhtbEV4Y2VwdGlvbigiJyIgKyBlbGVtZW50TmFtZSArICInIGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnRzV3JpdHRlbiA9IHRydWU7Ci0gICAgICAgIGlmIChpbkVsZW1lbnQpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPicpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci53cml0ZSgnPCcpOwotICAgICAgICByYXdXcml0ZShlbGVtZW50TmFtZSk7Ci0gICAgICAgIGluRWxlbWVudCA9IHRydWU7Ci0gICAgICAgIGVsZW1lbnROYW1lcy5wdXNoKGVsZW1lbnROYW1lKTsKLSAgICAgICAgY3VycmVudEF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIGF0dHJpYnV0ZSBvZiBhbiBlbGVtZW50LgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYWxsb3dlZCBkaXJlY3RseSBhZnRlciB7QGxpbmsgI29wZW5FbGVtZW50KENoYXJTZXF1ZW5jZSl9Ci0gICAgICogb3Ige0BsaW5rICNhdHRyaWJ1dGV9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIEludmFsaWRYbWxFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkIGZvciBhbiB4bWwgYXR0cmlidXRlIAotICAgICAqIG9yIGlmIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuCi0gICAgICogQHRocm93cyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIGlmIGNhbGxlZCBhZnRlciB7QGxpbmsgI2NvbnRlbnR9IAotICAgICAqIG9yIHtAbGluayAjY2xvc2VFbGVtZW50KCl9IG9yIGJlZm9yZSBhbnkgY2FsbCB0byB7QGxpbmsgI29wZW5FbGVtZW50fQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZShDaGFyU2VxdWVuY2UgbmFtZSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZWxlbWVudE5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uKCJSb290IGVsZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uKCJDbG9zZSBjYWxsZWQgYmVmb3JlIGFuIGVsZW1lbnQgaGFzIGJlZW4gb3BlbmVkLiIpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkWG1sRXhjZXB0aW9uKCInIiArIG5hbWUgKyAiJyBpcyBub3QgYSB2YWxpZCBhdHRyaWJ1dGUgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluRWxlbWVudCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRYbWxFeGNlcHRpb24oIkF0dHJpYnV0ZXMgY2FuIG9ubHkgYmUgd3JpdHRlbiBpbiBlbGVtZW50cyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50QXR0cmlidXRlcy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRYbWxFeGNlcHRpb24oIkVhY2ggYXR0cmlidXRlIGNhbiBvbmx5IGJlIHdyaXR0ZW4gb25jZSIpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci53cml0ZSgnICcpOwotICAgICAgICByYXdXcml0ZShuYW1lKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCc9Jyk7Ci0gICAgICAgIHdyaXRlci53cml0ZSgnXCcnKTsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGVDb250ZW50KHZhbHVlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCdcJycpOwotICAgICAgICBjdXJyZW50QXR0cmlidXRlcy5hZGQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZUNvbnRlbnQoQ2hhclNlcXVlbmNlIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRXNjYXBlZChjb250ZW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgY29udGVudC4KLSAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlIENEQVRBLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50IHRvIHdyaXRlCi0gICAgICogQHRocm93cyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIAotICAgICAqIGlmIGNhbGxlZCBiZWZvcmUgYW55IGNhbGwgdG8ge0BsaW5rICNvcGVuRWxlbWVudH0gCi0gICAgICogb3IgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQgaGFzIGJlZW4gY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29udGVudChDaGFyU2VxdWVuY2UgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVsZW1lbnROYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50c1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiUm9vdCBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiQW4gZWxlbWVudCBtdXN0IGJlIG9wZW5lZCBiZWZvcmUgY29udGVudCBjYW4gYmUgd3JpdHRlbi4iKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW5FbGVtZW50KSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoJz4nKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZUJvZHlDb250ZW50KGNvbnRlbnQpOwotICAgICAgICBpbkVsZW1lbnQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQm9keUNvbnRlbnQoZmluYWwgQ2hhclNlcXVlbmNlIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRXNjYXBlZChjb250ZW50LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRXNjYXBlZChmaW5hbCBDaGFyU2VxdWVuY2UgY29udGVudCwgYm9vbGVhbiBpc0F0dHJpYnV0ZUNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxsZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoYXJhY3RlciA9IGNvbnRlbnQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZhbXA7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZsdDsiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09ICc+JykgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiJmd0OyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F0dHJpYnV0ZUNvbnRlbnQgJiYgY2hhcmFjdGVyID09ICdcJycpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZhcG9zOyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F0dHJpYnV0ZUNvbnRlbnQgJiYgY2hhcmFjdGVyID09ICdcIicpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZxdW90OyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc091dE9mUmFuZ2UoY2hhcmFjdGVyKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPycpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2hhcmFjdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRPZlJhbmdlKGZpbmFsIGNoYXIgY2hhcmFjdGVyKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gIUFMTE9XRURfQ0hBUkFDVEVSU1tjaGFyYWN0ZXJdOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgbGFzdCBlbGVtZW50IHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBPcGVyYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIAotICAgICAqIGlmIGNhbGxlZCBiZWZvcmUgYW55IGNhbGwgdG8ge0BsaW5rICNvcGVuRWxlbWVudH0gCi0gICAgICogb3IgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQgaGFzIGJlZW4gY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2VFbGVtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVsZW1lbnROYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50c1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiUm9vdCBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiQ2xvc2UgY2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGhhcyBiZWVuIG9wZW5lZC4iKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgZWxlbWVudE5hbWUgPSAoQ2hhclNlcXVlbmNlKSBlbGVtZW50TmFtZXMucG9wKCk7Ci0gICAgICAgIGlmIChpbkVsZW1lbnQpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgnLycpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCc+Jyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoJzwnKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgnLycpOwotICAgICAgICAgICAgcmF3V3JpdGUoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCc+Jyk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIGluRWxlbWVudCA9IGZhbHNlOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENsb3NlcyBhbGwgcGVuZGluZyBlbGVtZW50cy4KLSAgICAgKiBXaGVuIGFwcHJvcHJpYXRlLCByZXNvdXJjZXMgYXJlIGFsc28gZmx1c2hlZCBhbmQgY2xvc2VkLgotICAgICAqIE5vIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjYWxsZWQgdXBvbiBhIGRvY3VtZW50IHdob3NlCi0gICAgICogcm9vdCBlbGVtZW50IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgotICAgICAqIEB0aHJvd3MgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbiAKLSAgICAgKiBpZiBjYWxsZWQgYmVmb3JlIGFueSBjYWxsIHRvIHtAbGluayAjb3BlbkVsZW1lbnR9IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlRG9jdW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZWxlbWVudE5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50c1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbigiQ2xvc2UgY2FsbGVkIGJlZm9yZSBhbiBlbGVtZW50IGhhcyBiZWVuIG9wZW5lZC4iKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSghZWxlbWVudE5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY2xvc2VFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByYXdXcml0ZShmaW5hbCBDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHNlcXVlbmNlLmxlbmd0aCgpO2krKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaGFyQXQgPSBzZXF1ZW5jZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoY2hhckF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE5hbWUoZmluYWwgQ2hhclNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNlcXVlbmNlLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxsZW5ndGg7aSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoYXJhY3RlciA9IHNlcXVlbmNlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpPT0wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGNoYXJhY3RlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZUJvZHkoY2hhcmFjdGVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkTmFtZVN0YXJ0KGZpbmFsIGNoYXIgY2hhcmFjdGVyKSB7Ci0gICAgICAgIGZpbmFsIGJ5dGUgY29kZSA9IENIQVJBQ1RFUl9DT0RFU1tjaGFyYWN0ZXJdOwotICAgICAgICBmaW5hbCBib29sZWFuIHJlc3VsdCA9IChjb2RlICYgTkFNRV9TVEFSVF9NQVNLKSA+IDA7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkTmFtZUJvZHkoZmluYWwgY2hhciBjaGFyYWN0ZXIpIHsKLSAgICAgICAgZmluYWwgYnl0ZSBjb2RlID0gQ0hBUkFDVEVSX0NPREVTW2NoYXJhY3Rlcl07Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gKGNvZGUgJiBOQU1FX01BU0spID4gMDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoQ2hhclNlcXVlbmNlIGxvY2FsTmFtZSwgQ2hhclNlcXVlbmNlIHVyaSwgQ2hhclNlcXVlbmNlIHByZWZpeCwgQ2hhclNlcXVlbmNlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbmFtZSA9IHRvTmFtZShsb2NhbE5hbWUsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgYXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgdG9OYW1lKENoYXJTZXF1ZW5jZSBsb2NhbE5hbWUsIENoYXJTZXF1ZW5jZSB1cmksIENoYXJTZXF1ZW5jZSBwcmVmaXgpIHsKLSAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIG5hbWU7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlZml4KSB8fCB1cmkgPT0gbnVsbCB8fCAiIi5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgbmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5hbWUgPSBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbkVsZW1lbnQoQ2hhclNlcXVlbmNlIGxvY2FsTmFtZSwgQ2hhclNlcXVlbmNlIHVyaSwgQ2hhclNlcXVlbmNlIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIG5hbWUgPSB0b05hbWUobG9jYWxOYW1lLCB1cmksIHByZWZpeCk7Ci0gICAgICAgIG9wZW5FbGVtZW50KG5hbWUpOwotICAgICAgICBpZiAoIXByZWZpeGVzRGVmaW5lZC5jb250YWlucyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICBwcmVmaXhlc0RlZmluZWQuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyLmphdmEgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9TY3JpcHRDaGVja01haWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmY0ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tNYWlsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbC5jaGVjazsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5tYWlsLkhlYWRlcjsKLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5TaWV2ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuZXhjZXB0aW9uLlNpZXZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuTWFpbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5NYWlsVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUubWFpbC5TaWV2ZU1haWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmFkZHJlc3MuU2lldmVBZGRyZXNzQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLmFkZHJlc3MuUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQ2hlY2tzIHNjcmlwdCBleGVjdXRpb24gZm9yIGFuIGVtYWlsLiBUaGUgd3JhcHBlZCBlbWFpbCBpcyBzZXQgYnkgY2FsbGVkCi0gKiB7QGxpbmsgI3NldE1haWx9LiBBY3Rpb25zIGFyZSByZWNvcmRlZCBvbiB7QGxpbmsgI2V4ZWN1dGVkQWN0aW9uc30gYW5kIGNhbgotICogYmUgcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0RXhlY3V0ZWRBY3Rpb25zKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlciBpbXBsZW1lbnRzIE1haWxBZGFwdGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY3Rpb24+IGFjdGlvbnM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWN0aW9uPiBleGVjdXRlZEFjdGlvbnM7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2UgbWFpbCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlcigpIHsKLSAgICAgICAgYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwotICAgICAgICBleGVjdXRlZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB3cmFwcGVkIGVtYWlsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TWVzc2FnZTwvY29kZT4sIHBvc3NpYmx5IG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNYWlsKCkgewotICAgICAgICByZXR1cm4gbWFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3cmFwcGVkIGVtYWlsIGFuZCB7QGxpbmsgI3Jlc2V0fXMgdGhlIGFkYXB0ZXIgcmVhZHkgZm9yIGFub3RoZXIKLSAgICAgKiBleGVjdXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1haWwKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5NZXNzYWdlPC9jb2RlPiwgcG9zc2libHkgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1haWwoTWVzc2FnZSBtYWlsKSB7Ci0gICAgICAgIHRoaXMubWFpbCA9IG1haWw7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZEFjdGlvbiBhZGRzIGFuIEFjdGlvbiB0byB0aGUgTGlzdCBvZiBBY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCBieQotICAgICAqIHRoZSByZWNlaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQWN0aW9uKGZpbmFsIEFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgYWN0aW9ucy5hZGQoYWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZXhlY3V0ZUFjdGlvbnMuIEFwcGxpZXMgdGhlIEFjdGlvbnMgYWNjdW11bGF0ZWQgYnkgdGhlIHJlY2VpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVBY3Rpb25zKCkgdGhyb3dzIFNpZXZlRXhjZXB0aW9uIHsKLSAgICAgICAgZXhlY3V0ZWRBY3Rpb25zLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGVkQWN0aW9ucy5hZGRBbGwoYWN0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWN0aW9ucyBhY2N1bXVsYXRlZCB3aGVuIHtAbGluayAjZXhlY3V0ZWRBY3Rpb25zfSB3YXMgbGFzdAotICAgICAqIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBBY3Rpb259cywgbm90IG51bGwuIFRoaXMgbGlzdCBpcyBhCi0gICAgICogICAgICAgICBtb2RpZmlhYmxlIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBY3Rpb24+IGdldEV4ZWN1dGVkQWN0aW9ucygpIHsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxBY3Rpb24+KGV4ZWN1dGVkQWN0aW9ucyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldEFjdGlvbnMgYW5zd2VycyB0aGUgTGlzdCBvZiBBY3Rpb25zIGFjY3VtdWxhdGVkIGJ5IHRoZQotICAgICAqIHJlY2VpdmVyLiBJbXBsZW1lbnRhdGlvbnMgbWF5IGVsZWN0IHRvIHN1cHBseSBhbiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHtAbGluayBBY3Rpb259J3MsIG5vdCBudWxsLCBwb3NzaWJseQotICAgICAqICAgICAgICAgdW5tb2RpZmlhYmxlCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QWN0aW9uPiBnZXRBY3Rpb25zKCkgewotICAgICAgICBmaW5hbCBMaXN0PEFjdGlvbj4gcmVzdWx0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgZXhlY3V0ZWQgYW5kIGFjY3VtbGF0ZWQgYWN0aW9ucy4gQW4gaW5zdGFuY2UgbWF5IGJlIHNhZmVseSByZXVzZWQKLSAgICAgKiB0byBjaGVjayBhIHNjcmlwdCBvbmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZXhlY3V0ZWRBY3Rpb25zLmNsZWFyKCk7Ci0gICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGVhZGVyIGFuc3dlcnMgYSBMaXN0IG9mIGFsbCBvZiB0aGUgaGVhZGVycyBpbiB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aG9zZSBuYW1lIGlzIGVxdWFsIHRvIHRoZSBwYXNzZWQgbmFtZS4gSWYgbm8gaGVhZGVycyBhcmUgZm91bmQgYW4gZW1wdHkKLSAgICAgKiBMaXN0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiBub3QgbnVsbCwgcG9zc2libHkgZW1wdHkKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgIGlmIChtYWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbWFpbC5nZXRIZWFkZXIobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5cy5hc0xpc3QodmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWV2ZU1haWxFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGVhZGVyTmFtZXMgYW5zd2VycyBhIExpc3Qgb2YgYWxsIG9mIHRoZSBoZWFkZXJzIGluIHRoZQotICAgICAqIHJlY2VpdmVyLiBObyBkdXBsaWNhdGVzIGFyZSBhbGxvd2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4sIG5vdCBudWxsIHBvc3NpYmxlIGVtcHR5LCBwb3NzaWJsZQotICAgICAqICAgICAgICAgdW5tb2RpZmlhYmxlCi0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhlYWRlck5hbWVzKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgaWYgKG1haWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbiBlbiA9IG1haWwuZ2V0QWxsSGVhZGVycygpOyBlbgotICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBIZWFkZXIgaGVhZGVyID0gKEhlYWRlcikgZW4ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBoZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1ldGhvZCBnZXRNYXRjaGluZ0hlYWRlciBhbnN3ZXJzIGEgTGlzdCBvZiBhbGwgb2YgdGhlIGhlYWRlcnMgaW4gdGhlCi0gICAgICogcmVjZWl2ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUuIElmIG5vIGhlYWRlcnMgYXJlIGZvdW5kIGFuIGVtcHR5IExpc3QgaXMKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGdldEhlYWRlcihTdHJpbmcpIGluIHRoYXQgaXQgaWdub3JlcyBjYXNlIGFuZAotICAgICAqIHRoZSB3aGl0ZXNwYWNlIHByZWZpeGVzIGFuZCBzdWZmaXhlcyBvZiBhIGhlYWRlciBuYW1lIHdoZW4gcGVyZm9ybWluZyB0aGUKLSAgICAgKiBtYXRjaCwgYXMgcmVxdWlyZWQgYnkgUkZDIDMwMjguIFRodXMgIkZyb20iLCAiZnJvbSAiLCAiIEZyb20iIGFuZCAiIGZyb20gIgotICAgICAqIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4sIG5vdCBudWxsIHBvc3NpYmx5IGVtcHR5Ci0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoaW5nSGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgIGlmIChtYWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IE1haWxVdGlscy5nZXRNYXRjaGluZ0hlYWRlcih0aGlzLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRTaXplIGFuc3dlcnMgdGhlIHJlY2VpdmVyJ3MgbWVzc2FnZSBzaXplIGluIG9jdGV0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqIEB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICBpZiAobWFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1haWwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENvbnRlbnRUeXBlIHJldHVybnMgc3RyaW5nL21pbWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICogQHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAobWFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1haWwuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoU3RyaW5nIGhlYWRlck5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHBhcnNlQWRkcmVzc2VzKGhlYWRlck5hbWUsIG1haWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnRvIGFkZHJlc3Nlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZQotICAgICAqICAgICAgICAgICAgICAgIGhlYWRlciBuYW1lLCB0byBiZSBtYXRjaGVkIGNhc2UgaW5zZW5zaXRpdmVseQotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICAgICAgPGNvZGU+TWVzc2FnZTwvY29kZT4sIG5vdCBudWxsCi0gICAgICogQHJldHVybiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBhcnJheSwgbm90IG51bGwgcG9zc2libHkgZW1wdHkKLSAgICAgKiBAdGhyb3dzIFNpZXZlTWFpbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoZmluYWwgU3RyaW5nIGhlYWRlck5hbWUsCi0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBTaWV2ZU1haWxFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICBmaW5hbCBTaWV2ZUFkZHJlc3NCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2lldmVBZGRyZXNzQnVpbGRlcigpOwotCi0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVuID0gbWVzc2FnZS5nZXRBbGxIZWFkZXJzKCk7IGVuLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBlbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gaGVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXJOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFkZHJlc3NlcyhoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBBZGRyZXNzW10gcmVzdWx0cyA9IGJ1aWxkZXIuZ2V0QWRkcmVzc2VzKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Cb2R5VGV4dChTdHJpbmcgcGhyYXNlQ2FzZUluc2Vuc2l0aXZlKSB0aHJvd3MgU2lldmVNYWlsRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1haWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtYWlsLmdldENvbnRlbnQoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMocGhyYXNlQ2FzZUluc2Vuc2l0aXZlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZXZlTWFpbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lldmVNYWlsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTaWV2ZUNvbnRleHQgY29udGV4dCkge30KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tlci5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svU2NyaXB0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjZlYzc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL2NoZWNrL1NjcmlwdENoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWwuY2hlY2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgubWFpbC5NZXNzYWdpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLmV4Y2VwdGlvbi5TaWV2ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvbkZpbGVJbnRvOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uS2VlcDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5tYWlsLkFjdGlvblJlZGlyZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLm1haWwuQWN0aW9uUmVqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQ2hlY2tzIGEgPGNvZGU+c2lldmU8L2NvZGU+IHNjcmlwdCBieSBleGVjdXRpbmcgaXQgYWdhaW5zdCBhIGdpdmVuIG1haWwgYW5kCi0gKiByZXBvcnRpbmcgdGhlIHJlc3VsdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRDaGVja2VyIHsKLQotICAgIHByaXZhdGUgZmluYWwgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlciBhZGFwdGVyOwotCi0gICAgcHVibGljIFNjcmlwdENoZWNrZXIoKSB7Ci0gICAgICAgIGFkYXB0ZXIgPSBuZXcgU2NyaXB0Q2hlY2tNYWlsQWRhcHRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgPGNvZGU+c2lldmU8L2NvZGU+IHNjcmlwdCBjb250YWluZWQgaW4gdGhlIGdpdmVuIGZpbGUgYnkKLSAgICAgKiBleGVjdXRpbmcgaXQgYWdhaW5zdCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPkZpbGU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG1haWwgbWVzc2FnZSB0byBiZSBmZWQKLSAgICAgKiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0LCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBzY3JpcHQKLSAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5GaWxlPC9jb2RlPiBjb250YWluaW5nIHRoZSBzY3JpcHQgdG8gYmUgY2hlY2tlZAotICAgICAqIEByZXR1cm4gPGNvZGU+UmVzdWx0czwvY29kZT4gb2YgdGhhdCBleGVjdXRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFJlc3VsdHMgY2hlY2soZmluYWwgRmlsZSBtZXNzYWdlLCBmaW5hbCBGaWxlIHNjcmlwdCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRmlsZUlucHV0U3RyZWFtIG1lc3NhZ2VTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1lc3NhZ2UpOwotICAgICAgICBmaW5hbCBGaWxlSW5wdXRTdHJlYW0gc2NyaXB0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzY3JpcHQpOwotICAgICAgICBmaW5hbCBSZXN1bHRzIHJlc3VsdHMgPSBjaGVjayhtZXNzYWdlU3RyZWFtLCBzY3JpcHRTdHJlYW0pOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIDxjb2RlPnNpZXZlPC9jb2RlPiBzY3JpcHQgY29udGFpbmVkIGluIHRoZSBnaXZlbiBmaWxlIGJ5Ci0gICAgICogZXhlY3V0aW5nIGl0IGFnYWluc3QgdGhlIGdpdmVuIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNjcmlwdAotICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiwgbm90IG51bGwKLSAgICAgKiBAcmV0dXJuIDxjb2RlPlJlc3VsdHM8L2NvZGU+IG9mIHRoZSBjaGVjaywgbm90IG51bGwKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzdWx0cyBjaGVjayhmaW5hbCBJbnB1dFN0cmVhbSBtZXNzYWdlLCBmaW5hbCBJbnB1dFN0cmVhbSBzY3JpcHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1pbWVNZXNzYWdlIG1pbWVNZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKG51bGwsIG1lc3NhZ2UpOwotICAgICAgICBhZGFwdGVyLnNldE1haWwobWltZU1lc3NhZ2UpOwotICAgICAgICBSZXN1bHRzIHJlc3VsdHM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKS5idWlsZCgpLmludGVycHJldChhZGFwdGVyLCBzY3JpcHQpOwotICAgICAgICAgICAgZmluYWwgTGlzdCBleGVjdXRlZEFjdGlvbnMgPSBhZGFwdGVyLmdldEV4ZWN1dGVkQWN0aW9ucygpOwotICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBSZXN1bHRzKGV4ZWN1dGVkQWN0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXN1bHRzID0gbmV3IFJlc3VsdHMoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNpZXZlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXN1bHRzID0gbmV3IFJlc3VsdHMoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udGFpbnMgcmVzdWx0cyBvZiBzY3JpcHQgZXhlY3V0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVzdWx0cyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwYXNzOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3QgYWN0aW9uc0V4ZWN1dGVkOwotCi0gICAgICAgIHB1YmxpYyBSZXN1bHRzKGZpbmFsIEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleDsKLSAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGFjdGlvbnNFeGVjdXRlZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVzdWx0cyhmaW5hbCBMaXN0IGFjdGlvbnMpIHsKLSAgICAgICAgICAgIHRoaXMucGFzcyA9IHRydWU7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOwotICAgICAgICAgICAgdGhpcy5hY3Rpb25zRXhlY3V0ZWQgPSBhY3Rpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoaXMgYSBwYXNzPwotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzY3JpcHQgZXhlY3V0ZWQgd2l0aG91dCBlcnJvciwgZmFsc2UgaWYgZXJyb3JzCi0gICAgICAgICAqICAgICAgICAgd2VyZSBlbmNvdW50ZXJlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXNzKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhc3M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgZXhjZXB0aW9uIHdoaWNoIHdhcyB0aHJvd24gZHVyaW5nIGV4ZWN1dGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYWN0aW9ucyBleGVjdXRlZCBieSB0aGUgc2NyaXB0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiA8Y29kZT5MaXN0PC9jb2RlPiBvZiBhY3Rpb25zIG9yIG51bGwgaWYgdGhlIHNjcmlwdCBmYWlsZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldEFjdGlvbnNFeGVjdXRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb25zRXhlY3V0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSXMgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGEgPGNvZGU+RmlsZUludG88L2NvZGU+Ci0gICAgICAgICAqIHdpdGggZ2l2ZW4gZGVzdGluYXRpb24/Ci0gICAgICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiA8Y29kZT5TdHJpbmc8L2NvZGU+IGRlc3RpbmF0aW9uIGZvciB0aGUgZmlsZSBpbnRvCi0gICAgICAgICAqIEBwYXJhbSBuIGluZGV4IHRvIGNoZWNrCi0gICAgICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGlzIGEgPGNvZGU+RmlsZUludG88L2NvZGU+Ci0gICAgICAgICAqIHdpdGggZ2l2ZW4gZGVzdGluYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uRmlsZUludG8oU3RyaW5nIGRlc3RpbmF0aW9uLCBpbnQgbikgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIE9iamVjdCBhY3Rpb24gPSBhY3Rpb25zRXhlY3V0ZWQuZ2V0KG4pOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkZpbGVJbnRvKSB7Ci0gICAgICAgICAgICAgICAgQWN0aW9uRmlsZUludG8gYWN0aW9uRmlsZUludG8gPSAoQWN0aW9uRmlsZUludG8pIGFjdGlvbjsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXN0aW5hdGlvbi5lcXVhbHMoYWN0aW9uRmlsZUludG8uZ2V0RGVzdGluYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBhIDxjb2RlPlJlZGlyZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIGFkZHJlc3M/Ci0gICAgICAgICAqIEBwYXJhbSBhZGRyZXNzIDxjb2RlPlN0cmluZzwvY29kZT4gcmVkaXJlY3QgYWRkcmVzcwotICAgICAgICAgKiBAcGFyYW0gbiBpbmRleCB0byBjaGVjawotICAgICAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBpcyBhIDxjb2RlPlJlZGlyZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIHJlZGlyZWN0IGFkZHJlc3MKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uUmVkaXJlY3QoU3RyaW5nIGFkZHJlc3MsIGludCBuKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgT2JqZWN0IGFjdGlvbiA9IGFjdGlvbnNFeGVjdXRlZC5nZXQobik7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uUmVkaXJlY3QpIHsKLSAgICAgICAgICAgICAgICBBY3Rpb25SZWRpcmVjdCBhY3Rpb25SZWRpcmVjdCA9IChBY3Rpb25SZWRpcmVjdCkgYWN0aW9uOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFkZHJlc3MuZXF1YWxzKGFjdGlvblJlZGlyZWN0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElzIHRoZSA8Y29kZT5uPGNvZGU+J3RoIGFjdGlvbiBhIDxjb2RlPlJlamVjdDwvY29kZT4KLSAgICAgICAgICogd2l0aCBnaXZlbiBtZXNzYWdlPwotICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlamVjdGlvbiBtZXNzYWdlCi0gICAgICAgICAqIEBwYXJhbSBuIGluZGV4IHRvIGNoZWNrCi0gICAgICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIDxjb2RlPm48Y29kZT4ndGggYWN0aW9uIGlzIGEgPGNvZGU+UmVqZWN0PC9jb2RlPgotICAgICAgICAgKiB3aXRoIGdpdmVuIHJlamVjdCBtZXNzYWdlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvblJlamVjdChTdHJpbmcgbWVzc2FnZSwgaW50IG4pIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBPYmplY3QgYWN0aW9uID0gYWN0aW9uc0V4ZWN1dGVkLmdldChuKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24gaW5zdGFuY2VvZiBBY3Rpb25SZWplY3QpIHsKLSAgICAgICAgICAgICAgICBBY3Rpb25SZWplY3QgYWN0aW9uUmVqZWN0ID0gKEFjdGlvblJlamVjdCkgYWN0aW9uOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1lc3NhZ2UuZXF1YWxzKGFjdGlvblJlamVjdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJcyB0aGUgPGNvZGU+bjxjb2RlPid0aCBhY3Rpb24gYSA8Y29kZT5LZWVwPC9jb2RlPj8KLSAgICAgICAgICogQHBhcmFtIG4gaW5kZXggdG8gY2hlY2sKLSAgICAgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgPGNvZGU+bjxjb2RlPid0aCBhY3Rpb24gaXMgYSA8Y29kZT5LZWVwPC9jb2RlPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25LZWVwKGludCBuKSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgT2JqZWN0IGFjdGlvbiA9IGFjdGlvbnNFeGVjdXRlZC5nZXQobik7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uS2VlcCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByaW50cyBvdXQgZGV0YWlscyBvZiByZXN1bHRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXN1bHRzOiAiKTsKLSAgICAgICAgICAgIGlmIChwYXNzKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiUEFTUyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJGQUlMOiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJDYW5ub3QgcGFyc2Ugc2NyaXB0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJDYW5ub3QgZXhjdXRlIHNjcmlwdCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9wYWNrYWdlLmh0bWwgYi90cnVuay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9jaGVjay9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZGQ5NGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvY2hlY2svcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0KLQotICBAKCMpcGFja2FnZS5odG1sCi0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgIAotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAKLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgIAotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAKLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgIAotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgIAotLS0+Ci0KLTwvSEVBRD4KLTxCT0RZPgotCi08cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIDxjb2RlPlNjcmlwdENoZWNrTWFpbEFkYXB0ZXI8L2NvZGU+IAotTWFpbEFkYXB0ZXIgaW1wbGVtZW50YXRpb24uIFRoaXMgYWRhcHRlciB3cmFwcyBhIHN0YW5kYXJkIEphdmFNYWlsCi1tZXNzYWdlIGFuZCByZWNvcmRzIHRoZSBhY3Rpb25zIHRvIGJlIGV4ZWN1dGVkLgotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvcGFja2FnZS5odG1sIGIvdHJ1bmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTdlZjhiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tCi0KLSAgQCgjKXBhY2thZ2UuaHRtbAotCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIAotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgIAotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgIAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgIAotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAKLS0tPgotCi08L0hFQUQ+Ci08Qk9EWT4KLQotPHA+VXNlZnVsIHV0aWxpdGllcyBmb3IgU2lldmUuPC9wPgotPHA+VGhlIGdlbmVyYWwgZGVzaWduIGFwcHJvYWNoIGhhcyBiZWVuIHRvIGNyZWF0ZSBmaW5lbHkgZ3JhaW5lZCBmbGV4aWJsZSBQT0pPcywKLWFuZCB0aGVuIHVzZSBjb3Vyc2VseSBncmFpbmVkIHN0YXRpYyB1dGlsaXRpZXMgKDxjb2RlPlhZWlV0aWxzPC9jb2RlPikgdG8gb2ZmZXIgCi1hbiBlYXN5IGludGVyZmFjZSB0byByZWNvbW1lbmRlZCBkZWZhdWx0cy48L3A+Ci08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmIGIvdHJ1bmsvdXRpbC9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NjMTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9qYW1lcy1qc2lldmUtbG9nby5naWYgYi90cnVuay91dGlsL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtanNpZXZlLWxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdlMzRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9qYW1lcy1qc2lldmUtbG9nby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9zaXRlL3NpdGUueG1sIGIvdHJ1bmsvdXRpbC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3NDM2ZS4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQ0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAgIA0KLS0tPg0KLTxwcm9qZWN0IG5hbWU9ImpTaWV2ZSI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkpBTUVTIGpTaWV2ZTwvbmFtZT4KLSAgICA8c3JjPmltYWdlcy9qYW1lcy1qc2lldmUtbG9nby5naWY8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vamFtZXMuYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLQotICA8YmFubmVyUmlnaHQ+DQotICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4NCi0gICAgPHNyYz5pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWY8L3NyYz4NCi0gICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+DQotICA8L2Jhbm5lclJpZ2h0PiANCi0KLSAgPGJvZHk+Ci0KLSAgICA8bWVudSBuYW1lPSJTaWV2ZSBVdGlsaXRpZXMiPgotICAgICAgPGl0ZW0gbmFtZT0iT3ZlcnZpZXciIGhyZWY9ImluZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIAotICAgICAgICBuYW1lPSJET0FQIiAKLSAgICAgICAgaHJlZj0iZG9hcF9hcGFjaGUtanNpZXZlLnJkZiIgCi0gICAgICAgIGltZz0naHR0cDovL3d3dy53My5vcmcvUkRGL2ljb25zL3JkZl9tZXRhZGF0YV9idXR0b24uMzInLz4KLSAgICA8L21lbnU+Ci0gICAgCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIiAvPgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sIGIvdHJ1bmsvdXRpbC9zcmMvc2l0ZS94ZG9jL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OWUzMS4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIAotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgIAotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgIAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgIAotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgCi0tLT4KLTxkb2N1bWVudD4KLQotIDxwcm9wZXJ0aWVzPgotICA8dGl0bGU+T3ZlcnZpZXc8L3RpdGxlPgotICA8YXV0aG9yIGVtYWlsPSJqc2lldmUtZGV2QGpha2FydGEuYXBhY2hlLm9yZyI+alNpZXZlIFByb2plY3Q8L2F1dGhvcj4KLSA8L3Byb3BlcnRpZXM+Ci0KLTxib2R5PgotPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KLTxwPgotalNpZXZlIGlzIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2lldmUgbWFpbCBmaWx0ZXJpbmcgbGFuZ3VhZ2UgZGVmaW5lZCBieSAKLTxhIGhyZWY9J2h0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzMwMjgudHh0Jz5SRkMgMzAyODwvYT4uIGpTaWV2ZSBpcyBpbXBsZW1lbnRlZCAKLWFzIGEgbGFuZ3VhZ2UgcHJvY2Vzc29yIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byBhbnkgaW50ZXJuZXQgbWFpbCBhcHBsaWNhdGlvbiB0byBhZGQgCi1TaWV2ZSBzdXBwb3J0LgotPC9wPgotPHA+Ci1KU2lldmUgVXRpbGl0aWVzIGNvbGxlY3RzIGxpZ2h0d2VpZ2h0IGZyYW1ld29ya3MgYW5kIHV0aWxpdGllcyB1c2VmdWwgd2hlbgotd29ya2luZyB3aXRoIFNpZXZlIChpbiBnZW5lcmFsKSBhbmQgCi08YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9qc2lldmUnPkpTaWV2ZTwvYT4gKGluIHBhcnRpY3VsYXIpLgotPC9wPgotPHN1YnNlY3Rpb24gbmFtZT0nV2hhdCBpcyBTaWV2ZT8nPgotPHA+Ci1TaWV2ZSBpcyBhbiBleHRlbnNpYmxlIG1haWwgZmlsdGVyaW5nIGxhbmd1YWdlLiBJdCdzIGxpbWl0ZWQgZXhwcmVzc2l2ZW5lc3MgKG5vIGxvb3BzCi1vciB2YXJpYWJsZXMsIG5vIHRlc3RzIHdpdGggc2lkZSBlZmZlY3RzKSBhbGxvd3MgdXNlciBjcmVhdGVkIHNjcmlwdHMgdG8gYmUgcnVuIAotc2FmZWx5IG9uIGVtYWlsIHNlcnZlcnMuIFNpZXZlIGlzIHRhcmdldGVkIGF0IHRoZSBmaW5hbCBkZWxpdmVyeSBwaGFzZSAKLSh3aGVyZSBhbiBpbmNvbWluZyBlbWFpbCBpcyB0cmFuc2ZlcnJlZCB0byBhIHVzZXIncyBtYWlsYm94KS4KLTwvcD4KLTxwPgotU2lldmUgc2NyaXB0cyBhcmUgY29tcG9zZWQgb2YgY29tbWFuZHMuIENvbnRyb2wgY29tbWFuZHMgbWFuYWdlIHRoZSBleGVjdXRpb24gb2YgdGhlIHNjcmlwdC4KLVRlc3QgY29tbWFuZHMgZGVmaW5lIHNpZGUtZWZmZWN0IGZyZWUgY3JpdGVyaWEuIAotQWN0aW9uIGNvbW1hbmRzIGFyZSBtYWlsIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLgotPC9wPgotPC9zdWJzZWN0aW9uPgotPC9zZWN0aW9uPgotPHNlY3Rpb24gbmFtZT0nSGlnaGxpZ2h0cyc+Ci0gIDxzdWJzZWN0aW9uIG5hbWU9J1NjcmlwdCBDaGVja2VyJz4KLSAgICA8cD4KLSAgICAgIENoZWNrcyBTaWV2ZSBzY3JpcHRzLiBJbmNsdWRlcyBtb25pdG9yaW5nIGNvbnRyb2xsZWQgZXhlY3V0aW9uIG9mIGEgc2NyaXB0IGFnYWluc3QgYSBtZXNzYWdlLgotICAgIDwvcD4KLSAgPC9zdWJzZWN0aW9uPgotICA8c3Vic2VjdGlvbiBuYW1lPSdTaWV2ZSBJbiBYbWwnPgotICAgIDxwPgotICAgIDxhIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWZyZWVkLXNpZXZlLWluLXhtbC0wNCcgcmVsPSd0YWcnPlNpZXZlLWluLXhtbDwvYT4gaXMgYW4gCi0gICAgPGEgaHJlZj0naHR0cDovL2RicGVkaWEub3JnL3Jlc291cmNlL0ludGVybmV0X0RyYWZ0JyByZWw9J3RhZyc+SW50ZXJuZXQgRHJhZnQ8L2E+LgotICAgIEl0IGRlc2NyaWJlcyBhIG1ldGhvZCB0byBjb252ZXJ0IFNpZXZlIHNjcmlwdHMgdG8gYW5kIGZyb20gYW4gWE1MIGZvcm1hdCBzdWl0YWJsZQotICAgIGZvciBlZGl0aW5nIGJ5IGEgVUkuIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyBhcyB0aGUgcGF5bG9hZCBmb3IgYSB3ZWIgYmFzZWQgZWRpdG9yIGJhY2tlZCBieSB3ZWIgc2VydmljZXMuCi0gICAgPC9wPjxwPgotICAgIDxjb2RlPk91dHB1dFV0aWxzPC9jb2RlPiBjb250YWlucyBhbiBleHBlcmltZW50YWwgcHJldmlldyBvZiBhIHN1YnNldCBvZiB0aGlzIGRyYWZ0LiBJdCBhbGxvd3MgYSAKLSAgICBKU2lldmUgbm9kZSB0cmVlIHRvIGJlIG91dHB1dCBhcyBzaWV2ZS1pbi14bWwuIEZ1bGwgc3VwcG9ydCBpcyBwbGFubmVkIGJ1dCBmZWVkYmFjayBpcyAKLSAgICBlbmNvdXJhZ2VkLCB0aHJvdWdoIHRoZSA8YSBocmVmPSdodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9tYWlsLmh0bWwnPm1haWxpbmcgbGlzdHM8L2E+IAotICAgIG9yIHRoZSA8YSBocmVmPSdodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSlNJRVZFJz5pc3N1ZSB0cmFja2VyPC9hPi4KLSAgICA8L3A+Ci0gIDwvc3Vic2VjdGlvbj4KLTwvc2VjdGlvbj4KLTwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVG9TaWV2ZUFkYXB0ZXJUZXN0LmphdmEgYi90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ob2RlVG9TaWV2ZUFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWFlYmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvTm9kZVRvU2lldmVBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5OdW1iZXJBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5UYWdBcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGFyZ3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUYXJndW1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUYmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rjb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUY29tbWFuZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1RzdGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0cmluZ19saXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuQVNUdGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHRlc3RfbGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlNpZXZlUGFyc2VyVHJlZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLlNpbXBsZU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ub2tlbjsKLWltcG9ydCBvcmcuam1vY2suTW9jazsKLWltcG9ydCBvcmcuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTm9kZVRvU2lldmVBZGFwdGVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSB7Ci0KLSAgICBNb2NrIG1vY2s7Ci0gICAgTm9kZVRvU2lldmVBZGFwdGVyIHN1YmplY3Q7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbW9jayA9IG1vY2soU2lldmVIYW5kbGVyLmNsYXNzKTsKLSAgICAgICAgc3ViamVjdCA9IG5ldyBOb2RlVG9TaWV2ZUFkYXB0ZXIoKFNpZXZlSGFuZGxlciltb2NrLnByb3h5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3QgcHJvcGVyZ2F0ZWQKLSAgICAgICAgc3ViamVjdC5zdGFydCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdCBwcm9wZXJnYXRlZAotICAgICAgICBzdWJqZWN0LmVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRTaW1wbGVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdCBwcm9wZXJnYXRlZAotICAgICAgICBzdWJqZWN0LmVuZChuZXcgU2ltcGxlTm9kZShTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUQkxPQ0spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQVNUc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJlbmRTY3JpcHQiKTsKLSAgICAgICAgc3ViamVjdC5lbmQobmV3IEFTVHN0YXJ0KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRTVEFSVCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRBU1Rjb21tYW5kcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImVuZENvbW1hbmRzIik7Ci0gICAgICAgIHN1YmplY3QuZW5kKG5ldyBBU1Rjb21tYW5kcyhTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUQ09NTUFORFMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQVNUY29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZSA9ICJDb21tYW5kTmFtZSI7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kQ29tbWFuZCIpLndpdGgoZXEobmFtZSkpOwotICAgICAgICBBU1Rjb21tYW5kIG5vZGUgPSBuZXcgQVNUY29tbWFuZChTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUQ09NTUFORCk7Ci0gICAgICAgIG5vZGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgc3ViamVjdC5lbmQobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZEFTVGJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kQmxvY2siKTsKLSAgICAgICAgc3ViamVjdC5lbmQobmV3IEFTVGJsb2NrKFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRCTE9DSykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQVNUYXJndW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kQXJndW1lbnRzIik7Ci0gICAgICAgIHN1YmplY3QuZW5kKG5ldyBBU1Rhcmd1bWVudHMoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVEFSR1VNRU5UUykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QVNUYXJndW1lbnRUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRhZyA9ICJIdWdvIjsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJhcmd1bWVudCIpLndpdGgoZXEodGFnKSk7Ci0gICAgICAgIEFTVGFyZ3VtZW50IGFyZ3VtZW50ID0gbmV3IEFTVGFyZ3VtZW50KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRBUkdVTUVOVFMpOwotICAgICAgICBhcmd1bWVudC5zZXRWYWx1ZShuZXcgVGFnQXJndW1lbnQobmV3IFRva2VuKDAsIHRhZykpKTsKLSAgICAgICAgc3ViamVjdC5zdGFydChhcmd1bWVudCk7IAotICAgICAgICBzdWJqZWN0LmVuZChhcmd1bWVudCk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QVNUYXJndW1lbnROdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG51bWJlciA9IDE3OwotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImFyZ3VtZW50Iikud2l0aChlcShudW1iZXIpKTsKLSAgICAgICAgQVNUYXJndW1lbnQgYXJndW1lbnQgPSBuZXcgQVNUYXJndW1lbnQoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVEFSR1VNRU5UUyk7Ci0gICAgICAgIGFyZ3VtZW50LnNldFZhbHVlKG5ldyBOdW1iZXJBcmd1bWVudChuZXcgVG9rZW4oMCwgIjE3IikpKTsKLSAgICAgICAgc3ViamVjdC5zdGFydChhcmd1bWVudCk7IAotICAgICAgICBzdWJqZWN0LmVuZChhcmd1bWVudCk7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRBU1R0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkFUZXN0TmFtZSI7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kVGVzdCIpLndpdGgoZXEobmFtZSkpOwotICAgICAgICBBU1R0ZXN0IG5vZGUgPSBuZXcgQVNUdGVzdChTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUVEVTVCk7Ci0gICAgICAgIG5vZGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgc3ViamVjdC5lbmQobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZEFTVHRlc3RfbGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImVuZFRlc3RMaXN0Iik7Ci0gICAgICAgIHN1YmplY3QuZW5kKG5ldyBBU1R0ZXN0X2xpc3QoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVFRFU1RfTElTVCkpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQVNUc3RyaW5nX2xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJlbmRTdHJpbmdMaXN0QXJndW1lbnQiKTsKLSAgICAgICAgc3ViamVjdC5lbmQobmV3IEFTVHN0cmluZ19saXN0KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRTVFJJTkdfTElTVCkpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTaW1wbGVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdCBwcm9wZXJnYXRlZAotICAgICAgICBzdWJqZWN0LmVuZChuZXcgU2ltcGxlTm9kZShTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUQkxPQ0spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBU1RzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0U2NyaXB0Iik7Ci0gICAgICAgIHN1YmplY3Quc3RhcnQobmV3IEFTVHN0YXJ0KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRTVEFSVCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFTVGNvbW1hbmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRDb21tYW5kcyIpOwotICAgICAgICBzdWJqZWN0LnN0YXJ0KG5ldyBBU1Rjb21tYW5kcyhTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUQ09NTUFORFMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBU1Rjb21tYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkNvbW1hbmROYW1lIjsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydENvbW1hbmQiKS53aXRoKGVxKG5hbWUpKTsKLSAgICAgICAgQVNUY29tbWFuZCBub2RlID0gbmV3IEFTVGNvbW1hbmQoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVENPTU1BTkQpOwotICAgICAgICBub2RlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHN1YmplY3Quc3RhcnQobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0QVNUYmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydEJsb2NrIik7Ci0gICAgICAgIHN1YmplY3Quc3RhcnQobmV3IEFTVGJsb2NrKFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRCTE9DSykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBU1Rhcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydEFyZ3VtZW50cyIpOwotICAgICAgICBzdWJqZWN0LnN0YXJ0KG5ldyBBU1Rhcmd1bWVudHMoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVEFSR1VNRU5UUykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBU1R0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkFUZXN0TmFtZSI7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRUZXN0Iikud2l0aChlcShuYW1lKSk7Ci0gICAgICAgIEFTVHRlc3Qgbm9kZSA9IG5ldyBBU1R0ZXN0KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRURVNUKTsKLSAgICAgICAgbm9kZS5zZXROYW1lKG5hbWUpOwotICAgICAgICBzdWJqZWN0LnN0YXJ0KG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFTVHRlc3RfbGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0VGVzdExpc3QiKTsKLSAgICAgICAgc3ViamVjdC5zdGFydChuZXcgQVNUdGVzdF9saXN0KFNpZXZlUGFyc2VyVHJlZUNvbnN0YW50cy5KSlRURVNUX0xJU1QpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QVNUc3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmcgPSAiQSBWYWx1ZSI7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgibGlzdE1lbWJlciIpLndpdGgoZXEoc3RyaW5nKSk7Ci0gICAgICAgIEFTVHN0cmluZyBub2RlID0gbmV3IEFTVHN0cmluZyhTaWV2ZVBhcnNlclRyZWVDb25zdGFudHMuSkpUU1RSSU5HKTsKLSAgICAgICAgbm9kZS5zZXRWYWx1ZShzdHJpbmcpOwotICAgICAgICBzdWJqZWN0LnN0YXJ0KG5vZGUpOyAKLSAgICAgICAgc3ViamVjdC5lbmQobm9kZSk7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydEFTVHN0cmluZ19saXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRTdHJpbmdMaXN0QXJndW1lbnQiKTsKLSAgICAgICAgc3ViamVjdC5zdGFydChuZXcgQVNUc3RyaW5nX2xpc3QoU2lldmVQYXJzZXJUcmVlQ29uc3RhbnRzLkpKVFNUUklOR19MSVNUKSk7IAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2lldmVHZW5lcmF0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2lldmVHZW5lcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjcwZDZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1NpZXZlR2VuZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5hcGFjaGUuanNpZXZlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5Ob2RlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2lldmVHZW5lcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEdlbmVyYXRlU29sb1RvRW1haWxTY3JpcHRGcm9tTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaG91bGRSb3VuZHRyaXBTY3JpcHQoCi0gICAgICAgICAgICAgICAgImlmIGFkZHJlc3MgOmlzIDphbGwgW1widG9cIl0gW1wiY295b3RlQGRlc2VydC5leGFtcGxlLm9yZ1wiXSB7IgotICAgICAgICAgICAgICAgICsgImZpbGVpbnRvIFtcImNveW90ZVwiXTt9ICIKLSAgICAgICAgICAgICAgICArICJpZiBhZGRyZXNzIDppcyA6YWxsIFtcInRvXCJdIFtcImJ1Z3NAZXhhbXBsZS5vcmdcIl0geyIKLSAgICAgICAgICAgICAgICArICJmaWxlaW50byBbXCJidWdzXCJdO30gIgotICAgICAgICAgICAgICAgICsgImlmIGFkZHJlc3MgOmlzIDphbGwgW1widG9cIl0gW1wicm9hZHJ1bm5lcmFjbWUuQGV4YW1wbGUub3JnXCJdIHsiCi0gICAgICAgICAgICAgICAgKyAiZmlsZWludG8gW1wicnJcIl07fSAiCi0gICAgICAgICAgICAgICAgKyAiaWYgYWRkcmVzcyA6aXMgOmFsbCBbXCJ0b1wiXSBbXCJlbG1lckBodW50ZXJzLmV4YW1wbGUub3JnXCJdIHsiCi0gICAgICAgICAgICAgICAgKyAiZmlsZWludG8gW1wiZWxtZXJcIl07fSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkR2VuZXJhdGVTaW1wbGVTY3JpcHRGcm9tTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRTaG91bGRSb3VuZHRyaXBTY3JpcHQoImlmIGFkZHJlc3MgOmFsbCA6aXMgW1wiZnJvbVwiXSBbXCJ1c2VyQGRvbWFpblwiXSB7c3RvcDt9Iik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRHZW5lcmF0ZUZpbGVpbnRvRnJvbU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0U2hvdWxkUm91bmR0cmlwU2NyaXB0KCJmaWxlaW50byBbXCJJTkJPWC50ZXN0MVwiXTsgZmlsZWludG8gW1wiSU5CT1gudGVzdDFcIl07Iik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTaG91bGRSb3VuZHRyaXBTY3JpcHQoZmluYWwgU3RyaW5nIHNjcmlwdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCB1cAotICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKS5idWlsZCgpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgbW9uaXRvciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIE91dHB1dFV0aWxzLnRvU2lldmUobm9kZSwgbW9uaXRvcik7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNjcmlwdCwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1NpZXZlVG9YbWxOdWxsTmFtZVRlc3QuamF2YSBiL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1NpZXZlVG9YbWxOdWxsTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4MzAwNi4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZVRvWG1sTnVsbE5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IG9yZy5qbW9jay5Nb2NrOwotaW1wb3J0IG9yZy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTaWV2ZVRvWG1sTnVsbE5hbWVUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIHsKLQotICAgIFNpZXZlVG9YbWwgc3ViamVjdDsKLSAgICBNb2NrIG1vY2tPdXQ7Ci0gICAgU2lldmVIYW5kbGVyIGluc3RhbmNlOwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHN1YmplY3QgPSBuZXcgU2lldmVUb1htbCgpOwotICAgICAgICBzdWJqZWN0LnNldE5hbWVBdHRyaWJ1dGVOYW1lKG51bGwpOwotICAgICAgICBtb2NrT3V0ID0gbW9jayhTaWV2ZVRvWG1sLk91dC5jbGFzcyk7Ci0gICAgICAgIGluc3RhbmNlID0gc3ViamVjdC5idWlsZCgoU2lldmVUb1htbC5PdXQpIG1vY2tPdXQucHJveHkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RWxlbWVudElzT3V0cHV0KGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgib3BlbkVsZW1lbnQiKS53aXRoKGVxKGVsZW1lbnROYW1lKSwgCi0gICAgICAgICAgICAgICAgZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVTUEFDRSksIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9QUkVGSVgpKS5pZCgiMSIpOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNsb3NlRWxlbWVudCIpLmFmdGVyKCIxIik7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLnN0YXJ0Q29tbWFuZChjb21tYW5kTmFtZSkpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5lbmRDb21tYW5kKGNvbW1hbmROYW1lKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKFNpZXZlSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQnVpbGRlciBwYXR0ZXJuIHNvIGluc3RhbmNlIHNob3VsZCBiZSByZXR1cm5lZCIsIGluc3RhbmNlLCBoYW5kbGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkSXNOb3ROdWxsKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKGluc3RhbmNlKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250cm9sQ29tbWFuZFNob3VsZE91dHB1dEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RWxlbWVudElzT3V0cHV0KCJpZiIsIFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FX0NPTlRST0xfQ09NTUFORCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvbkNvbW1hbmRTaG91bGRPdXRwdXRFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVsZW1lbnRJc091dHB1dCgib3RoZXIiLCBTaWV2ZVRvWG1sLkRFRkFVTFRfTkFNRV9BQ1RJT05fQ09NTUFORCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U2hvdWxkT3V0cHV0RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdE5hbWUgPSAiaXMiOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoIm9wZW5FbGVtZW50Iikud2l0aChlcShTaWV2ZVRvWG1sLkRFRkFVTFRfTkFNRV9URVNUKSwgCi0gICAgICAgICAgICAgICAgZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVTUEFDRSksIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9QUkVGSVgpKS5pZCgiMSIpOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNsb3NlRWxlbWVudCIpLmFmdGVyKCIxIik7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLnN0YXJ0VGVzdCh0ZXN0TmFtZSkpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5lbmRUZXN0KHRlc3ROYW1lKSk7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZVRvWG1sVGVzdC5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2lldmVUb1htbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0YWVmMC4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaWV2ZVRvWG1sVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsOwotCi1pbXBvcnQgb3JnLmptb2NrLk1vY2s7Ci1pbXBvcnQgb3JnLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFNpZXZlVG9YbWxUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIHsKLQotICAgIFNpZXZlVG9YbWwgc3ViamVjdDsKLSAgICBNb2NrIG1vY2tPdXQ7Ci0gICAgU2lldmVIYW5kbGVyIGluc3RhbmNlOwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHN1YmplY3QgPSBuZXcgU2lldmVUb1htbCgpOwotICAgICAgICBtb2NrT3V0ID0gbW9jayhTaWV2ZVRvWG1sLk91dC5jbGFzcyk7Ci0gICAgICAgIGluc3RhbmNlID0gc3ViamVjdC5idWlsZCgoU2lldmVUb1htbC5PdXQpIG1vY2tPdXQucHJveHkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RWxlbWVudElzT3V0cHV0KGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgSGFsdFRyYXZlcnNhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgib3BlbkVsZW1lbnQiKS53aXRoKGVxKGVsZW1lbnROYW1lKSwgCi0gICAgICAgICAgICAgICAgZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVTUEFDRSksIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9QUkVGSVgpKS5pZCgiMSIpOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImF0dHJpYnV0ZSIpLndpdGgoZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVfQVRUUklCVVRFKSwgZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVTUEFDRSksIAotICAgICAgICAgICAgICAgIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9QUkVGSVgpLCBlcShjb21tYW5kTmFtZSkpLmlkKCIyIik7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiY2xvc2VFbGVtZW50IikuYWZ0ZXIoIjIiKTsKLSAgICAgICAgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoaW5zdGFuY2Uuc3RhcnRDb21tYW5kKGNvbW1hbmROYW1lKSk7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLmVuZENvbW1hbmQoY29tbWFuZE5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoU2lldmVIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCdWlsZGVyIHBhdHRlcm4gc28gaW5zdGFuY2Ugc2hvdWxkIGJlIHJldHVybmVkIiwgaW5zdGFuY2UsIGhhbmRsZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRJc05vdE51bGwoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFuY2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTY3JpcHRTaG91bGRCZUlnbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoaW5zdGFuY2Uuc3RhcnRTY3JpcHQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRTY3JpcHRTaG91bGRCZUlnbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoaW5zdGFuY2UuZW5kU2NyaXB0KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRCbG9ja1Nob3VsZEJlSWdub3JlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5zdGFydEJsb2NrKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQmxvY2tTaG91bGRCZUlnbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoaW5zdGFuY2UuZW5kQmxvY2soKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydENvbW1hbmRzU2hvdWxkQmVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLnN0YXJ0Q29tbWFuZHMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRDb21tYW5kc1Nob3VsZEJlSWdub3JlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5lbmRDb21tYW5kcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRyb2xDb21tYW5kU2hvdWxkT3V0cHV0RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFbGVtZW50SXNPdXRwdXQoImlmIiwgU2lldmVUb1htbC5ERUZBVUxUX05BTUVfQ09OVFJPTF9DT01NQU5EKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFbGVtZW50SXNPdXRwdXQoIm90aGVyIiwgU2lldmVUb1htbC5ERUZBVUxUX05BTUVfQUNUSU9OX0NPTU1BTkQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZ0FyZ3VtZW50ID0gIkEgU3RyaW5nIFRhZyI7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgib3BlbkVsZW1lbnQiKS53aXRoKGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FX1NUUklORyksIAotICAgICAgICAgICAgICAgIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FU1BBQ0UpLCBlcShTaWV2ZVRvWG1sLkRFRkFVTFRfUFJFRklYKSkuaWQoIjEiKTsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJjb250ZW50Iikud2l0aChlcShzdHJpbmdBcmd1bWVudCkpLmFmdGVyKCIxIikuaWQoIjIiKTsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJjbG9zZUVsZW1lbnQiKS5hZnRlcigiMiIpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5saXN0TWVtYmVyKHN0cmluZ0FyZ3VtZW50KSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1lcmljQXJndW1lbnQoKXRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbnVtYmVyID0gNDI7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgib3BlbkVsZW1lbnQiKS53aXRoKGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FX05VTSksIAotICAgICAgICAgICAgICAgIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FU1BBQ0UpLCBlcShTaWV2ZVRvWG1sLkRFRkFVTFRfUFJFRklYKSkuaWQoIjEiKTsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJjb250ZW50Iikud2l0aChlcShJbnRlZ2VyLnRvU3RyaW5nKG51bWJlcikpKS5hZnRlcigiMSIpLmlkKCIyIik7Ci0gICAgICAgIG1vY2tPdXQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiY2xvc2VFbGVtZW50IikuYWZ0ZXIoIjIiKTsKLSAgICAgICAgYXNzZXJ0QnVpbGRlcklzUmV0dXJuZWQoaW5zdGFuY2UuYXJndW1lbnQobnVtYmVyKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUYWdBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGFnID0gIkEgVGFnIjsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJvcGVuRWxlbWVudCIpLndpdGgoZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVfVEFHKSwgCi0gICAgICAgICAgICAgICAgZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVTUEFDRSksIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9QUkVGSVgpKS5pZCgiMSIpOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNvbnRlbnQiKS53aXRoKGVxKHRhZykpLmFmdGVyKCIxIikuaWQoIjIiKTsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJjbG9zZUVsZW1lbnQiKS5hZnRlcigiMiIpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5hcmd1bWVudCh0YWcpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0VGVzdExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJvcGVuRWxlbWVudCIpLndpdGgoZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVfTElTVCksIAotICAgICAgICAgICAgICAgIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FU1BBQ0UpLCBlcShTaWV2ZVRvWG1sLkRFRkFVTFRfUFJFRklYKSk7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLnN0YXJ0VGVzdExpc3QoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRUZXN0TGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNsb3NlRWxlbWVudCIpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5lbmRUZXN0TGlzdCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lID0gImlzIjsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJvcGVuRWxlbWVudCIpLndpdGgoZXEoU2lldmVUb1htbC5ERUZBVUxUX05BTUVfVEVTVCksIAotICAgICAgICAgICAgICAgIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FU1BBQ0UpLCBlcShTaWV2ZVRvWG1sLkRFRkFVTFRfUFJFRklYKSkuaWQoIjEiKTsKLSAgICAgICAgbW9ja091dC5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJhdHRyaWJ1dGUiKS53aXRoKGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FX0FUVFJJQlVURSksIGVxKFNpZXZlVG9YbWwuREVGQVVMVF9OQU1FU1BBQ0UpLCAKLSAgICAgICAgICAgICAgICBlcShTaWV2ZVRvWG1sLkRFRkFVTFRfUFJFRklYKSwgZXEodGVzdE5hbWUpKS5pZCgiMiIpOwotICAgICAgICBtb2NrT3V0LmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNsb3NlRWxlbWVudCIpLmFmdGVyKCIyIik7Ci0gICAgICAgIGFzc2VydEJ1aWxkZXJJc1JldHVybmVkKGluc3RhbmNlLnN0YXJ0VGVzdCh0ZXN0TmFtZSkpOwotICAgICAgICBhc3NlcnRCdWlsZGVySXNSZXR1cm5lZChpbnN0YW5jZS5lbmRUZXN0KHRlc3ROYW1lKSk7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaW1wbGVOb2RlVHJhdmVyc2VyVGVzdC5qYXZhIGIvdHJ1bmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvanNpZXZlL3V0aWwvU2ltcGxlTm9kZVRyYXZlcnNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwZTVjNC4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9TaW1wbGVOb2RlVHJhdmVyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGFyZ3VtZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVGNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qc2lldmUucGFyc2VyLmdlbmVyYXRlZC5BU1Rjb21tYW5kczsKLWltcG9ydCBvcmcuYXBhY2hlLmpzaWV2ZS5wYXJzZXIuZ2VuZXJhdGVkLkFTVHN0YXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuTm9kZTsKLWltcG9ydCBvcmcuam1vY2suTW9jazsKLWltcG9ydCBvcmcuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTm9kZVRyYXZlcnNlclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgewotCi0gICAgTW9jayBtb2NrOwotICAgIE5vZGVIYW5kbGVyIGhhbmRsZXI7Ci0gICAgCi0gICAgTm9kZVRyYXZlcnNlciBzdWJqZWN0OwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1vY2sgPSBtb2NrKE5vZGVIYW5kbGVyLmNsYXNzKTsKLSAgICAgICAgaGFuZGxlciA9IChOb2RlSGFuZGxlcikgbW9jay5wcm94eSgpOwotICAgICAgICAKLSAgICAgICAgc3ViamVjdCA9IG5ldyBOb2RlVHJhdmVyc2VyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYXZlcnNlU2ltcGxlU2NyaXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnQiKS5pZCgiMSIpOwotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0Iikud2l0aChpc0EoQVNUc3RhcnQuY2xhc3MpKS5hZnRlcigiMSIpLmlkKCIyIik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnQiKS53aXRoKGlzQShBU1Rjb21tYW5kcy5jbGFzcykpLmFmdGVyKCIyIikuaWQoIjMiKTsKLSAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydCIpLndpdGgoaXNBKEFTVGNvbW1hbmQuY2xhc3MpKS5hZnRlcigiMyIpLmlkKCI0Iik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnQiKS53aXRoKGlzQShBU1Rhcmd1bWVudHMuY2xhc3MpKS5hZnRlcigiNCIpLmlkKCI1Iik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kIikud2l0aChpc0EoQVNUYXJndW1lbnRzLmNsYXNzKSkuYWZ0ZXIoIjUiKS5pZCgiNiIpOwotICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImVuZCIpLndpdGgoaXNBKEFTVGNvbW1hbmQuY2xhc3MpKS5hZnRlcigiNiIpLmlkKCI3Iik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kIikud2l0aChpc0EoQVNUY29tbWFuZHMuY2xhc3MpKS5hZnRlcigiNyIpLmlkKCI4Iik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kIikud2l0aChpc0EoQVNUc3RhcnQuY2xhc3MpKS5hZnRlcigiOCIpLmlkKCI5Iik7Ci0gICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZW5kIikuYWZ0ZXIoIjkiKTsKLSAgICAgICAgdHJhdmVyc2UoIktlZXA7Iik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB0cmF2ZXJzZShTdHJpbmcgc2NyaXB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3ViamVjdC50cmF2ZXJzZShoYW5kbGVyLCBwYXJzZShzY3JpcHQpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE5vZGUgcGFyc2UoU3RyaW5nIHNjcmlwdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKS5idWlsZCgpLnBhcnNlKAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQuZ2V0Qnl0ZXMoKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1RvU2lldmVIYW5kbGVyRmFjdG9yeVRlc3QuamF2YSBiL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1RvU2lldmVIYW5kbGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkNWJkMy4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9Ub1NpZXZlSGFuZGxlckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qc2lldmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVG9TaWV2ZUhhbmRsZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFRvU2lldmVIYW5kbGVyRmFjdG9yeSBmYWN0b3J5OwotICAgIFN0cmluZ1dyaXRlciBtb25pdG9yOwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGZhY3RvcnkgPSBuZXcgVG9TaWV2ZUhhbmRsZXJGYWN0b3J5KCk7Ci0gICAgICAgIG1vbml0b3IgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZ3VyYXRpb25TaG91bGRCdWlsZE5vdE51bGxIYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmFjdG9yeS5idWlsZChtb25pdG9yKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFNjcmlwdFNob3VsZEJlSWdub3JlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXR1cAotICAgICAgICBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQobW9uaXRvcik7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLnN0YXJ0U2NyaXB0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kU2NyaXB0U2hvdWxkQmVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kU2NyaXB0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRCbG9ja1Nob3VsZE9wZW5CcmFja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuc3RhcnRCbG9jaygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiIHsiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQmxvY2tTaG91bGRDbG9zZUJyYWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5lbmRCbG9jaygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygifSIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydENvbW1hbmRzU2hvdWxkQmVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuc3RhcnRDb21tYW5kcygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZENvbW1hbmRzU2hvdWxkQmVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kQ29tbWFuZHMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydENvbW1hbmRTaG91bGRQcmludElkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgY29tbWFuZE5hbWUgPSAiU29tZUNvbW1hbmQiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5zdGFydENvbW1hbmQoY29tbWFuZE5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiU29tZUNvbW1hbmQiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kQ29tbWFuZFNob3VsZFByaW50Q29sb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgY29tbWFuZE5hbWUgPSAiU29tZUNvbW1hbmQiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5lbmRDb21tYW5kKGNvbW1hbmROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIjsiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBcmd1bWVudHNTaG91bGRCZUlnbm9yZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5zdGFydEFyZ3VtZW50cygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZEFyZ3VtZW50c1Nob3VsZEJlSWdub3JlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXR1cAotICAgICAgICBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQobW9uaXRvcik7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLmVuZEFyZ3VtZW50cygpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFyZ3VtZW50U2hvdWxkUHJpbnRUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgaWRlbnRpZmllciA9ICJBbklkZW50aWZpZXIiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5hcmd1bWVudChpZGVudGlmaWVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIiA6IiArIGlkZW50aWZpZXIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBcmd1bWVudFNob3VsZFByaW50TnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgaW50IG51bWJlciA9IDk5OwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5hcmd1bWVudChudW1iZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiICIgKyBJbnRlZ2VyLnRvU3RyaW5nKG51bWJlciksIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFN0cmluZ0xpc3RTaG91bGRPcGVuQnJhY2tldCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXR1cAotICAgICAgICBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQobW9uaXRvcik7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLnN0YXJ0U3RyaW5nTGlzdEFyZ3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIgWyIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRTdHJpbmdMaXN0U2hvdWxkQ2xvc2VCcmFja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kU3RyaW5nTGlzdEFyZ3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJdIiwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RNZW1iZXJTaG91bGRRdW90ZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXR1cAotICAgICAgICBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQobW9uaXRvcik7Ci0gICAgICAgIFN0cmluZyBtZW1iZXIgPSAiQSBMaXN0IE1lbWJlciI7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLmxpc3RNZW1iZXIobWVtYmVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoJyInICsgbWVtYmVyICsgJyInLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE1lbWJlclNob3VsZEVzY2FwZURvdWJsZVF1b3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJBIFByZWZpeCI7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSAiQSBTdWZmaXgiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5saXN0TWVtYmVyKHByZWZpeCArICciJyArIHN1ZmZpeCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCciJyArIHByZWZpeCArICJcXFwiIiArIHN1ZmZpeCArICciJywgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RNZW1iZXJTaG91bGRFc2NhcGVCYWNrU2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIkEgUHJlZml4IjsKLSAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICJBIFN1ZmZpeCI7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLmxpc3RNZW1iZXIocHJlZml4ICsgJ1xcJyArIHN1ZmZpeCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCciJyArIHByZWZpeCArICJcXFxcIiArIHN1ZmZpeCArICciJywgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RNZW1iZXJTaG91bGRFc2NhcGVDUigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXR1cAotICAgICAgICBTaWV2ZUhhbmRsZXIgaGFuZGxlciA9IGZhY3RvcnkuYnVpbGQobW9uaXRvcik7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiQSBQcmVmaXgiOwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gIkEgU3VmZml4IjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIubGlzdE1lbWJlcihwcmVmaXggKyAnXHInICsgc3VmZml4KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoJyInICsgcHJlZml4ICsgIlxcXHIiICsgc3VmZml4ICsgJyInLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE1lbWJlclNob3VsZEVzY2FwZUxGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJBIFByZWZpeCI7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSAiQSBTdWZmaXgiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5saXN0TWVtYmVyKHByZWZpeCArICdcZicgKyBzdWZmaXgpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygnIicgKyBwcmVmaXggKyAiXFxcZiIgKyBzdWZmaXggKyAnIicsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFRlc3RMaXN0U2hvdWxkT3BlbkJyYWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5zdGFydFRlc3RMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIoIiwgbW9uaXRvci50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVuZFRlc3RMaXN0U2hvdWxkQ2xvc2VCcmFja2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kVGVzdExpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIikiLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRUZXN0U2hvdWxkUHJpbnRJZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSAiQW5JZGVudGlmaWVyIjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0KGlkZW50aWZpZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiICIgKyBpZGVudGlmaWVyLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTZWNvbmRUZXN0U2hvdWxkUHJlZml4Q29tbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgZmlyc3RJZGVudGlmaWVyID0gIkZpcnN0SWRlbnRpZmllciI7Ci0gICAgICAgIFN0cmluZyBzZWNvbmRJZGVudGlmaWVyID0gIlNlY29uZElkZW50aWZpZXIiOwotICAgICAgICAKLSAgICAgICAgLy8gRXhlcmNpc2UKLSAgICAgICAgaGFuZGxlci5zdGFydFRlc3QoZmlyc3RJZGVudGlmaWVyKTsKLSAgICAgICAgaGFuZGxlci5lbmRUZXN0KGZpcnN0SWRlbnRpZmllcik7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0KHNlY29uZElkZW50aWZpZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiICIgK2ZpcnN0SWRlbnRpZmllciArICIsICIgKyBzZWNvbmRJZGVudGlmaWVyLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWZ0ZXJFbmRUZXN0TGlzdFNob3VsZE5vdE5leHRQcmVmaXhUZXN0V2l0aENvbW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIGZpcnN0SWRlbnRpZmllciA9ICJGaXJzdElkZW50aWZpZXIiOwotICAgICAgICBTdHJpbmcgc2Vjb25kSWRlbnRpZmllciA9ICJTZWNvbmRJZGVudGlmaWVyIjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0KGZpcnN0SWRlbnRpZmllcik7Ci0gICAgICAgIGhhbmRsZXIuZW5kVGVzdChmaXJzdElkZW50aWZpZXIpOwotICAgICAgICBoYW5kbGVyLmVuZFRlc3RMaXN0KCk7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRUZXN0TGlzdCgpOwotICAgICAgICBoYW5kbGVyLnN0YXJ0VGVzdChzZWNvbmRJZGVudGlmaWVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIiAiICsgZmlyc3RJZGVudGlmaWVyICsgIikoIiArIHNlY29uZElkZW50aWZpZXIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRUZXN0U2hvdWxkQmVJZ25vcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSAiQW5JZGVudGlmaWVyIjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kVGVzdChpZGVudGlmaWVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG1vbml0b3IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRDb21tYW5kU2hvdWxkTm90UHJpbnRTZW1pQ29sb25BZnRlckJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldHVwCi0gICAgICAgIFNpZXZlSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeS5idWlsZChtb25pdG9yKTsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmROYW1lID0gIlNvbWVDb21tYW5kIjsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIGhhbmRsZXIuZW5kQmxvY2soKTsKLSAgICAgICAgaGFuZGxlci5lbmRDb21tYW5kKGNvbW1hbmROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIn0iLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWZ0ZXJFbmRDb21tYW5kTmV4dFNob3VsZFByaW50U3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0dXAKLSAgICAgICAgU2lldmVIYW5kbGVyIGhhbmRsZXIgPSBmYWN0b3J5LmJ1aWxkKG1vbml0b3IpOwotICAgICAgICBTdHJpbmcgZmlyc3RDb21tYW5kTmFtZSA9ICJGaXJzdENvbW1hbmQiOwotICAgICAgICBTdHJpbmcgc2Vjb25kQ29tbWFuZE5hbWUgPSAiU2Vjb25kQ29tbWFuZCI7Ci0gICAgICAgIAotICAgICAgICAvLyBFeGVyY2lzZQotICAgICAgICBoYW5kbGVyLmVuZENvbW1hbmQoZmlyc3RDb21tYW5kTmFtZSk7Ci0gICAgICAgIGhhbmRsZXIuc3RhcnRDb21tYW5kKHNlY29uZENvbW1hbmROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeQotICAgICAgICBhc3NlcnRFcXVhbHMoIjsgIiArIHNlY29uZENvbW1hbmROYW1lLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1htbEdlbmVyYXRpb25UZXN0LmphdmEgYi90cnVuay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qc2lldmUvdXRpbC9YbWxHZW5lcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMwYWQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2pzaWV2ZS91dGlsL1htbEdlbmVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuYXBhY2hlLmpzaWV2ZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuanNpZXZlLnBhcnNlci5nZW5lcmF0ZWQuTm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFhtbEdlbmVyYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLy9AT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkR2VuZXJhdGVYbWxGcm9tU2ltcGxlU2NyaXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCB1cAotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0ID0gImlmIGFkZHJlc3MgOmFsbCA6aXMgXCJmcm9tXCIgXCJ1c2VyQGRvbWFpblwiIHtzdG9wO30iOwotICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoKS5idWlsZCgpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgbW9uaXRvciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEV4ZXJjaXNlCi0gICAgICAgIE91dHB1dFV0aWxzLnRvWG1sKG5vZGUsIG1vbml0b3IpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5Ci0gICAgICAgIGFzc2VydEVxdWFscygiPHNpZXZlOmNvbnRyb2wgeG1sbnM6c2lldmU9J3VybjppZXRmOnBhcmFtczp4bWw6bnM6c2lldmUnIHNpZXZlOm5hbWU9J2lmJz4iICsKLSAgICAgICAgICAgICAgICAiPHNpZXZlOnRlc3Qgc2lldmU6bmFtZT0nYWRkcmVzcyc+IiArCi0gICAgICAgICAgICAgICAgIjxzaWV2ZTp0YWc+YWxsPC9zaWV2ZTp0YWc+IiArCi0gICAgICAgICAgICAgICAgIjxzaWV2ZTp0YWc+aXM8L3NpZXZlOnRhZz4iICsKLSAgICAgICAgICAgICAgICAiPHNpZXZlOnN0cj5mcm9tPC9zaWV2ZTpzdHI+IiArCi0gICAgICAgICAgICAgICAgIjxzaWV2ZTpzdHI+dXNlckBkb21haW48L3NpZXZlOnN0cj4iICsKLSAgICAgICAgICAgICAgICAiPC9zaWV2ZTp0ZXN0PiIgKwotICAgICAgICAgICAgICAgICI8c2lldmU6Y29udHJvbCBzaWV2ZTpuYW1lPSdzdG9wJy8+IiArCi0gICAgICAgICAgICAgICAgIjwvc2lldmU6Y29udHJvbD4iLCBtb25pdG9yLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi90cnVuay91dGlsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI0ZDA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL3V0aWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgCi0jICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgCi0jICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgCi0jICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgCi0jICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgCi0jICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgCi0jICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgCi0jICB1bmRlciB0aGUgTGljZW5zZS4KLSMgICAKLSMgU2V0IHJvb3QgbG9nZ2VyIGxldmVsIHRvIERFQlVHIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBBMS4KLWxvZzRqLnJvb3RMb2dnZXI9REVCVUcsIEExCi0KLSMgQTEgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyLgotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBBMSB1c2VzIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JS00ciBbJXRdICUtNXAgJWMgJXggLSAlbSVuCmRpZmYgLS1naXQgYS90cnVuay91dGlsL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzIGIvdHJ1bmsvdXRpbC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9qc2lldmUvY29tbWFuZHNtYXAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiYTRhMS4uMDAwMDAwMAotLS0gYS90cnVuay91dGlsL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2pzaWV2ZS9jb21tYW5kc21hcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgIwotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgIwotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgIwotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgIwotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgIwotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgIwotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgIwotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgIwotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgIwotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgIwotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgIwotIyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pZj1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5JZgotZWxzZT1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5FbHNlCi1lbHNpZj1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5FbHNpZgotcmVxdWlyZT1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5SZXF1aXJlCi1zdG9wPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlN0b3AKLSMgUkZDMzA4MiAtIEltcGxlbWVudGF0aW9ucyBNVVNUIHN1cHBvcnQgdGhlc2UKLWtlZXA9b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMuS2VlcAotZGlzY2FyZD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5EaXNjYXJkCi1yZWRpcmVjdD1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5SZWRpcmVjdAotIyBSRkMzMDgyIC0gSW1wbGVtZW50YXRpb25zIFNIT1VMRCBzdXBwb3J0IHRoZXNlCi1yZWplY3Q9b3JnLmFwYWNoZS5qc2lldmUuY29tbWFuZHMub3B0aW9uYWwuUmVqZWN0Ci1maWxlaW50bz1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5vcHRpb25hbC5GaWxlSW50bwotIyBKVW5pdCBDb21tYW5kcyBmb3IgVGVzdGluZwotdGhyb3d0ZXN0ZXhjZXB0aW9uPW9yZy5hcGFjaGUuanNpZXZlLmNvbW1hbmRzLlRocm93VGVzdEV4Y2VwdGlvbgotIyBFeHRlbnNpb24gQ29tbWFuZHMKLWxvZz1vcmcuYXBhY2hlLmpzaWV2ZS5jb21tYW5kcy5leHRlbnNpb25zLkxvZwo=