ZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM1Y2E4Li4wMDAwMDAwCi0tLSBhL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNwotCi0gQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0KLSAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UsIHN1cHBsZW1lbnRlZCBieSB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBsaXN0ZWQgYmVsb3cuCi0KLSAgMC4gQWRkaXRpb25hbCBEZWZpbml0aW9ucy4KLQotICBBcyB1c2VkIGhlcmVpbiwgInRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSAiR05VIEdQTCIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gICJUaGUgTGlicmFyeSIgcmVmZXJzIHRvIGEgY292ZXJlZCB3b3JrIGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSwKLW90aGVyIHRoYW4gYW4gQXBwbGljYXRpb24gb3IgYSBDb21iaW5lZCBXb3JrIGFzIGRlZmluZWQgYmVsb3cuCi0KLSAgQW4gIkFwcGxpY2F0aW9uIiBpcyBhbnkgd29yayB0aGF0IG1ha2VzIHVzZSBvZiBhbiBpbnRlcmZhY2UgcHJvdmlkZWQKLWJ5IHRoZSBMaWJyYXJ5LCBidXQgd2hpY2ggaXMgbm90IG90aGVyd2lzZSBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLURlZmluaW5nIGEgc3ViY2xhc3Mgb2YgYSBjbGFzcyBkZWZpbmVkIGJ5IHRoZSBMaWJyYXJ5IGlzIGRlZW1lZCBhIG1vZGUKLW9mIHVzaW5nIGFuIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUgTGlicmFyeS4KLQotICBBICJDb21iaW5lZCBXb3JrIiBpcyBhIHdvcmsgcHJvZHVjZWQgYnkgY29tYmluaW5nIG9yIGxpbmtpbmcgYW4KLUFwcGxpY2F0aW9uIHdpdGggdGhlIExpYnJhcnkuICBUaGUgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5Ci13aXRoIHdoaWNoIHRoZSBDb21iaW5lZCBXb3JrIHdhcyBtYWRlIGlzIGFsc28gY2FsbGVkIHRoZSAiTGlua2VkCi1WZXJzaW9uIi4KLQotICBUaGUgIk1pbmltYWwgQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIENvbWJpbmVkIFdvcmsgbWVhbnMgdGhlCi1Db3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgdGhlIENvbWJpbmVkIFdvcmssIGV4Y2x1ZGluZyBhbnkgc291cmNlIGNvZGUKLWZvciBwb3J0aW9ucyBvZiB0aGUgQ29tYmluZWQgV29yayB0aGF0LCBjb25zaWRlcmVkIGluIGlzb2xhdGlvbiwgYXJlCi1iYXNlZCBvbiB0aGUgQXBwbGljYXRpb24sIGFuZCBub3Qgb24gdGhlIExpbmtlZCBWZXJzaW9uLgotCi0gIFRoZSAiQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbiBDb2RlIiBmb3IgYSBDb21iaW5lZCBXb3JrIG1lYW5zIHRoZQotb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlIGZvciB0aGUgQXBwbGljYXRpb24sIGluY2x1ZGluZyBhbnkgZGF0YQotYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvciByZXByb2R1Y2luZyB0aGUgQ29tYmluZWQgV29yayBmcm9tIHRoZQotQXBwbGljYXRpb24sIGJ1dCBleGNsdWRpbmcgdGhlIFN5c3RlbSBMaWJyYXJpZXMgb2YgdGhlIENvbWJpbmVkIFdvcmsuCi0KLSAgMS4gRXhjZXB0aW9uIHRvIFNlY3Rpb24gMyBvZiB0aGUgR05VIEdQTC4KLQotICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayB1bmRlciBzZWN0aW9ucyAzIGFuZCA0IG9mIHRoaXMgTGljZW5zZQotd2l0aG91dCBiZWluZyBib3VuZCBieSBzZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuCi0KLSAgMi4gQ29udmV5aW5nIE1vZGlmaWVkIFZlcnNpb25zLgotCi0gIElmIHlvdSBtb2RpZnkgYSBjb3B5IG9mIHRoZSBMaWJyYXJ5LCBhbmQsIGluIHlvdXIgbW9kaWZpY2F0aW9ucywgYQotZmFjaWxpdHkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBBcHBsaWNhdGlvbgotdGhhdCB1c2VzIHRoZSBmYWNpbGl0eSAob3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUKLWZhY2lsaXR5IGlzIGludm9rZWQpLCB0aGVuIHlvdSBtYXkgY29udmV5IGEgY29weSBvZiB0aGUgbW9kaWZpZWQKLXZlcnNpb246Ci0KLSAgIGEpIHVuZGVyIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCB5b3UgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvCi0gICBlbnN1cmUgdGhhdCwgaW4gdGhlIGV2ZW50IGFuIEFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSB0aGUKLSAgIGZ1bmN0aW9uIG9yIGRhdGEsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zCi0gICB3aGF0ZXZlciBwYXJ0IG9mIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bCwgb3IKLQotICAgYikgdW5kZXIgdGhlIEdOVSBHUEwsIHdpdGggbm9uZSBvZiB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvZgotICAgdGhpcyBMaWNlbnNlIGFwcGxpY2FibGUgdG8gdGhhdCBjb3B5LgotCi0gIDMuIE9iamVjdCBDb2RlIEluY29ycG9yYXRpbmcgTWF0ZXJpYWwgZnJvbSBMaWJyYXJ5IEhlYWRlciBGaWxlcy4KLQotICBUaGUgb2JqZWN0IGNvZGUgZm9ybSBvZiBhbiBBcHBsaWNhdGlvbiBtYXkgaW5jb3Jwb3JhdGUgbWF0ZXJpYWwgZnJvbQotYSBoZWFkZXIgZmlsZSB0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnkuICBZb3UgbWF5IGNvbnZleSBzdWNoIG9iamVjdAotY29kZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCwgaWYgdGhlIGluY29ycG9yYXRlZAotbWF0ZXJpYWwgaXMgbm90IGxpbWl0ZWQgdG8gbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEgc3RydWN0dXJlCi1sYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIG9yIHNtYWxsIG1hY3JvcywgaW5saW5lIGZ1bmN0aW9ucyBhbmQgdGVtcGxhdGVzCi0odGVuIG9yIGZld2VyIGxpbmVzIGluIGxlbmd0aCksIHlvdSBkbyBib3RoIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgIGEpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgb2JqZWN0IGNvZGUgdGhhdCB0aGUKLSAgIExpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUKLSAgIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICBiKSBBY2NvbXBhbnkgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UKLSAgIGRvY3VtZW50LgotCi0gIDQuIENvbWJpbmVkIFdvcmtzLgotCi0gIFlvdSBtYXkgY29udmV5IGEgQ29tYmluZWQgV29yayB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSB0aGF0LAotdGFrZW4gdG9nZXRoZXIsIGVmZmVjdGl2ZWx5IGRvIG5vdCByZXN0cmljdCBtb2RpZmljYXRpb24gb2YgdGhlCi1wb3J0aW9ucyBvZiB0aGUgTGlicmFyeSBjb250YWluZWQgaW4gdGhlIENvbWJpbmVkIFdvcmsgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLCBpZiB5b3UgYWxzbyBkbyBlYWNoIG9mCi10aGUgZm9sbG93aW5nOgotCi0gICBhKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIENvbWJpbmVkIFdvcmsgdGhhdAotICAgdGhlIExpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUKLSAgIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICBiKSBBY2NvbXBhbnkgdGhlIENvbWJpbmVkIFdvcmsgd2l0aCBhIGNvcHkgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMgbGljZW5zZQotICAgZG9jdW1lbnQuCi0KLSAgIGMpIEZvciBhIENvbWJpbmVkIFdvcmsgdGhhdCBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcyBkdXJpbmcKLSAgIGV4ZWN1dGlvbiwgaW5jbHVkZSB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcKLSAgIHRoZXNlIG5vdGljZXMsIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UgZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZQotICAgY29waWVzIG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQuCi0KLSAgIGQpIERvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgMCkgQ29udmV5IHRoZSBNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCi0gICAgICAgTGljZW5zZSwgYW5kIHRoZSBDb3JyZXNwb25kaW5nIEFwcGxpY2F0aW9uIENvZGUgaW4gYSBmb3JtCi0gICAgICAgc3VpdGFibGUgZm9yLCBhbmQgdW5kZXIgdGVybXMgdGhhdCBwZXJtaXQsIHRoZSB1c2VyIHRvCi0gICAgICAgcmVjb21iaW5lIG9yIHJlbGluayB0aGUgQXBwbGljYXRpb24gd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YKLSAgICAgICB0aGUgTGlua2VkIFZlcnNpb24gdG8gcHJvZHVjZSBhIG1vZGlmaWVkIENvbWJpbmVkIFdvcmssIGluIHRoZQotICAgICAgIG1hbm5lciBzcGVjaWZpZWQgYnkgc2VjdGlvbiA2IG9mIHRoZSBHTlUgR1BMIGZvciBjb252ZXlpbmcKLSAgICAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4KLQotICAgICAgIDEpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQotICAgICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoYSkgdXNlcyBhdCBydW4gdGltZQotICAgICAgIGEgY29weSBvZiB0aGUgTGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlcgotICAgICAgIHN5c3RlbSwgYW5kIChiKSB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24KLSAgICAgICBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIExpbmtlZAotICAgICAgIFZlcnNpb24uCi0KLSAgIGUpIFByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLCBidXQgb25seSBpZiB5b3Ugd291bGQgb3RoZXJ3aXNlCi0gICBiZSByZXF1aXJlZCB0byBwcm92aWRlIHN1Y2ggaW5mb3JtYXRpb24gdW5kZXIgc2VjdGlvbiA2IG9mIHRoZQotICAgR05VIEdQTCwgYW5kIG9ubHkgdG8gdGhlIGV4dGVudCB0aGF0IHN1Y2ggaW5mb3JtYXRpb24gaXMKLSAgIG5lY2Vzc2FyeSB0byBpbnN0YWxsIGFuZCBleGVjdXRlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUKLSAgIENvbWJpbmVkIFdvcmsgcHJvZHVjZWQgYnkgcmVjb21iaW5pbmcgb3IgcmVsaW5raW5nIHRoZQotICAgQXBwbGljYXRpb24gd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpbmtlZCBWZXJzaW9uLiAoSWYKLSAgIHlvdSB1c2Ugb3B0aW9uIDRkMCwgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBtdXN0IGFjY29tcGFueQotICAgdGhlIE1pbmltYWwgQ29ycmVzcG9uZGluZyBTb3VyY2UgYW5kIENvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24KLSAgIENvZGUuIElmIHlvdSB1c2Ugb3B0aW9uIDRkMSwgeW91IG11c3QgcHJvdmlkZSB0aGUgSW5zdGFsbGF0aW9uCi0gICBJbmZvcm1hdGlvbiBpbiB0aGUgbWFubmVyIHNwZWNpZmllZCBieSBzZWN0aW9uIDYgb2YgdGhlIEdOVSBHUEwKLSAgIGZvciBjb252ZXlpbmcgQ29ycmVzcG9uZGluZyBTb3VyY2UuKQotCi0gIDUuIENvbWJpbmVkIExpYnJhcmllcy4KLQotICBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUgYnkgc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyB0aGF0IGFyZSBub3QgQXBwbGljYXRpb25zIGFuZCBhcmUgbm90IGNvdmVyZWQgYnkgdGhpcwotTGljZW5zZSwgYW5kIGNvbnZleSBzdWNoIGEgY29tYmluZWQgbGlicmFyeSB1bmRlciB0ZXJtcyBvZiB5b3VyCi1jaG9pY2UsIGlmIHlvdSBkbyBib3RoIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrIGJhc2VkCi0gICBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMsCi0gICBjb252ZXllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSB0aGF0IHBhcnQgb2YgaXQKLSAgIGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcgd2hlcmUgdG8gZmluZCB0aGUKLSAgIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA2LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLSAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3Ci12ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkKLWRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLSAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZQotTGlicmFyeSBhcyB5b3UgcmVjZWl2ZWQgaXQgc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24KLW9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIgotYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBwdWJsaXNoZWQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbgotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBMaWJyYXJ5IGFzIHlvdQotcmVjZWl2ZWQgaXQgZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBHTlUgTGVzc2VyCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBvZiB0aGUgR05VIExlc3NlcgotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIElmIHRoZSBMaWJyYXJ5IGFzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUKLXdoZXRoZXIgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugc2hhbGwKLWFwcGx5LCB0aGF0IHByb3h5J3MgcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGFueSB2ZXJzaW9uIGlzCi1wZXJtYW5lbnQgYXV0aG9yaXphdGlvbiBmb3IgeW91IHRvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZQotTGlicmFyeS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhODFmYy4uMDAwMDAwMAotLS0gYS9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGpuZG4tbWFuYWdlbWVudAotCi1UaGlzIHByb2plY3QgY29uc2lzdHMgb2YgdG9vbHMgZm9yIG1hbmFnaW5nIGFuIE5ETiBmb3J3YXJkaW5nIGRhZW1vbiAoTkZEKS4gSXQgcmVsaWVzIG9uIHRoZSBbTkROIFByb3RvY29sXShodHRwczovL25hbWVkLWRhdGEubmV0KSBhbmQgaXRzIGFzc29jaWF0ZWQgW2NsaWVudCBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9qbmRuKS4gSXQgaW1wbGVtZW50cyB0aGUgTkZEIG1hbmFnZW1lbnQgc3BlY2lmaWNhdGlvbiBvdXRsaW5lZCBhdCBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9NYW5hZ2VtZW50LiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbGlicmFyeSBkb2VzIG5vdCB5ZXQgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbWFuZHMgaW4gdGhlIG1hbmFnZW1lbnQgc3BlY2lmaWNhdGlvbi4KLQotIyMgSW5zdGFsbAotV2l0aCBNYXZlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQT006Ci1gYGAKLTxkZXBlbmRlbmN5PgotICA8Z3JvdXBJZD5jb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5qbmRuLW1hbmFnZW1lbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPlJFTEVBU0U8L3ZlcnNpb24+IDwhLS0gb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIC0tPgotPC9kZXBlbmRlbmN5PgotYGBgCi0KLSMjIFVzZQotV2l0aCBhIEZhY2UgdGhhdCBoYXMgY29tbWFuZCBzaWduaW5nIGluZm9ybWF0aW9uIHNldCwgY2FsbCBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdGF0aWMgbWV0aG9kczoKLSAtIF9fTkZELnBpbmdMb2NhbChGYWNlIGZvcndhcmRlcilfXzogcGluZyBhIGxvY2FsIE5GRCB3aXRoIC9sb2NhbGhvc3QvbmZkIHRvIHZlcmlmeSBpZiBpdCBleGlzdHMuCi0gLSBfX05GRC5nZXRGYWNlTGlzdChGYWNlIGZvcndhcmRlcilfXzogcmV0cmlldmUgYWxsIGNvbm5lY3RlZCBmYWNlcy4KLSAtIF9fTkZELmdldEZpYkxpc3QoRmFjZSBmb3J3YXJkZXIpX186IHJldHJpZXZlIGFsbCBmb3J3YXJkaW5nIGVudHJpZXMgaW4gdGhlIEZvcndhcmRpbmcgSW5mb3JtYXRpb24gQmFzZSAoRklCKS4KLSAtIF9fTkZELmdldFJpYkxpc3QoRmFjZSBmb3J3YXJkZXIpX186IHJldHJpZXZlIGFsbCByb3V0aW5nIGVudHJpZXMgaW4gdGhlIFJvdXRpbmcgSW5mb3JtYXRpb24gQmFzZSAoUklCKS4KLSAtIF9fTkZELmNyZWF0ZUZhY2UoRmFjZSBmb3J3YXJkZXIsIFN0cmluZyB1cmkpX186IGNyZWF0ZSBhIG5ldyBmYWNlIG9uIHRoZSBORkQgb3BlbmVkIHRvIHRoZSBnaXZlbiBVUkkuCi0gLSBfX05GRC5yZWdpc3RlcihGYWNlIGZvcndhcmRlciwgLi4uKV9fOiBpbmNsdWRlcyBzZXZlcmFsIHNpbWlsYXIgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcgYSBuZXcgcm91dGUgb24gdGhlIE5GRC4KLSAtIF9fTkZELnVucmVnaXN0ZXIoRmFjZSBmb3J3YXJkZXIsIE5hbWUgcm91dGUpX186IHVucmVnaXN0ZXIgYSByb3V0ZSBieSBuYW1lLgotIC0gX19ORkQuc2V0U3RyYXRlZ3koRmFjZSBmb3J3YXJkZXIsIE5hbWUgcHJlZml4LCBOYW1lIHN0cmF0ZWd5KV9fOiBzZXQgdGhlIGZvcndhcmRpbmcgc3RyYXRlZ3kgZm9yIHRoZSBnaXZlbiBwcmVmaXguCi0KLSMjIExpY2Vuc2UKLUNvcHlyaWdodCCpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFtHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VdKGh0dHBzOi8vZ2l0aHViLmNvbS8wMW9yZy9qbmRuLW1hbmFnZW1lbnQvYmxvYi9tYXN0ZXIvTElDRU5TRSkgZm9yIG1vcmUgZGV0YWlscy4KZGlmZiAtLWdpdCBhL25iLWNvbmZpZ3VyYXRpb24ueG1sIGIvbmItY29uZmlndXJhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWVhNDAuLjAwMDAwMDAKLS0tIGEvbmItY29uZmlndXJhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3Qtc2hhcmVkLWNvbmZpZ3VyYXRpb24+Ci0gICAgPCEtLQotVGhpcyBmaWxlIGNvbnRhaW5zIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiB3cml0dGVuIGJ5IG1vZHVsZXMgaW4gdGhlIE5ldEJlYW5zIElERS4KLVRoZSBjb25maWd1cmF0aW9uIGlzIGludGVuZGVkIHRvIGJlIHNoYXJlZCBhbW9uZyBhbGwgdGhlIHVzZXJzIG9mIHByb2plY3QgYW5kCi10aGVyZWZvcmUgaXQgaXMgYXNzdW1lZCB0byBiZSBwYXJ0IG9mIHZlcnNpb24gY29udHJvbCBjaGVja291dC4KLVdpdGhvdXQgdGhpcyBjb25maWd1cmF0aW9uIHByZXNlbnQsIHNvbWUgZnVuY3Rpb25hbGl0eSBpbiB0aGUgSURFIG1heSBiZSBsaW1pdGVkIG9yIGZhaWwgYWx0b2dldGhlci4KLS0tPgotICAgIDxwcm9wZXJ0aWVzIHhtbG5zPSJodHRwOi8vd3d3Lm5ldGJlYW5zLm9yZy9ucy9tYXZlbi1wcm9wZXJ0aWVzLWRhdGEvMSI+Ci0gICAgICAgIDwhLS0KLVByb3BlcnRpZXMgdGhhdCBpbmZsdWVuY2UgdmFyaW91cyBwYXJ0cyBvZiB0aGUgSURFLCBlc3BlY2lhbGx5IGNvZGUgZm9ybWF0dGluZyBhbmQgdGhlIGxpa2UuIAotWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgc2luZ2xlIHByb3BlcnRpZXMsIGludG8gdGhlIHBvbS54bWwgZmlsZSBhbmQgdGhlIElERSB3aWxsIHBpY2sgdGhlbSB1cC4KLVRoYXQgd2F5IG11bHRpcGxlIHByb2plY3RzIGNhbiBzaGFyZSB0aGUgc2FtZSBzZXR0aW5ncyAodXNlZnVsIGZvciBmb3JtYXR0aW5nIHJ1bGVzIGZvciBleGFtcGxlKS4KLUFueSB2YWx1ZSBkZWZpbmVkIGhlcmUgd2lsbCBvdmVycmlkZSB0aGUgcG9tLnhtbCBmaWxlIHZhbHVlIGJ1dCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KLS0tPgotICAgICAgICA8bmV0YmVhbnMuaGludC5saWNlbnNlPmludGVsLWxpY2Vuc2UtbGdwbDwvbmV0YmVhbnMuaGludC5saWNlbnNlPgotICAgICAgICA8b3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC5Db2RlU3R5bGUudXNlZFByb2ZpbGU+cHJvamVjdDwvb3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC5Db2RlU3R5bGUudXNlZFByb2ZpbGU+Ci0gICAgICAgIDxvcmctbmV0YmVhbnMtbW9kdWxlcy1lZGl0b3ItaW5kZW50LkNvZGVTdHlsZS5wcm9qZWN0LnNwYWNlcy1wZXItdGFiPjI8L29yZy1uZXRiZWFucy1tb2R1bGVzLWVkaXRvci1pbmRlbnQuQ29kZVN0eWxlLnByb2plY3Quc3BhY2VzLXBlci10YWI+Ci0gICAgICAgIDxvcmctbmV0YmVhbnMtbW9kdWxlcy1lZGl0b3ItaW5kZW50LkNvZGVTdHlsZS5wcm9qZWN0LnRhYi1zaXplPjQ8L29yZy1uZXRiZWFucy1tb2R1bGVzLWVkaXRvci1pbmRlbnQuQ29kZVN0eWxlLnByb2plY3QudGFiLXNpemU+Ci0gICAgICAgIDxvcmctbmV0YmVhbnMtbW9kdWxlcy1lZGl0b3ItaW5kZW50LkNvZGVTdHlsZS5wcm9qZWN0LmluZGVudC1zaGlmdC13aWR0aD4yPC9vcmctbmV0YmVhbnMtbW9kdWxlcy1lZGl0b3ItaW5kZW50LkNvZGVTdHlsZS5wcm9qZWN0LmluZGVudC1zaGlmdC13aWR0aD4KLSAgICAgICAgPG9yZy1uZXRiZWFucy1tb2R1bGVzLWVkaXRvci1pbmRlbnQuQ29kZVN0eWxlLnByb2plY3QuZXhwYW5kLXRhYnM+dHJ1ZTwvb3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC5Db2RlU3R5bGUucHJvamVjdC5leHBhbmQtdGFicz4KLSAgICAgICAgPG9yZy1uZXRiZWFucy1tb2R1bGVzLWVkaXRvci1pbmRlbnQuQ29kZVN0eWxlLnByb2plY3QudGV4dC1saW1pdC13aWR0aD44MDwvb3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC5Db2RlU3R5bGUucHJvamVjdC50ZXh0LWxpbWl0LXdpZHRoPgotICAgICAgICA8b3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC5Db2RlU3R5bGUucHJvamVjdC50ZXh0LWxpbmUtd3JhcD5ub25lPC9vcmctbmV0YmVhbnMtbW9kdWxlcy1lZGl0b3ItaW5kZW50LkNvZGVTdHlsZS5wcm9qZWN0LnRleHQtbGluZS13cmFwPgotICAgICAgICA8b3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC50ZXh0LngtZm9ydHJhbi5Db2RlU3R5bGUucHJvamVjdC50ZXh0LWxpbWl0LXdpZHRoPjEzMjwvb3JnLW5ldGJlYW5zLW1vZHVsZXMtZWRpdG9yLWluZGVudC50ZXh0LngtZm9ydHJhbi5Db2RlU3R5bGUucHJvamVjdC50ZXh0LWxpbWl0LXdpZHRoPgotICAgIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdC1zaGFyZWQtY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY5ZDg3Li4wMDAwMDAwCi0tLSBhL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPmNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQ8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmpuZG4tbWFuYWdlbWVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MC45LjY8L3ZlcnNpb24+Ci0gIDxuYW1lPmpuZG4tbWFuYWdlbWVudDwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPlRvb2xzIGZvciBtYW5hZ2luZyBhbiBORE4gZm9yd2FyZGluZyBkYWVtb248L2Rlc2NyaXB0aW9uPgotICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS8wMW9yZy9qbmRuLW1hbmFnZW1lbnQ8L3VybD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPGxpY2Vuc2VzPgotICAgIDxsaWNlbnNlPgotICAgICAgPG5hbWU+TEdQTCB2MzwvbmFtZT4KLSAgICAgIDx1cmw+aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWw8L3VybD4KLSAgICA8L2xpY2Vuc2U+Ci0gIDwvbGljZW5zZXM+Ci0gIDxkZXZlbG9wZXJzPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5BbmRyZXcgQnJvd248L25hbWU+Ci0gICAgICA8dXJsPmh0dHA6Ly9naXRodWIuY29tL2FuZHJld3Nicm93bjwvdXJsPgotICAgIDwvZGV2ZWxvcGVyPgotICA8L2RldmVsb3BlcnM+Ci0gIDxzY20+Ci0gICAgPHVybD5odHRwczovL2dpdGh1Yi5jb20vMDFvcmcvam5kbi1tYW5hZ2VtZW50PC91cmw+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOmdpdDpnaXRAZ2l0aHViLmNvbTowMW9yZy9qbmRuLW1hbmFnZW1lbnQuZ2l0PC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpnaXQ6Z2l0QGdpdGh1Yi5jb206MDFvcmcvam5kbi1tYW5hZ2VtZW50LmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgPC9zY20+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgotICAgIDxtYXZlbi5jb21waWxlci5zb3VyY2U+MS43PC9tYXZlbi5jb21waWxlci5zb3VyY2U+Ci0gICAgPG1hdmVuLmNvbXBpbGVyLnRhcmdldD4xLjc8L21hdmVuLmNvbXBpbGVyLnRhcmdldD4KLSAgPC9wcm9wZXJ0aWVzPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bmV0Lm5hbWVkLWRhdGE8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qbmRuPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+UkVMRUFTRTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uaW50ZWwuam5kbi51dGlsczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpuZG4tdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj5SRUxFQVNFPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIHRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjQuMTA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLmludGVsLmpuZG4ubW9jazwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpuZG4tbW9jazwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPlJFTEVBU0U8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPHByb2ZpbGVzPgotICAgIDxwcm9maWxlPgotICAgICAgPGlkPm9zc3JoPC9pZD4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPCEtLSBPU1NSSC1kaXJlY3RlZCBwbHVnaW5zIChzZWUgaHR0cDovL2NlbnRyYWwuc29uYXR5cGUub3JnL3BhZ2VzL2FwYWNoZS1tYXZlbi5odG1sKSAtLT4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+amFyLW5vLWZvcms8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5leHVzLXN0YWdpbmctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS42LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxzZXJ2ZXJJZD5vc3NyaDwvc2VydmVySWQ+Ci0gICAgICAgICAgICAgIDxzdGFnaW5nUHJvZmlsZUlkPmE4MDEzN2RiMDEyMjNhPC9zdGFnaW5nUHJvZmlsZUlkPgotICAgICAgICAgICAgICA8bmV4dXNVcmw+aHR0cHM6Ly9vc3Muc29uYXR5cGUub3JnLzwvbmV4dXNVcmw+Ci0gICAgICAgICAgICAgIDxhdXRvUmVsZWFzZUFmdGVyQ2xvc2U+dHJ1ZTwvYXV0b1JlbGVhc2VBZnRlckNsb3NlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvRW5jb2RpbmdIZWxwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9FbmNvZGluZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDY1OGVlLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9FbmNvZGluZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5Db250cm9sUGFyYW1ldGVyczsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkZvcndhcmRpbmdGbGFnczsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLk5hbWU7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHY7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RGVjb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZFbmNvZGVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotCi0vKioKLSAqIFByb3ZpZGUgaGVscGVyIG1ldGhvZHMgdG8gY292ZXIgYXJlYXMgdG9vIHByb3RlY3RlZCBpbiBUbHYwXzFfMVdpcmVGb3JtYXQ7Ci0gKiB0aGlzIGNsYXNzIGNhbiBiZSBkZXByZWNhdGVkIGlmIFdpcmVGb3JtYXRzIGFsbG93IHBhc3NpbmcgaW4gYW4gZXhpc3RpbmcKLSAqIFRsdkVuY29kZXIvVGx2RGVjb2RlciAoY3VycmVudGx5IHRoZXNlIG1ldGhvZHMgYXJlIHByb3RlY3RlZCkuCi0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0hlbHBlciB7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciB0byBkZWNvZGUgbmFtZXMgc2luY2UgVGx2MF8xXzFXaXJlRm9ybWF0LmphdmEgdXNlcyBpdHMgb3duIGludGVybmFsLAotICAgKiBwcm90ZWN0ZWQgaW1wbGVtZW50YXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnB1dAotICAgKiBAcmV0dXJuCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmFtZSBkZWNvZGVOYW1lKEJ5dGVCdWZmZXIgaW5wdXQpIHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgVGx2RGVjb2RlciBkZWNvZGVyID0gbmV3IFRsdkRlY29kZXIoaW5wdXQpOwotICAgIHJldHVybiBkZWNvZGVOYW1lKGRlY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciB0byBkZWNvZGUgbmFtZXMgdXNpbmcgYW4gZXhpc3RpbmcgZGVjb2RpbmcgY29udGV4dDsgY291bGQgYmUgbWVyZ2VkCi0gICAqIHRvIFRsdjBfMV8xV2lyZUZvcm1hdC5qYXZhLgotICAgKgotICAgKiBAcGFyYW0gZGVjb2RlcgotICAgKiBAcmV0dXJuCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTmFtZSBkZWNvZGVOYW1lKFRsdkRlY29kZXIgZGVjb2RlcikgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBOYW1lIG5hbWUgPSBuZXcgTmFtZSgpOwotICAgIGludCBlbmRPZmZzZXQgPSBkZWNvZGVyLnJlYWROZXN0ZWRUbHZzU3RhcnQoVGx2Lk5hbWUpOwotICAgIHdoaWxlIChkZWNvZGVyLmdldE9mZnNldCgpIDwgZW5kT2Zmc2V0KSB7Ci0gICAgICBuYW1lLmFwcGVuZChuZXcgQmxvYihkZWNvZGVyLnJlYWRCbG9iVGx2KFRsdi5OYW1lQ29tcG9uZW50KSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIGRlY29kZXIuZmluaXNoTmVzdGVkVGx2cyhlbmRPZmZzZXQpOwotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciB0byBlbmNvZGUgbmFtZXMgc2luY2UgVGx2MF8xXzFXaXJlRm9ybWF0LmphdmEgdXNlcyBpdHMgb3duIGludGVybmFsLAotICAgKiBwcm90ZWN0ZWQgaW1wbGVtZW50YXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQmxvYiBlbmNvZGVOYW1lKE5hbWUgbmFtZSkgewotICAgIFRsdkVuY29kZXIgZW5jb2RlciA9IG5ldyBUbHZFbmNvZGVyKCk7Ci0gICAgZW5jb2RlTmFtZShuYW1lLCBlbmNvZGVyKTsKLSAgICByZXR1cm4gbmV3IEJsb2IoZW5jb2Rlci5nZXRPdXRwdXQoKSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciB0byBlbmNvZGUgbmFtZXMgdXNpbmcgYW4gZXhpc3RpbmcgZW5jb2RpbmcgY29udGV4dDsgY291bGQgYmUgbWVyZ2VkCi0gICAqIHRvIFRsdjBfMV8xV2lyZUZvcm1hdC5qYXZhLgotICAgKgotICAgKiBAcGFyYW0gbmFtZQotICAgKiBAcGFyYW0gZW5jb2RlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGVuY29kZU5hbWUoTmFtZSBuYW1lLCBUbHZFbmNvZGVyIGVuY29kZXIpIHsKLSAgICBpbnQgc2F2ZUxlbmd0aCA9IGVuY29kZXIuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IG5hbWUuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgIGVuY29kZXIud3JpdGVCbG9iVGx2KFRsdi5OYW1lQ29tcG9uZW50LCBuYW1lLmdldChpKS5nZXRWYWx1ZSgpLmJ1ZigpKTsKLSAgICB9Ci0gICAgZW5jb2Rlci53cml0ZVR5cGVBbmRMZW5ndGgoVGx2Lk5hbWUsIGVuY29kZXIuZ2V0TGVuZ3RoKCkgLSBzYXZlTGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgdG8gZW5jb2RlIGNvbnRyb2wgcGFyYW1ldGVycyB1c2luZyBhbiBleGlzdGluZyBlbmNvZGluZyBjb250ZXh0OwotICAgKiBjb3VsZCBiZSBtZXJnZWQgdG8gVGx2MF8xXzFXaXJlRm9ybWF0LmphdmEuCi0gICAqCi0gICAqIEBwYXJhbSBjb250cm9sUGFyYW1ldGVycwotICAgKiBAcGFyYW0gZW5jb2RlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGVuY29kZUNvbnRyb2xQYXJhbWV0ZXJzKENvbnRyb2xQYXJhbWV0ZXJzIGNvbnRyb2xQYXJhbWV0ZXJzLCBUbHZFbmNvZGVyIGVuY29kZXIpIHsKLSAgICBpbnQgc2F2ZUxlbmd0aCA9IGVuY29kZXIuZ2V0TGVuZ3RoKCk7Ci0KLSAgICAvLyBFbmNvZGUgYmFja3dhcmRzLgotICAgIGVuY29kZXIud3JpdGVPcHRpb25hbE5vbk5lZ2F0aXZlSW50ZWdlclRsdkZyb21Eb3VibGUoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0V4cGlyYXRpb25QZXJpb2QsCi0gICAgICAgICAgICBjb250cm9sUGFyYW1ldGVycy5nZXRFeHBpcmF0aW9uUGVyaW9kKCkpOwotCi0gICAgLy8gRW5jb2RlIHN0cmF0ZWd5Ci0gICAgaWYgKGNvbnRyb2xQYXJhbWV0ZXJzLmdldFN0cmF0ZWd5KCkuc2l6ZSgpICE9IDApIHsKLSAgICAgIGludCBzdHJhdGVneVNhdmVMZW5ndGggPSBlbmNvZGVyLmdldExlbmd0aCgpOwotICAgICAgZW5jb2RlTmFtZShjb250cm9sUGFyYW1ldGVycy5nZXRTdHJhdGVneSgpLCBlbmNvZGVyKTsKLSAgICAgIGVuY29kZXIud3JpdGVUeXBlQW5kTGVuZ3RoKFRsdi5Db250cm9sUGFyYW1ldGVyc19TdHJhdGVneSwKLSAgICAgICAgICAgICAgZW5jb2Rlci5nZXRMZW5ndGgoKSAtIHN0cmF0ZWd5U2F2ZUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gRW5jb2RlIEZvcndhcmRpbmdGbGFncwotICAgIGludCBmbGFncyA9IGNvbnRyb2xQYXJhbWV0ZXJzLmdldEZvcndhcmRpbmdGbGFncygpLmdldE5mZEZvcndhcmRpbmdGbGFncygpOwotICAgIGlmIChmbGFncyAhPSBuZXcgRm9yd2FyZGluZ0ZsYWdzKCkuZ2V0TmZkRm9yd2FyZGluZ0ZsYWdzKCkpIC8vIFRoZSBmbGFncyBhcmUgbm90IHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHsKLSAgICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0ZsYWdzLCBmbGFncyk7Ci0gICAgfQotCi0gICAgZW5jb2Rlci53cml0ZU9wdGlvbmFsTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19Db3N0LCBjb250cm9sUGFyYW1ldGVycy5nZXRDb3N0KCkpOwotICAgIGVuY29kZXIud3JpdGVPcHRpb25hbE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUbHYuQ29udHJvbFBhcmFtZXRlcnNfT3JpZ2luLCBjb250cm9sUGFyYW1ldGVycy5nZXRPcmlnaW4oKSk7Ci0gICAgZW5jb2Rlci53cml0ZU9wdGlvbmFsTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19Mb2NhbENvbnRyb2xGZWF0dXJlLAotICAgICAgICAgICAgY29udHJvbFBhcmFtZXRlcnMuZ2V0TG9jYWxDb250cm9sRmVhdHVyZSgpKTsKLQotICAgIC8vIEVuY29kZSBVUkkKLSAgICBpZiAoIWNvbnRyb2xQYXJhbWV0ZXJzLmdldFVyaSgpLmlzRW1wdHkoKSkgewotICAgICAgZW5jb2Rlci53cml0ZUJsb2JUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX1VyaSwKLSAgICAgICAgICAgICAgbmV3IEJsb2IoY29udHJvbFBhcmFtZXRlcnMuZ2V0VXJpKCkpLmJ1ZigpKTsKLSAgICB9Ci0KLSAgICBlbmNvZGVyLndyaXRlT3B0aW9uYWxOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0ZhY2VJZCwgY29udHJvbFBhcmFtZXRlcnMuZ2V0RmFjZUlkKCkpOwotCi0gICAgLy8gRW5jb2RlIG5hbWUKLSAgICBpZiAoY29udHJvbFBhcmFtZXRlcnMuZ2V0TmFtZSgpLnNpemUoKSAhPSAwKSB7Ci0gICAgICBlbmNvZGVOYW1lKGNvbnRyb2xQYXJhbWV0ZXJzLmdldE5hbWUoKSwgZW5jb2Rlcik7Ci0gICAgfQotCi0gICAgZW5jb2Rlci53cml0ZVR5cGVBbmRMZW5ndGgoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0NvbnRyb2xQYXJhbWV0ZXJzLCBlbmNvZGVyLmdldExlbmd0aCgpIC0gc2F2ZUxlbmd0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGExNWQxLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQ7Ci0KLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzLkNvbnRyb2xSZXNwb25zZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotCi0vKioKLSAqIFJlcHJlc2VudCBhIGZhaWx1cmUgdG8gY29ycmVjdGx5IG1hbmFnZSB0aGUgTkROIEZvcndhcmRpbmcgRGFlbW9uIChORkQpLgotICogSW5zcGVjdCB0aGlzIG9iamVjdCB3aXRoIGdldENhdXNlKCkgdG8gc2VlIHdoeSB0aGUgbWFuYWdlbWVudCBvcGVyYXRpb24KLSAqIGZhaWxlZC4KLSAqCi0gKiBAYXV0aG9yIEFuZHJldyBCcm93biA8YW5kcmV3LmJyb3duQGludGVsLmNvbT4KLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIE1hbmFnZW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gY2F1c2UKLSAgICovCi0gIHB1YmxpYyBNYW5hZ2VtZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW4gTkZEIHJlc3BvbnNlIHRvIGNyZWF0ZSBhIE1hbmFnZW1lbnRFeGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXJSZXNwb25zZQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE1hbmFnZW1lbnRFeGNlcHRpb24gZnJvbVJlc3BvbnNlKEJsb2IgZm9yd2FyZGVyUmVzcG9uc2UpIHsKLSAgICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgQ29udHJvbFJlc3BvbnNlKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJlc3BvbnNlLndpcmVEZWNvZGUoZm9yd2FyZGVyUmVzcG9uc2UuYnVmKCkpOwotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQWN0aW9uIGZhaWxlZCwgZm9yd2FyZGVyIHJldHVybmVkOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpICsgIiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzVGV4dCgpOwotICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgIH0gY2F0Y2ggKEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgTWFuYWdlbWVudEV4Y2VwdGlvbigiQWN0aW9uIGZhaWxlZCBhbmQgZm9yd2FyZGVyIHJlc3BvbnNlIHdhcyB1bnBhcnNlYWJsZS4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW4gTkZEIHJlc3BvbnNlIHRvIGNyZWF0ZSBhIE1hbmFnZW1lbnRFeGNlcHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXJSZXNwb25zZQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE1hbmFnZW1lbnRFeGNlcHRpb24gZnJvbVJlc3BvbnNlKENvbnRyb2xSZXNwb25zZSByZXNwb25zZSkgewotICAgIFN0cmluZyBtZXNzYWdlID0gIkFjdGlvbiBmYWlsZWQsIGZvcndhcmRlciByZXR1cm5lZDogIiArIHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSArICIgIiArIHJlc3BvbnNlLmdldFN0YXR1c1RleHQoKTsKLSAgICByZXR1cm4gbmV3IE1hbmFnZW1lbnRFeGNlcHRpb24obWVzc2FnZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9ORkQuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9ORkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5MTBiNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvTkZELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoKLSAqIGpuZG4tbWFuYWdlbWVudAotICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi0gKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotcGFja2FnZSBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50OwotCi1pbXBvcnQgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlcy5TdGF0dXNEYXRhc2V0OwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuQ29udHJvbFJlc3BvbnNlOwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuRmFjZVN0YXR1czsKLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzLkZpYkVudHJ5OwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuTG9jYWxDb250cm9sSGVhZGVyOwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuUmliRW50cnk7Ci1pbXBvcnQgY29tLmludGVsLmpuZG4udXRpbHMuU2ltcGxlQ2xpZW50OwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLnV0aWxzLlNlZ21lbnRlZENsaWVudDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uQ29udHJvbFBhcmFtZXRlcnM7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5EYXRhOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uRmFjZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkZvcndhcmRpbmdGbGFnczsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkludGVyZXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uc2VjdXJpdHkuU2VjdXJpdHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBORE4gZm9yd2FyZGVyIGRhZW1vbjsgc2VlCi0gKiBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9NYW5hZ2VtZW50IGZvciBleHBsYW5hdGlvbnMKLSAqIG9mIHRoZSB2YXJpb3VzIHByb3RvY29scyB1c2VkLgotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgTkZEIHsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgREVGQVVMVF9USU1FT1VUID0gMjAwMDsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT0tfU1RBVFVTID0gMjAwOwotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihORkQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAvKioKLSAgICogUGluZyBhIGZvcndhcmRlciBvbiBhbiBleGlzdGluZyBmYWNlIHRvIHZlcmlmeSB0aGF0IHRoZSBmb3J3YXJkZXIgaXMKLSAgICogd29ya2luZyBhbmQgcmVzcG9uZGluZyB0byByZXF1ZXN0czsgdGhpcyB2ZXJzaW9uIHNlbmRzIGEgZGlzY292ZXJ5IHBhY2tldAotICAgKiB0byAvbG9jYWxob3N0L25mZCB3aGljaCBzaG91bGQgYWx3YXlzIHJlc3BvbmQgaWYgdGhlIHJlcXVlc3RvciBpcyBvbiB0aGUKLSAgICogc2FtZSBtYWNoaW5lIGFzIHRoZSBORE4gZm9yd2FyZGluZyBkYWVtb24uCi0gICAqCi0gICAqIEBwYXJhbSBmYWNlCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwaW5nTG9jYWwoRmFjZSBmYWNlKSB7Ci0gICAgcmV0dXJuIHBpbmcoZmFjZSwgbmV3IE5hbWUoIi9sb2NhbGhvc3QvbmZkIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcXVlc3QgYSBuYW1lIG9uIGFuIGV4aXN0aW5nIGZhY2UgdG8gdmVyaWZ5IHRoZSBmb3J3YXJkZXIgaXMgd29ya2luZyBhbmQKLSAgICogcmVzcG9uZGluZyB0byByZXF1ZXN0cy4gTm90ZSB0aGF0IHRoZSBuYW1lIG11c3QgYmUgc2VydmVkIG9yIGNhY2hlZCBvbiB0aGUKLSAgICogZm9yd2FyZGVyIGZvciB0aGlzIHRvIHJldHVybiB0cnVlLgotICAgKgotICAgKiBAcGFyYW0gZmFjZQotICAgKiBAcGFyYW0gbmFtZQotICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGluZyhGYWNlIGZhY2UsIE5hbWUgbmFtZSkgewotICAgIC8vIGJ1aWxkIGludGVyZXN0Ci0gICAgSW50ZXJlc3QgaW50ZXJlc3QgPSBuZXcgSW50ZXJlc3QobmFtZSk7Ci0gICAgaW50ZXJlc3Quc2V0SW50ZXJlc3RMaWZldGltZU1pbGxpc2Vjb25kcyhERUZBVUxUX1RJTUVPVVQpOwotICAgIGludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOwotCi0gICAgLy8gc2VuZCBwYWNrZXQKLSAgICB0cnkgewotICAgICAgRGF0YSBkYXRhID0gU2ltcGxlQ2xpZW50LmdldERlZmF1bHQoKS5nZXRTeW5jKGZhY2UsIGludGVyZXN0KTsKLSAgICAgIHJldHVybiBkYXRhICE9IG51bGw7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgZmFjZXMgYW5kIHRoZWlyIHN0YXR1cyBmcm9tIHRoZSBnaXZlbiBmb3J3YXJkZXI7IGNhbGxzCi0gICAqIC9sb2NhbGhvc3QvbmZkL2ZhY2VzL2xpc3Qgd2hpY2ggcmVxdWlyZXMgYSBsb2NhbCBGYWNlIChhbGwgbm9uLWxvY2FsCi0gICAqIHBhY2tldHMgYXJlIGRyb3BwZWQpCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3Q8RmFjZVN0YXR1cz4gZ2V0RmFjZUxpc3QoRmFjZSBmb3J3YXJkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgIERhdGEgZGF0YSA9IHJldHJpZXZlRGF0YVNldChmb3J3YXJkZXIsIG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcy9saXN0IikpOwotICAgIHJldHVybiBTdGF0dXNEYXRhc2V0LndpcmVEZWNvZGUoZGF0YS5nZXRDb250ZW50KCksIEZhY2VTdGF0dXMuY2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlIGEgbGlzdCBvZiBGSUIgZW50cmllcyBhbmQgdGhlaXIgTmV4dEhvcFJlY29yZHMgZnJvbSB0aGUgZ2l2ZW4KLSAgICogZm9yd2FyZGVyOyBjYWxscyAvbG9jYWxob3N0L25mZC9maWIvbGlzdCB3aGljaCByZXF1aXJlcyBhIGxvY2FsIEZhY2UgKGFsbAotICAgKiBub24tbG9jYWwgcGFja2V0cyBhcmUgZHJvcHBlZCkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3Q8RmliRW50cnk+IGdldEZpYkxpc3QoRmFjZSBmb3J3YXJkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgIERhdGEgZGF0YSA9IHJldHJpZXZlRGF0YVNldChmb3J3YXJkZXIsIG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9maWIvbGlzdCIpKTsKLSAgICByZXR1cm4gU3RhdHVzRGF0YXNldC53aXJlRGVjb2RlKGRhdGEuZ2V0Q29udGVudCgpLCBGaWJFbnRyeS5jbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmUgYSBsaXN0IG9mIHJvdXRpbmcgZW50cmllcyBmcm9tIHRoZSBSSUI7IGNhbGxzCi0gICAqIC9sb2NhbGhvc3QvbmZkL3JpYi9saXN0IHdoaWNoIHJlcXVpcmVzIGEgbG9jYWwgRmFjZSAoYWxsIG5vbi1sb2NhbCBwYWNrZXRzCi0gICAqIGFyZSBkcm9wcGVkKS4KLSAgICoKLSAgICogQHBhcmFtIGZvcndhcmRlciBPbmx5IGEgbG9jYWxob3N0IEZhY2UKLSAgICogQHJldHVybgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdDxSaWJFbnRyeT4gZ2V0Um91dGVMaXN0KEZhY2UgZm9yd2FyZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEYXRhIGRhdGEgPSByZXRyaWV2ZURhdGFTZXQoZm9yd2FyZGVyLCBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL2xpc3QiKSk7Ci0gICAgcmV0dXJuIFN0YXR1c0RhdGFzZXQud2lyZURlY29kZShkYXRhLmdldENvbnRlbnQoKSwgUmliRW50cnkuY2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgdG8gcmVnaXN0ZXIgYSBuZXcgZmFjZSBvbiB0aGUgZm9yd2FyZGVyOyBhcyBtZW50aW9uZWQgYXQKLSAgICogaHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9ORkQvY3VycmVudC9tYW5wYWdlcy9uZmRjLmh0bWwsIHRoaXMgaXMgbW9yZSBmb3IKLSAgICogZGVidWdnaW5nOyB1c2UgJ3JlZ2lzdGVyJyBpbnN0ZWFkCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlCi0gICAqIEBwYXJhbSBmYWNlSWQKLSAgICogQHBhcmFtIHByZWZpeAotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGROZXh0SG9wKEZhY2UgZm9yd2FyZGVyLCBpbnQgZmFjZUlkLCBOYW1lIHByZWZpeCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gYnVpbGQgY29tbWFuZCBuYW1lCi0gICAgTmFtZSBjb21tYW5kID0gbmV3IE5hbWUoIi9sb2NhbGhvc3QvbmZkL2ZpYi9hZGQtbmV4dGhvcCIpOwotICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgQ29udHJvbFBhcmFtZXRlcnMoKTsKLSAgICBwYXJhbWV0ZXJzLnNldE5hbWUocHJlZml4KTsKLSAgICBwYXJhbWV0ZXJzLnNldEZhY2VJZChmYWNlSWQpOwotICAgIGNvbW1hbmQuYXBwZW5kKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKLQotICAgIC8vIHNlbmQgdGhlIGludGVyZXN0Ci0gICAgc2VuZENvbW1hbmQoZm9yd2FyZGVyLCBuZXcgSW50ZXJlc3QoY29tbWFuZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBmYWNlIG9uIHRoZSBnaXZlbiBmb3J3YXJkZXIuIEVuc3VyZSB0aGUgZm9yd2FyZGluZyBmYWNlIGlzIG9uCi0gICAqIHRoZSBsb2NhbCBtYWNoaW5lIChtYW5hZ2VtZW50IHJlcXVlc3RzIGFyZSB0byAvbG9jYWxob3N0Ly4uLikgYW5kIHRoYXQKLSAgICogY29tbWFuZCBzaWduaW5nIGhhcyBiZWVuIHNldCB1cCAoZS5nLiBmb3J3YXJkZXIuc2V0Q29tbWFuZFNpZ25pbmdJbmZvKCkpLgotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyIE9ubHkgYSBsb2NhbGhvc3QgRmFjZQotICAgKiBAcGFyYW0gdXJpCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjcmVhdGVGYWNlKEZhY2UgZm9yd2FyZGVyLCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBOYW1lIGNvbW1hbmQgPSBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvY3JlYXRlIik7Ci0gICAgQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG5ldyBDb250cm9sUGFyYW1ldGVycygpOwotICAgIHBhcmFtZXRlcnMuc2V0VXJpKHVyaSk7Ci0gICAgY29tbWFuZC5hcHBlbmQocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOwotCi0gICAgLy8gc2VuZCB0aGUgaW50ZXJlc3QKLSAgICBDb250cm9sUmVzcG9uc2UgcmVzcG9uc2UgPSBzZW5kQ29tbWFuZChmb3J3YXJkZXIsIG5ldyBJbnRlcmVzdChjb21tYW5kKSk7Ci0KLSAgICAvLyByZXR1cm4KLSAgICByZXR1cm4gcmVzcG9uc2UuZ2V0Qm9keSgpLmdldCgwKS5nZXRGYWNlSWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXN0cm95IGEgZmFjZSBvbiBnaXZlbiBmb3J3YXJkZXIuIEVuc3VyZSB0aGUgZm9yd2FyZGluZyBmYWNlIGlzIG9uIHRoZQotICAgKiBsb2NhbCBtYWNoaW5lIChtYW5hZ2VtZW50IHJlcXVlc3RzIGFyZSB0byAvbG9jYWxob3N0Ly4uLikgYW5kIHRoYXQgY29tbWFuZAotICAgKiBzaWduaW5nIGhhcyBiZWVuIHNldCB1cCAoZS5nLiBmb3J3YXJkZXIuc2V0Q29tbWFuZFNpZ25pbmdJbmZvKCkpLgotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyIE9ubHkgYSBsb2NhbGhvc3QgRmFjZQotICAgKiBAcGFyYW0gZmFjZUlkCi0gICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGRlc3Ryb3lGYWNlKEZhY2UgZm9yd2FyZGVyLCBpbnQgZmFjZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBOYW1lIGNvbW1hbmQgPSBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZGVzdHJveSIpOwotICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgQ29udHJvbFBhcmFtZXRlcnMoKTsKLSAgICBwYXJhbWV0ZXJzLnNldEZhY2VJZChmYWNlSWQpOwotICAgIGNvbW1hbmQuYXBwZW5kKHBhcmFtZXRlcnMud2lyZUVuY29kZSgpKTsKLQotICAgIC8vIHNlbmQgdGhlIGludGVyZXN0Ci0gICAgc2VuZENvbW1hbmQoZm9yd2FyZGVyLCBuZXcgSW50ZXJlc3QoY29tbWFuZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuYWJsZSBhIGxvY2FsIGNvbnRyb2wgZmVhdHVyZSBvbiB0aGUgZ2l2ZW4gZm9yd2FyZGVyLiBTZWUKLSAgICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvRmFjZU1nbXQjRW5hYmxlLWEtTG9jYWxDb250cm9sSGVhZGVyLWZlYXR1cmUKLSAgICoKLSAgICogQHBhcmFtIGZvcndhcmRlcgotICAgKiBAcGFyYW0gaGVhZGVyCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlTG9jYWxDb250cm9sSGVhZGVyKEZhY2UgZm9yd2FyZGVyLCBMb2NhbENvbnRyb2xIZWFkZXIgaGVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBidWlsZCBjb21tYW5kIG5hbWUKLSAgICBOYW1lIGNvbW1hbmQgPSBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvZmFjZXMvZW5hYmxlLWxvY2FsLWNvbnRyb2wiKTsKLSAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgcGFyYW1ldGVycy5zZXRMb2NhbENvbnRyb2xGZWF0dXJlKGhlYWRlci5nZXROdW1lcmljVmFsdWUoKSk7Ci0gICAgY29tbWFuZC5hcHBlbmQocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOwotCi0gICAgLy8gc2VuZCBjb21tYW5kIGFuZCByZXR1cm4KLSAgICBzZW5kQ29tbWFuZChmb3J3YXJkZXIsIG5ldyBJbnRlcmVzdChjb21tYW5kKSk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzYWJsZSBhIGxvY2FsIGNvbnRyb2wgZmVhdHVyZSBvbiB0aGUgZ2l2ZW4gZm9yd2FyZGVyLiBTZWUKLSAgICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvRmFjZU1nbXQjRGlzYWJsZS1hLUxvY2FsQ29udHJvbEhlYWRlci1mZWF0dXJlCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIKLSAgICogQHBhcmFtIGhlYWRlcgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGVMb2NhbENvbnRyb2xIZWFkZXIoRmFjZSBmb3J3YXJkZXIsIExvY2FsQ29udHJvbEhlYWRlciBoZWFkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIGNvbW1hbmQgbmFtZQotICAgIE5hbWUgY29tbWFuZCA9IG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcy9kaXNhYmxlLWxvY2FsLWNvbnRyb2wiKTsKLSAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgcGFyYW1ldGVycy5zZXRMb2NhbENvbnRyb2xGZWF0dXJlKGhlYWRlci5nZXROdW1lcmljVmFsdWUoKSk7Ci0gICAgY29tbWFuZC5hcHBlbmQocGFyYW1ldGVycy53aXJlRW5jb2RlKCkpOwotCi0gICAgLy8gc2VuZCBjb21tYW5kIGFuZCByZXR1cm4KLSAgICBzZW5kQ29tbWFuZChmb3J3YXJkZXIsIG5ldyBJbnRlcmVzdChjb21tYW5kKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgYSByb3V0ZSBvbiB0aGUgZm9yd2FyZGVyOyBzZWUKLSAgICogaHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9ORkQvY3VycmVudC9tYW5wYWdlcy9uZmRjLmh0bWwgZm9yIGNvbW1hbmQtbGluZQotICAgKiB1c2FnZSBhbmQgaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvUmliTWdtdCBmb3IKLSAgICogcHJvdG9jb2wgZG9jdW1lbnRhdGlvbi4gRW5zdXJlIHRoZSBmb3J3YXJkaW5nIGZhY2UgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKLSAgICogKG1hbmFnZW1lbnQgcmVxdWVzdHMgYXJlIHRvIC9sb2NhbGhvc3QvLi4uKSBhbmQgdGhhdCBjb21tYW5kIHNpZ25pbmcgaGFzCi0gICAqIGJlZW4gc2V0IHVwIChlLmcuIGZvcndhcmRlci5zZXRDb21tYW5kU2lnbmluZ0luZm8oKSkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlCi0gICAqIEBwYXJhbSBjb250cm9sUGFyYW1ldGVycwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEZhY2UgZm9yd2FyZGVyLCBDb250cm9sUGFyYW1ldGVycyBjb250cm9sUGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gYnVpbGQgY29tbWFuZCBuYW1lCi0gICAgTmFtZSBjb21tYW5kID0gbmV3IE5hbWUoIi9sb2NhbGhvc3QvbmZkL3JpYi9yZWdpc3RlciIpOwotICAgIGNvbW1hbmQuYXBwZW5kKGNvbnRyb2xQYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7Ci0KLSAgICAvLyBzZW5kIHRoZSBpbnRlcmVzdAotICAgIHNlbmRDb21tYW5kKGZvcndhcmRlciwgbmV3IEludGVyZXN0KGNvbW1hbmQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhIHJvdXRlIG9uIGEgZm9yd2FyZGVyOyB0aGlzIHdpbGwgY3JlYXRlIGEgbmV3IGZhY2Ugb24gdGhlCi0gICAqIGZvcndhcmRlciB0byB0aGUgZ2l2ZW4gVVJJL3JvdXRlIHBhaXIuIFNlZSByZWdpc3RlcihGYWNlLAotICAgKiBDb250cm9sUGFyYW1ldGVycykgZm9yIG1vcmUgZGV0YWlscyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyIE9ubHkgYSBsb2NhbGhvc3QgRmFjZQotICAgKiBAcGFyYW0gdXJpCi0gICAqIEBwYXJhbSBjb3N0Ci0gICAqIEBwYXJhbSByb3V0ZQotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGYWNlIGZvcndhcmRlciwgU3RyaW5nIHVyaSwgTmFtZSByb3V0ZSwgaW50IGNvc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGNyZWF0ZSB0aGUgbmV3IGZhY2UKLSAgICBpbnQgZmFjZUlkID0gY3JlYXRlRmFjZShmb3J3YXJkZXIsIHVyaSk7Ci0KLSAgICAvLyBydW4gYmFzZSBtZXRob2QKLSAgICByZWdpc3Rlcihmb3J3YXJkZXIsIGZhY2VJZCwgcm91dGUsIGNvc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgcm91dGUgb24gYSBmb3J3YXJkZXI7IHRoaXMgd2lsbCBub3QgY3JlYXRlIGEgbmV3IGZhY2Ugc2luY2UgaXQKLSAgICogaXMgcHJvdmlkZWQgYSBmYWNlSWQuIFNlZSByZWdpc3RlcihGYWNlLCBDb250cm9sUGFyYW1ldGVycykgZm9yIGZ1bGwKLSAgICogZG9jdW1lbnRhdGlvbgotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyIE9ubHkgYSBsb2NhbGhvc3QgRmFjZQotICAgKiBAcGFyYW0gZmFjZUlkCi0gICAqIEBwYXJhbSByb3V0ZQotICAgKiBAcGFyYW0gY29zdAotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihGYWNlIGZvcndhcmRlciwgaW50IGZhY2VJZCwgTmFtZSByb3V0ZSwgaW50IGNvc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIGNvbW1hbmQgbmFtZQotICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgQ29udHJvbFBhcmFtZXRlcnMoKTsKLSAgICBwYXJhbWV0ZXJzLnNldE5hbWUocm91dGUpOwotICAgIHBhcmFtZXRlcnMuc2V0RmFjZUlkKGZhY2VJZCk7Ci0gICAgcGFyYW1ldGVycy5zZXRDb3N0KGNvc3QpOwotICAgIEZvcndhcmRpbmdGbGFncyBmbGFncyA9IG5ldyBGb3J3YXJkaW5nRmxhZ3MoKTsKLSAgICBmbGFncy5zZXRDYXB0dXJlKHRydWUpOwotICAgIGZsYWdzLnNldENoaWxkSW5oZXJpdCh0cnVlKTsKLSAgICBwYXJhbWV0ZXJzLnNldEZvcndhcmRpbmdGbGFncyhmbGFncyk7Ci0KLSAgICAvLyBydW4gYmFzZSBtZXRob2QKLSAgICByZWdpc3Rlcihmb3J3YXJkZXIsIHBhcmFtZXRlcnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVucmVnaXN0ZXIgYSByb3V0ZSBvbiBhIGZvcndhcmRlcjsgc2VlCi0gICAqIGh0dHA6Ly9uYW1lZC1kYXRhLm5ldC9kb2MvTkZEL2N1cnJlbnQvbWFucGFnZXMvbmZkYy5odG1sIGZvciBjb21tYW5kLWxpbmUKLSAgICogdXNhZ2UgYW5kIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1JpYk1nbXQgZm9yCi0gICAqIHByb3RvY29sIGRvY3VtZW50YXRpb24uIEVuc3VyZSB0aGUgZm9yd2FyZGluZyBmYWNlIGlzIG9uIHRoZSBsb2NhbCBtYWNoaW5lCi0gICAqIChtYW5hZ2VtZW50IHJlcXVlc3RzIGFyZSB0byAvbG9jYWxob3N0Ly4uLikgYW5kIHRoYXQgY29tbWFuZCBzaWduaW5nIGhhcwotICAgKiBiZWVuIHNldCB1cCAoZS5nLiBmb3J3YXJkZXIuc2V0Q29tbWFuZFNpZ25pbmdJbmZvKCkKLSAgICoKLSAgICogQHBhcmFtIGZvcndhcmRlcgotICAgKiBAcGFyYW0gY29udHJvbFBhcmFtZXRlcnMKLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdW5yZWdpc3RlcihGYWNlIGZvcndhcmRlciwgQ29udHJvbFBhcmFtZXRlcnMgY29udHJvbFBhcmFtZXRlcnMpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIGNvbW1hbmQgbmFtZQotICAgIE5hbWUgY29tbWFuZCA9IG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9yaWIvdW5yZWdpc3RlciIpOwotICAgIGNvbW1hbmQuYXBwZW5kKGNvbnRyb2xQYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7Ci0KLSAgICAvLyBzZW5kIHRoZSBpbnRlcmVzdAotICAgIHNlbmRDb21tYW5kKGZvcndhcmRlciwgbmV3IEludGVyZXN0KGNvbW1hbmQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBVbnJlZ2lzdGVyIGEgcm91dGUgb24gYSBmb3J3YXJkZXI7IHNlZQotICAgKiBodHRwOi8vbmFtZWQtZGF0YS5uZXQvZG9jL05GRC9jdXJyZW50L21hbnBhZ2VzL25mZGMuaHRtbCBmb3IgY29tbWFuZC1saW5lCi0gICAqIHVzYWdlIGFuZCBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9SaWJNZ210IGZvcgotICAgKiBwcm90b2NvbCBkb2N1bWVudGF0aW9uLiBFbnN1cmUgdGhlIGZvcndhcmRpbmcgZmFjZSBpcyBvbiB0aGUgbG9jYWwgbWFjaGluZQotICAgKiAobWFuYWdlbWVudCByZXF1ZXN0cyBhcmUgdG8gL2xvY2FsaG9zdC8uLi4pIGFuZCB0aGF0IGNvbW1hbmQgc2lnbmluZyBoYXMKLSAgICogYmVlbiBzZXQgdXAgKGUuZy4gZm9yd2FyZGVyLnNldENvbW1hbmRTaWduaW5nSW5mbygpCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIKLSAgICogQHBhcmFtIHJvdXRlCi0gICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoRmFjZSBmb3J3YXJkZXIsIE5hbWUgcm91dGUpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIGNvbW1hbmQgbmFtZQotICAgIENvbnRyb2xQYXJhbWV0ZXJzIGNvbnRyb2xQYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgY29udHJvbFBhcmFtZXRlcnMuc2V0TmFtZShyb3V0ZSk7Ci0KLSAgICAvLyBzZW5kIHRoZSBpbnRlcmVzdAotICAgIHVucmVnaXN0ZXIoZm9yd2FyZGVyLCBjb250cm9sUGFyYW1ldGVycyk7Ci0gIH0KLQotICAvKioKLSAgICogVW5yZWdpc3RlciBhIHJvdXRlIG9uIGEgZm9yd2FyZGVyOyBzZWUKLSAgICogaHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9ORkQvY3VycmVudC9tYW5wYWdlcy9uZmRjLmh0bWwgZm9yIGNvbW1hbmQtbGluZQotICAgKiB1c2FnZSBhbmQgaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvUmliTWdtdCBmb3IKLSAgICogcHJvdG9jb2wgZG9jdW1lbnRhdGlvbi4gRW5zdXJlIHRoZSBmb3J3YXJkaW5nIGZhY2UgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKLSAgICogKG1hbmFnZW1lbnQgcmVxdWVzdHMgYXJlIHRvIC9sb2NhbGhvc3QvLi4uKSBhbmQgdGhhdCBjb21tYW5kIHNpZ25pbmcgaGFzCi0gICAqIGJlZW4gc2V0IHVwIChlLmcuIGZvcndhcmRlci5zZXRDb21tYW5kU2lnbmluZ0luZm8oKQotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyCi0gICAqIEBwYXJhbSByb3V0ZQotICAgKiBAcGFyYW0gZmFjZUlkCi0gICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoRmFjZSBmb3J3YXJkZXIsIE5hbWUgcm91dGUsIGludCBmYWNlSWQpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIGNvbW1hbmQgbmFtZQotICAgIENvbnRyb2xQYXJhbWV0ZXJzIGNvbnRyb2xQYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgY29udHJvbFBhcmFtZXRlcnMuc2V0TmFtZShyb3V0ZSk7Ci0gICAgY29udHJvbFBhcmFtZXRlcnMuc2V0RmFjZUlkKGZhY2VJZCk7Ci0KLSAgICAvLyBzZW5kIHRoZSBpbnRlcmVzdAotICAgIHVucmVnaXN0ZXIoZm9yd2FyZGVyLCBjb250cm9sUGFyYW1ldGVycyk7Ci0gIH0KLQotICAvKioKLSAgICogVW5yZWdpc3RlciBhIHJvdXRlIG9uIGEgZm9yd2FyZGVyOyBzZWUKLSAgICogaHR0cDovL25hbWVkLWRhdGEubmV0L2RvYy9ORkQvY3VycmVudC9tYW5wYWdlcy9uZmRjLmh0bWwgZm9yIGNvbW1hbmQtbGluZQotICAgKiB1c2FnZSBhbmQgaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvUmliTWdtdCBmb3IKLSAgICogcHJvdG9jb2wgZG9jdW1lbnRhdGlvbi4gRW5zdXJlIHRoZSBmb3J3YXJkaW5nIGZhY2UgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKLSAgICogKG1hbmFnZW1lbnQgcmVxdWVzdHMgYXJlIHRvIC9sb2NhbGhvc3QvLi4uKSBhbmQgdGhhdCBjb21tYW5kIHNpZ25pbmcgaGFzCi0gICAqIGJlZW4gc2V0IHVwIChlLmcuIGZvcndhcmRlci5zZXRDb21tYW5kU2lnbmluZ0luZm8oKQotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyCi0gICAqIEBwYXJhbSByb3V0ZQotICAgKiBAcGFyYW0gdXJpCi0gICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoRmFjZSBmb3J3YXJkZXIsIE5hbWUgcm91dGUsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotICAgIGludCBmYWNlSWQgPSAtMTsKLSAgICBmb3IgKEZhY2VTdGF0dXMgZmFjZSA6IGdldEZhY2VMaXN0KGZvcndhcmRlcikpIHsKLSAgICAgIGlmIChmYWNlLmdldFVyaSgpLm1hdGNoZXModXJpKSkgewotICAgICAgICBmYWNlSWQgPSBmYWNlLmdldEZhY2VJZCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZmFjZUlkID09IC0xKSB7Ci0gICAgICB0aHJvdyBuZXcgTWFuYWdlbWVudEV4Y2VwdGlvbigiRmFjZSBub3QgZm91bmQ6ICIgKyB1cmkpOwotICAgIH0KLQotICAgIC8vIHNlbmQgdGhlIGludGVyZXN0Ci0gICAgdW5yZWdpc3Rlcihmb3J3YXJkZXIsIHJvdXRlLCBmYWNlSWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhIHN0cmF0ZWd5IG9uIHRoZSBmb3J3YXJkZXI7IHNlZQotICAgKiBodHRwOi8vbmFtZWQtZGF0YS5uZXQvZG9jL05GRC9jdXJyZW50L21hbnBhZ2VzL25mZGMuaHRtbCBmb3IgY29tbWFuZC1saW5lCi0gICAqIHVzYWdlIGFuZCBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9TdHJhdGVneUNob2ljZQotICAgKiBmb3IgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbi4gRW5zdXJlIHRoZSBmb3J3YXJkaW5nIGZhY2UgaXMgb24gdGhlIGxvY2FsCi0gICAqIG1hY2hpbmUgKG1hbmFnZW1lbnQgcmVxdWVzdHMgYXJlIHRvIC9sb2NhbGhvc3QvLi4uKSBhbmQgdGhhdCBjb21tYW5kCi0gICAqIHNpZ25pbmcgaGFzIGJlZW4gc2V0IHVwIChlLmcuIGZvcndhcmRlci5zZXRDb21tYW5kU2lnbmluZ0luZm8oKSkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlCi0gICAqIEBwYXJhbSBwcmVmaXgKLSAgICogQHBhcmFtIHN0cmF0ZWd5Ci0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RyYXRlZ3koRmFjZSBmb3J3YXJkZXIsIE5hbWUgcHJlZml4LCBOYW1lIHN0cmF0ZWd5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBidWlsZCBjb21tYW5kIG5hbWUKLSAgICBOYW1lIGNvbW1hbmQgPSBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvc3RyYXRlZ3ktY2hvaWNlL3NldCIpOwotICAgIENvbnRyb2xQYXJhbWV0ZXJzIHBhcmFtZXRlcnMgPSBuZXcgQ29udHJvbFBhcmFtZXRlcnMoKTsKLSAgICBwYXJhbWV0ZXJzLnNldE5hbWUocHJlZml4KTsKLSAgICBwYXJhbWV0ZXJzLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICBjb21tYW5kLmFwcGVuZChwYXJhbWV0ZXJzLndpcmVFbmNvZGUoKSk7Ci0KLSAgICAvLyBzZW5kIHRoZSBpbnRlcmVzdAotICAgIHNlbmRDb21tYW5kKGZvcndhcmRlciwgbmV3IEludGVyZXN0KGNvbW1hbmQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZCBhbiBpbnRlcmVzdCB0byByZXRyaWV2ZSBhIHNlZ21lbnRlZCBkYXRhIHNldCBmcm9tIHRoZSBORkQ7IGZvcgotICAgKiBkZXRhaWxzIG9uIHRoZSBEYXRhU2V0LCBzZWUKLSAgICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvU3RhdHVzRGF0YXNldAotICAgKgotICAgKiBAcGFyYW0gZm9yd2FyZGVyCi0gICAqIEBwYXJhbSBkYXRhc2V0TmFtZQotICAgKiBAcmV0dXJuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICogQHRocm93cyBNYW5hZ2VtZW50RXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERhdGEgcmV0cmlldmVEYXRhU2V0KEZhY2UgZm9yd2FyZGVyLCBOYW1lIGRhdGFzZXROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1hbmFnZW1lbnRFeGNlcHRpb24gewotICAgIC8vIGJ1aWxkIG1hbmFnZW1lbnQgSW50ZXJlc3QgcGFja2V0OyBzZWUgaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvU3RhdHVzRGF0YXNldAotICAgIEludGVyZXN0IGludGVyZXN0ID0gbmV3IEludGVyZXN0KGRhdGFzZXROYW1lKTsKLSAgICBpbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKLSAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKEludGVyZXN0LkNISUxEX1NFTEVDVE9SX1JJR0hUKTsKLSAgICBpbnRlcmVzdC5zZXRJbnRlcmVzdExpZmV0aW1lTWlsbGlzZWNvbmRzKERFRkFVTFRfVElNRU9VVCk7Ci0KLSAgICAvLyBzZW5kIHBhY2tldAotICAgIERhdGEgZGF0YSA9IFNlZ21lbnRlZENsaWVudC5nZXREZWZhdWx0KCkuZ2V0U3luYyhmb3J3YXJkZXIsIGludGVyZXN0KTsKLQotICAgIC8vIGNoZWNrIGZvciBmYWlsZWQgcmVxdWVzdAotICAgIGlmIChkYXRhLmdldENvbnRlbnQoKS5idWYoKS5nZXQoMCkgPT0gQ29udHJvbFJlc3BvbnNlLlRMVl9DT05UUk9MX1JFU1BPTlNFKSB7Ci0gICAgICB0aHJvdyBNYW5hZ2VtZW50RXhjZXB0aW9uLmZyb21SZXNwb25zZShkYXRhLmdldENvbnRlbnQoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlbmQgYW4gaW50ZXJlc3QgYXMgYSBjb21tYW5kIHRvIHRoZSBmb3J3YXJkZXI7IHRoaXMgbWV0aG9kIHdpbGwgY29udmVydAotICAgKiB0aGUgaW50ZXJlc3QgdG8gYSBjb21tYW5kIGludGVyZXN0IGFuZCBibG9jayB1bnRpbCBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkCi0gICAqIGZyb20gdGhlIGZvcndhcmRlci4gRW5zdXJlIHRoZSBmb3J3YXJkaW5nIGZhY2UgaXMgb24gdGhlIGxvY2FsIG1hY2hpbmUKLSAgICogKG1hbmFnZW1lbnQgcmVxdWVzdHMgYXJlIHRvIC9sb2NhbGhvc3QvLi4uKSBhbmQgdGhhdCBjb21tYW5kIHNpZ25pbmcgaGFzCi0gICAqIGJlZW4gc2V0IHVwIChlLmcuIGZvcndhcmRlci5zZXRDb21tYW5kU2lnbmluZ0luZm8oKSkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3J3YXJkZXIgT25seSBhIGxvY2FsaG9zdCBGYWNlLCBjb21tYW5kIHNpZ25pbmcgaW5mbyBtdXN0IGJlIHNldAotICAgKiBAcGFyYW0gaW50ZXJlc3QgQXMgZGVzY3JpYmVkIGF0Ci0gICAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0NvbnRyb2xDb21tYW5kLCB0aGUKLSAgICogcmVxdWVzdGVkIGludGVyZXN0IG11c3QgaGF2ZSBlbmNvZGVkIENvbnRyb2xQYXJhbWV0ZXJzIGFwcGVuZGVkIHRvIHRoZQotICAgKiBpbnRlcmVzdCBuYW1lCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAqIEB0aHJvd3MgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbgotICAgKiBAdGhyb3dzIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQuTWFuYWdlbWVudEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb250cm9sUmVzcG9uc2Ugc2VuZENvbW1hbmQoRmFjZSBmb3J3YXJkZXIsIEludGVyZXN0IGludGVyZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEVuY29kaW5nRXhjZXB0aW9uLCBNYW5hZ2VtZW50RXhjZXB0aW9uIHsKLSAgICAvLyBmb3J3YXJkZXIgbXVzdCBoYXZlIGNvbW1hbmQgc2lnbmluZyBpbmZvIHNldAotICAgIHRyeSB7Ci0gICAgICBmb3J3YXJkZXIubWFrZUNvbW1hbmRJbnRlcmVzdChpbnRlcmVzdCk7Ci0gICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFpbGVkIHRvIG1ha2UgY29tbWFuZCBpbnRlcmVzdDsgZW5zdXJlIGNvbW1hbmQgc2lnbmluZyBpbmZvIGlzIHNldCBvbiB0aGUgZmFjZS4iLCBlKTsKLSAgICB9Ci0KLSAgICAvLyBzZW5kIGNvbW1hbmQgcGFja2V0Ci0gICAgRGF0YSBkYXRhID0gU2ltcGxlQ2xpZW50LmdldERlZmF1bHQoKS5nZXRTeW5jKGZvcndhcmRlciwgaW50ZXJlc3QpOwotCi0gICAgLy8gZGVjb2RlIHJlc3BvbnNlCi0gICAgQ29udHJvbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENvbnRyb2xSZXNwb25zZSgpOwotICAgIHJlc3BvbnNlLndpcmVEZWNvZGUoZGF0YS5nZXRDb250ZW50KCkuYnVmKCkpOwotCi0gICAgLy8gY2hlY2sgcmVzcG9uc2UgZm9yIHN1Y2Nlc3MKLSAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpICE9IE9LX1NUQVRVUykgewotICAgICAgdGhyb3cgTWFuYWdlbWVudEV4Y2VwdGlvbi5mcm9tUmVzcG9uc2UocmVzcG9uc2UpOwotICAgIH0KLQotICAgIHJldHVybiByZXNwb25zZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0NvbnRyb2xSZXNwb25zZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0NvbnRyb2xSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg3ZmU3Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9Db250cm9sUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXM7Ci0KLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LkVuY29kaW5nSGVscGVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkNvbnRyb2xQYXJhbWV0ZXJzOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcuRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcudGx2LlRsdkRlY29kZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RW5jb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLnV0aWwuQmxvYjsKLQotLyoqCi0gKiBSZXByZXNlbnQgYSBDb250cm9sUmVzcG9uc2UsIGEgRGF0YSBwYWNrZXQgc2VudCBpbiByZXNwb25zZSB0byBhCi0gKiBDb250cm9sQ29tbWFuZCB0byB0aGUgTkZELCBzZWUKLSAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0NvbnRyb2xDb21tYW5kCi0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUmVzcG9uc2UgewotCi0gIC8qKgotICAgKiBVc2UgVExWIGNvZGVzIGZyb20gam5kbi5lbmNvZGluZy50bHYuVGx2LmphdmEgU2VlCi0gICAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0NvbnRyb2xDb21tYW5kCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUTFZfQ09OVFJPTF9SRVNQT05TRSA9IDEwMTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVExWX0NPTlRST0xfUkVTUE9OU0VfU1RBVFVTX0NPREUgPSAxMDI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRMVl9DT05UUk9MX1JFU1BPTlNFX1NUQVRVU19URVhUID0gMTAzOwotCi0gIC8qKgotICAgKiBFbmNvZGUgdXNpbmcgYSBuZXcgVExWIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZpbmFsIEJsb2Igd2lyZUVuY29kZSgpIHsKLSAgICBUbHZFbmNvZGVyIGVuY29kZXIgPSBuZXcgVGx2RW5jb2RlcigpOwotICAgIHdpcmVFbmNvZGUoZW5jb2Rlcik7Ci0gICAgcmV0dXJuIG5ldyBCbG9iKGVuY29kZXIuZ2V0T3V0cHV0KCksIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYXMgcGFydCBvZiBhbiBleGlzdGluZyBlbmNvZGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIGVuY29kZXIKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVFbmNvZGUoVGx2RW5jb2RlciBlbmNvZGVyKSB7Ci0gICAgaW50IHNhdmVMZW5ndGggPSBlbmNvZGVyLmdldExlbmd0aCgpOwotICAgIGZvciAoQ29udHJvbFBhcmFtZXRlcnMgcGFyYW1ldGVycyA6IGJvZHkpIHsKLSAgICAgIEVuY29kaW5nSGVscGVyLmVuY29kZUNvbnRyb2xQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIGVuY29kZXIpOwotICAgIH0KLSAgICBlbmNvZGVyLndyaXRlQmxvYlRsdihUTFZfQ09OVFJPTF9SRVNQT05TRV9TVEFUVVNfVEVYVCwgbmV3IEJsb2Ioc3RhdHVzVGV4dCkuYnVmKCkpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX0NPTlRST0xfUkVTUE9OU0VfU1RBVFVTX0NPREUsIHN0YXR1c0NvZGUpOwotICAgIGVuY29kZXIud3JpdGVUeXBlQW5kTGVuZ3RoKFRMVl9DT05UUk9MX1JFU1BPTlNFLCBlbmNvZGVyLmdldExlbmd0aCgpIC0gc2F2ZUxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIHRoZSBpbnB1dCBmcm9tIGl0cyBUTFYgZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IGJ1ZmZlciB0byBkZWNvZGUuIFRoaXMgcmVhZHMgZnJvbSBwb3NpdGlvbigpIHRvCi0gICAqIGxpbWl0KCksIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uLgotICAgKiBAdGhyb3dzIG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcuRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVEZWNvZGUoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBUbHZEZWNvZGVyIGRlY29kZXIgPSBuZXcgVGx2RGVjb2RlcihpbnB1dCk7Ci0gICAgd2lyZURlY29kZShkZWNvZGVyLCBpbnB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZGVjb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBkZWNvZGVyCi0gICAqIEBwYXJhbSBpbnB1dCB0aGUgV2lyZUZvcm1hdCB2ZXJzaW9uIHRoYXQgZGVjb2RlcyBDb250cm9sUGFyYW1ldGVycyBkb2VzIG5vdAotICAgKiBhbGxvdyBwYXNzaW5nIGEgVGx2RGVjb2Rlciwgc28gd2UgbXVzdCBwYXNzIHRoZSBidWZmZXIgaXRzZWxmCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpcmVEZWNvZGUoVGx2RGVjb2RlciBkZWNvZGVyLCBCeXRlQnVmZmVyIGlucHV0KSB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24gewotICAgIGludCBlbmRPZmZzZXQgPSBkZWNvZGVyLnJlYWROZXN0ZWRUbHZzU3RhcnQoVExWX0NPTlRST0xfUkVTUE9OU0UpOwotCi0gICAgLy8gcGFyc2Uga25vd24gVExWcwotICAgIHRoaXMuc3RhdHVzQ29kZSA9IChpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfQ09OVFJPTF9SRVNQT05TRV9TVEFUVVNfQ09ERSk7Ci0gICAgQmxvYiBzdGF0dXNUZXh0XyA9IG5ldyBCbG9iKGRlY29kZXIucmVhZEJsb2JUbHYoVExWX0NPTlRST0xfUkVTUE9OU0VfU1RBVFVTX1RFWFQpLCB0cnVlKTsgLy8gY29weSBiZWNhdXNlIGJ1ZmZlciBpcyBpbW11dGFibGUKLSAgICB0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0Xy50b1N0cmluZygpOwotCi0gICAgLy8gdXNlIHRoZSBhbHJlYWR5LXdyaXR0ZW4gZGVjb2RlciBmb3IgQ29udHJvbFBhcmFtZXRlcnMgKGJ1dCB3ZSBoYXZlIHRvIGNvcHkgdGhlIGJ1ZmZlcikKLSAgICB3aGlsZSAoZGVjb2Rlci5wZWVrVHlwZShUbHYuQ29udHJvbFBhcmFtZXRlcnNfQ29udHJvbFBhcmFtZXRlcnMsIGVuZE9mZnNldCkpIHsKLSAgICAgIEJ5dGVCdWZmZXIgY29weUlucHV0ID0gaW5wdXQuZHVwbGljYXRlKCk7Ci0gICAgICBjb3B5SW5wdXQucG9zaXRpb24oZGVjb2Rlci5nZXRPZmZzZXQoKSk7Ci0gICAgICBpbnQgaW50ZXJuYWxFbmRPZmZzZXQgPSBkZWNvZGVyLnJlYWROZXN0ZWRUbHZzU3RhcnQoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0NvbnRyb2xQYXJhbWV0ZXJzKTsKLSAgICAgIENvbnRyb2xQYXJhbWV0ZXJzIGNvcHlQYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgICBjb3B5UGFyYW1ldGVycy53aXJlRGVjb2RlKGNvcHlJbnB1dCk7Ci0gICAgICB0aGlzLmJvZHkuYWRkKGNvcHlQYXJhbWV0ZXJzKTsKLSAgICAgIGRlY29kZXIuc2VlayhpbnRlcm5hbEVuZE9mZnNldCk7Ci0gICAgICBkZWNvZGVyLmZpbmlzaE5lc3RlZFRsdnMoaW50ZXJuYWxFbmRPZmZzZXQpOwotICAgIH0KLQotICAgIGRlY29kZXIuZmluaXNoTmVzdGVkVGx2cyhlbmRPZmZzZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdGF0dXMgY29kZQotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7Ci0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHN0YXR1cyBjb2RlCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXNDb2RlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNDb2RlKGludCBzdGF0dXNDb2RlKSB7Ci0gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RhdHVzIHRleHQKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNUZXh0KCkgewotICAgIHJldHVybiBzdGF0dXNUZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzdGF0dXMgdGV4dAotICAgKgotICAgKiBAcGFyYW0gc3RhdHVzVGV4dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhdHVzVGV4dChTdHJpbmcgc3RhdHVzVGV4dCkgewotICAgIHRoaXMuc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGJvZHkKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIExpc3Q8Q29udHJvbFBhcmFtZXRlcnM+IGdldEJvZHkoKSB7Ci0gICAgcmV0dXJuIGJvZHk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGJvZHkKLSAgICoKLSAgICogQHBhcmFtIGJvZHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJvZHkoTGlzdDxDb250cm9sUGFyYW1ldGVycz4gYm9keSkgewotICAgIHRoaXMuYm9keSA9IGJvZHk7Ci0gIH0KLQotICBwcml2YXRlIGludCBzdGF0dXNDb2RlID0gLTE7Ci0gIHByaXZhdGUgU3RyaW5nIHN0YXR1c1RleHQgPSAiIjsKLSAgcHJpdmF0ZSBMaXN0PENvbnRyb2xQYXJhbWV0ZXJzPiBib2R5ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRGVjb2RhYmxlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRGVjb2RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzUwZGQuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0RlY29kYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIGpuZG4tbWFuYWdlbWVudAotICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi0gKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotcGFja2FnZSBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzOwotCi1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZEZWNvZGVyOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGJ5IFN0YXR1c0RhdGFzZXQgdG8gZGVjb2RlIGdlbmVyaWMgbWVzc2FnZSB0eXBlczsgaWYgdGhleSBhcmUKLSAqIERlY29kYWJsZSwgdGhlbiBTdGF0dXNEYXRhc2V0IHdpbGwgaW5zdGFudGlhdGUgYW5kIGRlY29kZSB0aGVtLgotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlY29kYWJsZSB7Ci0KLSAgcHVibGljIHZvaWQgd2lyZURlY29kZShUbHZEZWNvZGVyIGRlY29kZXIpIHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9GYWNlUGVyc2lzdGVuY3kuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9GYWNlUGVyc2lzdGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0YzhjNS4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRmFjZVBlcnNpc3RlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXM7Ci0KLS8qKgotICogSW5kaWNhdGUgd2hldGhlciB0aGUgZmFjZSBpcyBwZXJzaXN0ZW50OyB1c2VkIGJ5IEZhY2VTdGF0dXMgU2VlCi0gKiBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lkaS9GYWNlTWdtdAotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgZW51bSBGYWNlUGVyc2lzdGVuY3kgewotCi0gIFBFUlNJU1RFTlQoMCksCi0gIE9OX0RFTUFORCgxKSwKLSAgUEVSTUFORU5UKDIpOwotCi0gIEZhY2VQZXJzaXN0ZW5jeShpbnQgdmFsdWUpIHsKLSAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtZXJpY1ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWVfOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0ZhY2VTY29wZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0ZhY2VTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTMzYjI0Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9GYWNlU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlczsKLQotLyoqCi0gKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBmYWNlIGlzIGxvY2FsIGZvciBzY29wZSBjb250cm9sIHB1cnBvc2VzOyB1c2VkIGJ5Ci0gKiBGYWNlU3RhdHVzIFNlZSBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lkaS9GYWNlTWdtdAotICoKLSAqIEBhdXRob3IgYW5kcmV3Ci0gKi8KLXB1YmxpYyBlbnVtIEZhY2VTY29wZSB7Ci0KLSAgTE9DQUwoMCksCi0gIE5PTl9MT0NBTCgxKTsKLQotICBGYWNlU2NvcGUoaW50IHZhbHVlKSB7Ci0gICAgdmFsdWVfID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldE51bWVyaWNWYWx1ZSgpIHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0gIHByaXZhdGUgZmluYWwgaW50IHZhbHVlXzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9GYWNlU3RhdHVzLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRmFjZVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZlYzQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9GYWNlU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIGpuZG4tbWFuYWdlbWVudAotICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi0gKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotcGFja2FnZSBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcudGx2LlRsdkRlY29kZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RW5jb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLnV0aWwuQmxvYjsKLQotLyoqCi0gKiBSZXByZXNlbnQgYSBGYWNlU3RhdHVzIG9iamVjdCBmcm9tIC9sb2NhbGhvc3QvbmZkL2ZhY2VzL2xpc3Q7IHNlZQotICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvRmFjZU1nbXQgZm9yIGRldGFpbHMKLSAqCi0gKiBAYXV0aG9yIEFuZHJldyBCcm93biA8YW5kcmV3LmJyb3duQGludGVsLmNvbT4KLSAqLwotcHVibGljIGNsYXNzIEZhY2VTdGF0dXMgaW1wbGVtZW50cyBEZWNvZGFibGUgewotCi0gIC8qKgotICAgKiBTcGVjIGZyb20gaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvQ29udHJvbENvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRMVl9GQUNFX0lEID0gMTA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfVVJJID0gMTE0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfRVhQSVJBVElPTl9QRVJJT0QgPSAxMDk7Ci0KLSAgLyoqCi0gICAqIFNwZWMgZnJvbSBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lkaS9GYWNlTWdtdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX0ZBQ0VfU1RBVFVTID0gMTI4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfTE9DQUxfVVJJID0gMTI5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfQ0hBTk5FTF9TVEFUVVMgPSAxMzA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRMVl9GQUNFX1NDT1BFID0gMTMyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfRkFDRV9QRVJTSVNURU5DWSA9IDEzMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX0xJTktfVFlQRSA9IDEzNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX05fSU5fSU5URVJFU1RTID0gMTQ0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfTl9JTl9EQVRBUyA9IDE0NTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX05fT1VUX0lOVEVSRVNUUyA9IDE0NjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX05fT1VUX0RBVEFTID0gMTQ3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUTFZfTl9JTl9CWVRFUyA9IDE0ODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVExWX05fT1VUX0JZVEVTID0gMTQ5OwotCi0gIC8qKgotICAgKiBFbmNvZGUgdXNpbmcgYSBuZXcgVExWIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZpbmFsIEJsb2Igd2lyZUVuY29kZSgpIHsKLSAgICBUbHZFbmNvZGVyIGVuY29kZXIgPSBuZXcgVGx2RW5jb2RlcigpOwotICAgIHdpcmVFbmNvZGUoZW5jb2Rlcik7Ci0gICAgcmV0dXJuIG5ldyBCbG9iKGVuY29kZXIuZ2V0T3V0cHV0KCksIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYXMgcGFydCBvZiBhbiBleGlzdGluZyBlbmNvZGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIGVuY29kZXIKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVFbmNvZGUoVGx2RW5jb2RlciBlbmNvZGVyKSB7Ci0gICAgaW50IHNhdmVMZW5ndGggPSBlbmNvZGVyLmdldExlbmd0aCgpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fT1VUX0JZVEVTLCBvdXRCeXRlcyk7Ci0gICAgZW5jb2Rlci53cml0ZU5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfTl9JTl9CWVRFUywgaW5CeXRlcyk7Ci0gICAgZW5jb2Rlci53cml0ZU5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfTl9PVVRfREFUQVMsIG91dERhdGFzKTsKLSAgICBlbmNvZGVyLndyaXRlTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9OX09VVF9JTlRFUkVTVFMsIG91dEludGVyZXN0cyk7Ci0gICAgZW5jb2Rlci53cml0ZU5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfTl9JTl9EQVRBUywgaW5EYXRhcyk7Ci0gICAgZW5jb2Rlci53cml0ZU5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfTl9JTl9JTlRFUkVTVFMsIGluSW50ZXJlc3RzKTsKLSAgICBlbmNvZGVyLndyaXRlTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9MSU5LX1RZUEUsIGxpbmtUeXBlLmdldE51bWVyaWNWYWx1ZSgpKTsKLSAgICBlbmNvZGVyLndyaXRlTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9GQUNFX1BFUlNJU1RFTkNZLCBmYWNlUGVyc2lzdGVuY3kuZ2V0TnVtZXJpY1ZhbHVlKCkpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX0ZBQ0VfU0NPUEUsIGZhY2VTY29wZS5nZXROdW1lcmljVmFsdWUoKSk7Ci0gICAgZW5jb2Rlci53cml0ZU9wdGlvbmFsTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9FWFBJUkFUSU9OX1BFUklPRCwgZXhwaXJhdGlvblBlcmlvZCk7Ci0gICAgZW5jb2Rlci53cml0ZUJsb2JUbHYoVExWX0xPQ0FMX1VSSSwgbmV3IEJsb2IobG9jYWxVcmkpLmJ1ZigpKTsKLSAgICBlbmNvZGVyLndyaXRlQmxvYlRsdihUTFZfVVJJLCBuZXcgQmxvYih1cmkpLmJ1ZigpKTsKLSAgICBlbmNvZGVyLndyaXRlTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9GQUNFX0lELCBmYWNlSWQpOwotICAgIGVuY29kZXIud3JpdGVUeXBlQW5kTGVuZ3RoKFRMVl9GQUNFX1NUQVRVUywgZW5jb2Rlci5nZXRMZW5ndGgoKSAtIHNhdmVMZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZSB0aGUgaW5wdXQgZnJvbSBpdHMgVExWIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBidWZmZXIgdG8gZGVjb2RlLiBUaGlzIHJlYWRzIGZyb20gcG9zaXRpb24oKSB0bwotICAgKiBsaW1pdCgpLCBidXQgZG9lcyBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbi4KLSAgICogQHRocm93cyBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRGVjb2RlKEJ5dGVCdWZmZXIgaW5wdXQpIHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgVGx2RGVjb2RlciBkZWNvZGVyID0gbmV3IFRsdkRlY29kZXIoaW5wdXQpOwotICAgIHdpcmVEZWNvZGUoZGVjb2Rlcik7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZGVjb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBkZWNvZGVyCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3aXJlRGVjb2RlKFRsdkRlY29kZXIgZGVjb2RlcikgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBpbnQgZW5kT2Zmc2V0ID0gZGVjb2Rlci5yZWFkTmVzdGVkVGx2c1N0YXJ0KFRMVl9GQUNFX1NUQVRVUyk7Ci0gICAgLy8gcGFyc2UKLSAgICB0aGlzLmZhY2VJZCA9IChpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfRkFDRV9JRCk7Ci0gICAgQmxvYiB1cmlfID0gbmV3IEJsb2IoZGVjb2Rlci5yZWFkQmxvYlRsdihUTFZfVVJJKSwgdHJ1ZSk7IC8vIGNvcHkgYmVjYXVzZSBidWZmZXIgaXMgaW1tdXRhYmxlCi0gICAgdGhpcy51cmkgPSB1cmlfLnRvU3RyaW5nKCk7Ci0gICAgQmxvYiBsb2NhbFVyaV8gPSBuZXcgQmxvYihkZWNvZGVyLnJlYWRCbG9iVGx2KFRMVl9MT0NBTF9VUkkpLCB0cnVlKTsgLy8gY29weSBiZWNhdXNlIGJ1ZmZlciBpcyBpbW11dGFibGUKLSAgICB0aGlzLmxvY2FsVXJpID0gbG9jYWxVcmlfLnRvU3RyaW5nKCk7Ci0gICAgdGhpcy5leHBpcmF0aW9uUGVyaW9kID0gKGludCkgZGVjb2Rlci5yZWFkT3B0aW9uYWxOb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX0VYUElSQVRJT05fUEVSSU9ELCBlbmRPZmZzZXQpOwotICAgIHRoaXMuZmFjZVNjb3BlID0gRmFjZVNjb3BlLnZhbHVlcygpWyhpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfRkFDRV9TQ09QRSldOwotICAgIHRoaXMuZmFjZVBlcnNpc3RlbmN5ID0gRmFjZVBlcnNpc3RlbmN5LnZhbHVlcygpWyhpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUTFZfRkFDRV9QRVJTSVNURU5DWSldOwotICAgIHRoaXMubGlua1R5cGUgPSBMaW5rVHlwZS52YWx1ZXMoKVsoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX0xJTktfVFlQRSldOwotICAgIHRoaXMuaW5JbnRlcmVzdHMgPSAoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fSU5fSU5URVJFU1RTKTsKLSAgICB0aGlzLmluRGF0YXMgPSAoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fSU5fREFUQVMpOwotICAgIHRoaXMub3V0SW50ZXJlc3RzID0gKGludCkgZGVjb2Rlci5yZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRMVl9OX09VVF9JTlRFUkVTVFMpOwotICAgIHRoaXMub3V0RGF0YXMgPSAoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fT1VUX0RBVEFTKTsKLSAgICB0aGlzLmluQnl0ZXMgPSAoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fSU5fQllURVMpOwotICAgIHRoaXMub3V0Qnl0ZXMgPSAoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVExWX05fT1VUX0JZVEVTKTsKLSAgICBkZWNvZGVyLmZpbmlzaE5lc3RlZFRsdnMoZW5kT2Zmc2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZmFjZSBJRAotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEZhY2VJZCgpIHsKLSAgICByZXR1cm4gZmFjZUlkOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBmYWNlIElECi0gICAqCi0gICAqIEBwYXJhbSBmYWNlSWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhY2VJZChpbnQgZmFjZUlkKSB7Ci0gICAgdGhpcy5mYWNlSWQgPSBmYWNlSWQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZhY2UgSUQKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgVVJJCi0gICAqCi0gICAqIEBwYXJhbSB1cmkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZhY2UgSUQKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhbFVyaSgpIHsKLSAgICByZXR1cm4gbG9jYWxVcmk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGxvY2FsIFVSSQotICAgKgotICAgKiBAcGFyYW0gbG9jYWxVcmkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsVXJpKFN0cmluZyBsb2NhbFVyaSkgewotICAgIHRoaXMubG9jYWxVcmkgPSBsb2NhbFVyaTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZXhwaXJhdGlvbiBwZXJpb2QKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRFeHBpcmF0aW9uUGVyaW9kKCkgewotICAgIHJldHVybiBleHBpcmF0aW9uUGVyaW9kOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBleHBpcmF0aW9uIHBlcmlvZAotICAgKgotICAgKiBAcGFyYW0gZXhwaXJhdGlvblBlcmlvZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvblBlcmlvZChpbnQgZXhwaXJhdGlvblBlcmlvZCkgewotICAgIHRoaXMuZXhwaXJhdGlvblBlcmlvZCA9IGV4cGlyYXRpb25QZXJpb2Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZhY2Ugc2NvcGUgdmFsdWUKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIEZhY2VTY29wZSBnZXRGYWNlU2NvcGUoKSB7Ci0gICAgcmV0dXJuIGZhY2VTY29wZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZmFjZSBzY29wZSB2YWx1ZQotICAgKgotICAgKiBAcGFyYW0gZmFjZVNjb3BlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWNlU2NvcGUoRmFjZVNjb3BlIGZhY2VTY29wZSkgewotICAgIHRoaXMuZmFjZVNjb3BlID0gZmFjZVNjb3BlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBmYWNlIHBlcnNpc3RlbmN5IHZhbHVlCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBGYWNlUGVyc2lzdGVuY3kgZ2V0RmFjZVBlcnNpc3RlbmN5KCkgewotICAgIHJldHVybiBmYWNlUGVyc2lzdGVuY3k7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGZhY2UgcGVyc2lzdGVuY3kgdmFsdWUKLSAgICoKLSAgICogQHBhcmFtIGZhY2VQZXJzaXN0ZW5jeQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFjZVBlcnNpc3RlbmN5KEZhY2VQZXJzaXN0ZW5jeSBmYWNlUGVyc2lzdGVuY3kpIHsKLSAgICB0aGlzLmZhY2VQZXJzaXN0ZW5jeSA9IGZhY2VQZXJzaXN0ZW5jeTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbGluayB0eXBlCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBMaW5rVHlwZSBnZXRMaW5rVHlwZSgpIHsKLSAgICByZXR1cm4gbGlua1R5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGxpbmsgdHlwZQotICAgKgotICAgKiBAcGFyYW0gbGlua1R5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpbmtUeXBlKExpbmtUeXBlIGxpbmtUeXBlKSB7Ci0gICAgdGhpcy5saW5rVHlwZSA9IGxpbmtUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBudW1iZXIgb2YgcmVjZWl2ZWQgSW50ZXJlc3QgcGFja2V0cwotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEluSW50ZXJlc3RzKCkgewotICAgIHJldHVybiBpbkludGVyZXN0czsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbnVtYmVyIG9mIHJlY2VpdmVkIEludGVyZXN0IHBhY2tldHMKLSAgICoKLSAgICogQHBhcmFtIGluSW50ZXJlc3RzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbkludGVyZXN0cyhpbnQgaW5JbnRlcmVzdHMpIHsKLSAgICB0aGlzLmluSW50ZXJlc3RzID0gaW5JbnRlcmVzdHM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG51bWJlciBvZiBzZW50IEludGVyZXN0IHBhY2tldHMKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRPdXRJbnRlcmVzdHMoKSB7Ci0gICAgcmV0dXJuIG91dEludGVyZXN0czsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbnVtYmVyIG9mIHNlbnQgSW50ZXJlc3QgcGFja2V0cwotICAgKgotICAgKiBAcGFyYW0gb3V0SW50ZXJlc3RzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdXRJbnRlcmVzdHMoaW50IG91dEludGVyZXN0cykgewotICAgIHRoaXMub3V0SW50ZXJlc3RzID0gb3V0SW50ZXJlc3RzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBudW1iZXIgb2YgcmVjZWl2ZWQgRGF0YSBwYWNrZXRzCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SW5EYXRhcygpIHsKLSAgICByZXR1cm4gaW5EYXRhczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbnVtYmVyIG9mIHJlY2VpdmVkIERhdGEgcGFja2V0cwotICAgKgotICAgKiBAcGFyYW0gaW5EYXRhcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5EYXRhcyhpbnQgaW5EYXRhcykgewotICAgIHRoaXMuaW5EYXRhcyA9IGluRGF0YXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG51bWJlciBvZiBzZW50IERhdGEgcGFja2V0cwotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE91dERhdGFzKCkgewotICAgIHJldHVybiBvdXREYXRhczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbnVtYmVyIG9mIHNlbnQgRGF0YSBwYWNrZXRzCi0gICAqCi0gICAqIEBwYXJhbSBvdXREYXRhcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0RGF0YXMoaW50IG91dERhdGFzKSB7Ci0gICAgdGhpcy5vdXREYXRhcyA9IG91dERhdGFzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbkJ5dGVzKCkgewotICAgIHJldHVybiBpbkJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMKLSAgICoKLSAgICogQHBhcmFtIGluQnl0ZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluQnl0ZXMoaW50IGluQnl0ZXMpIHsKLSAgICB0aGlzLmluQnl0ZXMgPSBpbkJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0T3V0Qnl0ZXMoKSB7Ci0gICAgcmV0dXJuIG91dEJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzCi0gICAqCi0gICAqIEBwYXJhbSBvdXRCeXRlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0Qnl0ZXMoaW50IG91dEJ5dGVzKSB7Ci0gICAgdGhpcy5vdXRCeXRlcyA9IG91dEJ5dGVzOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZmFjZUlkID0gLTE7Ci0gIHByaXZhdGUgU3RyaW5nIHVyaSA9ICIiOyAvLyBjYW4ndCB1c2UgVVJJIGJlY2F1c2Ugc29tZSBhcmUgaW52YWxpZCBzeW50YXgKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxVcmkgPSAiIjsgLy8gY2FuJ3QgdXNlIFVSSSBiZWNhdXNlIHNvbWUgYXJlIGludmFsaWQgc3ludGF4Ci0gIHByaXZhdGUgaW50IGV4cGlyYXRpb25QZXJpb2QgPSAwOwotICBwcml2YXRlIEZhY2VTY29wZSBmYWNlU2NvcGUgPSBGYWNlU2NvcGUuTE9DQUw7Ci0gIHByaXZhdGUgRmFjZVBlcnNpc3RlbmN5IGZhY2VQZXJzaXN0ZW5jeSA9IEZhY2VQZXJzaXN0ZW5jeS5PTl9ERU1BTkQ7Ci0gIHByaXZhdGUgTGlua1R5cGUgbGlua1R5cGUgPSBMaW5rVHlwZS5QT0lOVF9UT19QT0lOVDsKLSAgcHJpdmF0ZSBpbnQgaW5JbnRlcmVzdHMgPSAwOwotICBwcml2YXRlIGludCBvdXRJbnRlcmVzdHMgPSAwOwotICBwcml2YXRlIGludCBpbkRhdGFzID0gMDsKLSAgcHJpdmF0ZSBpbnQgb3V0RGF0YXMgPSAwOwotICBwcml2YXRlIGludCBpbkJ5dGVzID0gMDsKLSAgcHJpdmF0ZSBpbnQgb3V0Qnl0ZXMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0ZpYkVudHJ5LmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRmliRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNWZmNC4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvRmliRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXM7Ci0KLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LkVuY29kaW5nSGVscGVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLk5hbWU7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZEZWNvZGVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcudGx2LlRsdkVuY29kZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi51dGlsLkJsb2I7Ci0KLS8qKgotICogUmVwcmVzZW50IGEgRmliRW50cnkgcmV0dXJuZWQgZnJvbSAvbG9jYWxob3N0L25mZC9maWIvbGlzdDsgc2VlCi0gKiBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9GaWJNZ210I0ZJQi1EYXRhc2V0Ci0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWJFbnRyeSBpbXBsZW1lbnRzIERlY29kYWJsZSB7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVExWX0ZJQl9FTlRSWSA9IDEyODsKLQotICAvKioKLSAgICogRW5jb2RlIHVzaW5nIGEgbmV3IFRMViBlbmNvZGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBlbmNvZGVkIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBCbG9iIHdpcmVFbmNvZGUoKSB7Ci0gICAgVGx2RW5jb2RlciBlbmNvZGVyID0gbmV3IFRsdkVuY29kZXIoKTsKLSAgICB3aXJlRW5jb2RlKGVuY29kZXIpOwotICAgIHJldHVybiBuZXcgQmxvYihlbmNvZGVyLmdldE91dHB1dCgpLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZW5jb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBlbmNvZGVyCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRW5jb2RlKFRsdkVuY29kZXIgZW5jb2RlcikgewotICAgIGludCBzYXZlTGVuZ3RoID0gZW5jb2Rlci5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKE5leHRIb3BSZWNvcmQgcmVjb3JkIDogcmVjb3JkcykgewotICAgICAgcmVjb3JkLndpcmVFbmNvZGUoZW5jb2Rlcik7Ci0gICAgfQotICAgIEVuY29kaW5nSGVscGVyLmVuY29kZU5hbWUobmFtZSwgZW5jb2Rlcik7Ci0gICAgZW5jb2Rlci53cml0ZVR5cGVBbmRMZW5ndGgoVExWX0ZJQl9FTlRSWSwgZW5jb2Rlci5nZXRMZW5ndGgoKSAtIHNhdmVMZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZSB0aGUgaW5wdXQgZnJvbSBpdHMgVExWIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBidWZmZXIgdG8gZGVjb2RlLiBUaGlzIHJlYWRzIGZyb20gcG9zaXRpb24oKSB0bwotICAgKiBsaW1pdCgpLCBidXQgZG9lcyBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbi4KLSAgICogQHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbiBGb3IgaW52YWxpZCBlbmNvZGluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVEZWNvZGUoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBUbHZEZWNvZGVyIGRlY29kZXIgPSBuZXcgVGx2RGVjb2RlcihpbnB1dCk7Ci0gICAgd2lyZURlY29kZShkZWNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgYXMgcGFydCBvZiBhbiBleGlzdGluZyBkZWNvZGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIGRlY29kZXIKLSAgICogQHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVEZWNvZGUoVGx2RGVjb2RlciBkZWNvZGVyKSB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24gewotICAgIGludCBlbmRPZmZzZXQgPSBkZWNvZGVyLnJlYWROZXN0ZWRUbHZzU3RhcnQoVExWX0ZJQl9FTlRSWSk7Ci0gICAgbmFtZSA9IEVuY29kaW5nSGVscGVyLmRlY29kZU5hbWUoZGVjb2Rlcik7Ci0gICAgd2hpbGUgKGRlY29kZXIuZ2V0T2Zmc2V0KCkgPCBlbmRPZmZzZXQpIHsKLSAgICAgIE5leHRIb3BSZWNvcmQgcmVjb3JkID0gbmV3IE5leHRIb3BSZWNvcmQoKTsKLSAgICAgIHJlY29yZC53aXJlRGVjb2RlKGRlY29kZXIpOwotICAgICAgcmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICB9Ci0gICAgZGVjb2Rlci5maW5pc2hOZXN0ZWRUbHZzKGVuZE9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG5hbWUKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgbmFtZQotICAgKgotICAgKiBAcGFyYW0gbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShOYW1lIG5hbWUpIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCByZWNvcmRzCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBMaXN0PE5leHRIb3BSZWNvcmQ+IGdldFJlY29yZHMoKSB7Ci0gICAgcmV0dXJuIHJlY29yZHM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJlY29yZHMKLSAgICoKLSAgICogQHBhcmFtIHJlY29yZHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlY29yZHMoTGlzdDxOZXh0SG9wUmVjb3JkPiByZWNvcmRzKSB7Ci0gICAgdGhpcy5yZWNvcmRzID0gcmVjb3JkczsKLSAgfQotCi0gIHByaXZhdGUgTmFtZSBuYW1lID0gbmV3IE5hbWUoKTsKLSAgcHJpdmF0ZSBMaXN0PE5leHRIb3BSZWNvcmQ+IHJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9MaW5rVHlwZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0xpbmtUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjk4NzcuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0xpbmtUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXM7Ci0KLS8qKgotICogSW5kaWNhdGUgdGhlIHR5cGUgb2YgY29tbXVuaWNhdGlvbiBsaW5rOyB1c2VkIGJ5IEZhY2VTdGF0dXMgU2VlCi0gKiBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lkaS9GYWNlTWdtdAotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgZW51bSBMaW5rVHlwZSB7Ci0KLSAgUE9JTlRfVE9fUE9JTlQoMCksCi0gIE1VTFRJX0FDQ0VTUygxKTsKLQotICBMaW5rVHlwZShpbnQgdmFsdWUpIHsKLSAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtZXJpY1ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWVfOwotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0xvY2FsQ29udHJvbEhlYWRlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL0xvY2FsQ29udHJvbEhlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJhZWUyLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9Mb2NhbENvbnRyb2xIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlczsKLQotLyoqCi0gKiBEZWZpbmUgY29uc3RhbnRzIGZvciBsb2NhbCBjb250cm9sIGhlYWRlciBvcHRpb25zLiBTZWUKLSAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL0ZhY2VNZ210I0VuYWJsZS1hLUxvY2FsQ29udHJvbEhlYWRlci1mZWF0dXJlCi0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBlbnVtIExvY2FsQ29udHJvbEhlYWRlciB7Ci0KLSAgSU5DT01JTkdfRkFDRV9JRCgxKSwKLSAgTkVYVF9IT1BfRkFDRV9JRCgyKSwKLSAgQ0FDSElOR19QT0xJQ1koMyk7Ci0KLSAgTG9jYWxDb250cm9sSGVhZGVyKGludCB2YWx1ZSkgewotICAgIHZhbHVlXyA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXROdW1lcmljVmFsdWUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZV87Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvTmV4dEhvcFJlY29yZC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL05leHRIb3BSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlNGRjYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvTmV4dEhvcFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlczsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHY7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RGVjb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZFbmNvZGVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotCi0vKioKLSAqIFJlcHJlc2VudCBhIE5leHRIb3BSZWNvcmQgaW4gYSBGaWJFbnRyeTsgc2VlCi0gKiBodHRwOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9uZmQvd2lraS9GaWJNZ210I0ZJQi1EYXRhc2V0Ci0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXh0SG9wUmVjb3JkIHsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUTFZfTkVYVF9IT1BfUkVDT1JEID0gMTI5OwotCi0gIC8qKgotICAgKiBFbmNvZGUgdXNpbmcgYSBuZXcgVExWIGVuY29kZXIuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIGVuY29kZWQgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZpbmFsIEJsb2Igd2lyZUVuY29kZSgpIHsKLSAgICBUbHZFbmNvZGVyIGVuY29kZXIgPSBuZXcgVGx2RW5jb2RlcigpOwotICAgIHdpcmVFbmNvZGUoZW5jb2Rlcik7Ci0gICAgcmV0dXJuIG5ldyBCbG9iKGVuY29kZXIuZ2V0T3V0cHV0KCksIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYXMgcGFydCBvZiBhbiBleGlzdGluZyBlbmNvZGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIGVuY29kZXIKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVFbmNvZGUoVGx2RW5jb2RlciBlbmNvZGVyKSB7Ci0gICAgaW50IHNhdmVMZW5ndGggPSBlbmNvZGVyLmdldExlbmd0aCgpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0Nvc3QsIGNvc3QpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0ZhY2VJZCwgZmFjZUlkKTsKLSAgICBlbmNvZGVyLndyaXRlVHlwZUFuZExlbmd0aChUTFZfTkVYVF9IT1BfUkVDT1JELCBlbmNvZGVyLmdldExlbmd0aCgpIC0gc2F2ZUxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIHRoZSBpbnB1dCBmcm9tIGl0cyBUTFYgZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IGJ1ZmZlciB0byBkZWNvZGUuIFRoaXMgcmVhZHMgZnJvbSBwb3NpdGlvbigpIHRvCi0gICAqIGxpbWl0KCksIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uLgotICAgKiBAdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIEZvciBpbnZhbGlkIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd2lyZURlY29kZShCeXRlQnVmZmVyIGlucHV0KSB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24gewotICAgIFRsdkRlY29kZXIgZGVjb2RlciA9IG5ldyBUbHZEZWNvZGVyKGlucHV0KTsKLSAgICB3aXJlRGVjb2RlKGRlY29kZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZSBhcyBwYXJ0IG9mIGFuIGV4aXN0aW5nIGRlY29kZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gZGVjb2RlcgotICAgKiBAdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRGVjb2RlKFRsdkRlY29kZXIgZGVjb2RlcikgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBpbnQgZW5kT2Zmc2V0ID0gZGVjb2Rlci5yZWFkTmVzdGVkVGx2c1N0YXJ0KFRMVl9ORVhUX0hPUF9SRUNPUkQpOwotICAgIHRoaXMuZmFjZUlkID0gKGludCkgZGVjb2Rlci5yZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19GYWNlSWQpOwotICAgIHRoaXMuY29zdCA9IChpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUbHYuQ29udHJvbFBhcmFtZXRlcnNfQ29zdCk7Ci0gICAgZGVjb2Rlci5maW5pc2hOZXN0ZWRUbHZzKGVuZE9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZhY2UgSUQKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRGYWNlSWQoKSB7Ci0gICAgcmV0dXJuIGZhY2VJZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZmFjZSBJRAotICAgKgotICAgKiBAcGFyYW0gZmFjZUlkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWNlSWQoaW50IGZhY2VJZCkgewotICAgIHRoaXMuZmFjZUlkID0gZmFjZUlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjb3N0Ci0gICAqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29zdCgpIHsKLSAgICByZXR1cm4gY29zdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgY29zdAotICAgKgotICAgKiBAcGFyYW0gY29zdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29zdChpbnQgY29zdCkgewotICAgIHRoaXMuY29zdCA9IGNvc3Q7Ci0gIH0KLQotICBwcml2YXRlIGludCBmYWNlSWQ7Ci0gIHByaXZhdGUgaW50IGNvc3Q7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvUmliRW50cnkuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9SaWJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg5YTg1Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9SaWJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlczsKLQotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQuRW5jb2RpbmdIZWxwZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcudGx2LlRsdkRlY29kZXI7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RW5jb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLnV0aWwuQmxvYjsKLQotLyoqCi0gKiBSZXByZXNlbnQgYSBlbnRyeSBpbiB0aGUgUklCOyBzZWUKLSAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1JpYk1nbXQjUklCLURhdGFzZXQgZm9yCi0gKiBkZXRhaWxzCi0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSaWJFbnRyeSBpbXBsZW1lbnRzIERlY29kYWJsZSB7Ci0KLSAgLyoqCi0gICAqIFRMViB0eXBlLCBzZWUKLSAgICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvUmliTWdtdCNUTFYtVFlQRS1hc3NpZ25tZW50cwotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVExWX1JJQl9FTlRSWSA9IDEyODsKLQotICAvKioKLSAgICogRW5jb2RlIHVzaW5nIGEgbmV3IFRMViBlbmNvZGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBlbmNvZGVkIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBCbG9iIHdpcmVFbmNvZGUoKSB7Ci0gICAgVGx2RW5jb2RlciBlbmNvZGVyID0gbmV3IFRsdkVuY29kZXIoKTsKLSAgICB3aXJlRW5jb2RlKGVuY29kZXIpOwotICAgIHJldHVybiBuZXcgQmxvYihlbmNvZGVyLmdldE91dHB1dCgpLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZW5jb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBlbmNvZGVyCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRW5jb2RlKFRsdkVuY29kZXIgZW5jb2RlcikgewotICAgIGludCBzYXZlTGVuZ3RoID0gZW5jb2Rlci5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKFJvdXRlIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICByb3V0ZS53aXJlRW5jb2RlKGVuY29kZXIpOwotICAgIH0KLSAgICBFbmNvZGluZ0hlbHBlci5lbmNvZGVOYW1lKG5hbWUsIGVuY29kZXIpOwotICAgIGVuY29kZXIud3JpdGVUeXBlQW5kTGVuZ3RoKFRMVl9SSUJfRU5UUlksIGVuY29kZXIuZ2V0TGVuZ3RoKCkgLSBzYXZlTGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgdGhlIGlucHV0IGZyb20gaXRzIFRMViBmb3JtYXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgYnVmZmVyIHRvIGRlY29kZS4gVGhpcyByZWFkcyBmcm9tIHBvc2l0aW9uKCkgdG8KLSAgICogbGltaXQoKSwgYnV0IGRvZXMgbm90IGNoYW5nZSB0aGUgcG9zaXRpb24uCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24gRm9yIGludmFsaWQgZW5jb2RpbmcuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRGVjb2RlKEJ5dGVCdWZmZXIgaW5wdXQpIHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgVGx2RGVjb2RlciBkZWNvZGVyID0gbmV3IFRsdkRlY29kZXIoaW5wdXQpOwotICAgIHdpcmVEZWNvZGUoZGVjb2Rlcik7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZGVjb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBkZWNvZGVyCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRGVjb2RlKFRsdkRlY29kZXIgZGVjb2RlcikgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBpbnQgZW5kT2Zmc2V0ID0gZGVjb2Rlci5yZWFkTmVzdGVkVGx2c1N0YXJ0KFRMVl9SSUJfRU5UUlkpOwotICAgIG5hbWUgPSBFbmNvZGluZ0hlbHBlci5kZWNvZGVOYW1lKGRlY29kZXIpOwotICAgIHdoaWxlIChkZWNvZGVyLmdldE9mZnNldCgpIDwgZW5kT2Zmc2V0KSB7Ci0gICAgICBSb3V0ZSByb3V0ZSA9IG5ldyBSb3V0ZSgpOwotICAgICAgcm91dGUud2lyZURlY29kZShkZWNvZGVyKTsKLSAgICAgIHJvdXRlcy5hZGQocm91dGUpOwotICAgIH0KLSAgICBkZWNvZGVyLmZpbmlzaE5lc3RlZFRsdnMoZW5kT2Zmc2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbmFtZQotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgTmFtZSBnZXROYW1lKCkgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBuYW1lCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKE5hbWUgbmFtZSkgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJvdXRlcwotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgTGlzdDxSb3V0ZT4gZ2V0Um91dGVzKCkgewotICAgIHJldHVybiByb3V0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJvdXRlcwotICAgKgotICAgKiBAcGFyYW0gcm91dGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb3V0ZXMoTGlzdDxSb3V0ZT4gcm91dGVzKSB7Ci0gICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXM7Ci0gIH0KLQotICBwcml2YXRlIE5hbWUgbmFtZSA9IG5ldyBOYW1lKCk7Ci0gIHByaXZhdGUgTGlzdDxSb3V0ZT4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvUm91dGUuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9Sb3V0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFjN2U2Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC90eXBlcy9Sb3V0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlczsKLQotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcudGx2LlRsdjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uRm9yd2FyZGluZ0ZsYWdzOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcuRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy50bHYuVGx2RGVjb2RlcjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZFbmNvZGVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotCi0vKioKLSAqIFJlcHJlc2VudCBhIFJvdXRlIG9iamVjdCBmcm9tIC9sb2NhbGhvc3QvbmZkL3JpYi9saXN0OyBzZWUKLSAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1JpYk1nbXQjUklCLURhdGFzZXQgZm9yCi0gKiBkZXRhaWxzLgotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgUm91dGUgewotCi0gIC8qKgotICAgKiBUTFYgdHlwZSwgc2VlCi0gICAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1JpYk1nbXQjVExWLVRZUEUtYXNzaWdubWVudHMKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRMVl9ST1VURSA9IDEyOTsKLQotICAvKioKLSAgICogRW5jb2RlIHVzaW5nIGEgbmV3IFRMViBlbmNvZGVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBlbmNvZGVkIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBCbG9iIHdpcmVFbmNvZGUoKSB7Ci0gICAgVGx2RW5jb2RlciBlbmNvZGVyID0gbmV3IFRsdkVuY29kZXIoKTsKLSAgICB3aXJlRW5jb2RlKGVuY29kZXIpOwotICAgIHJldHVybiBuZXcgQmxvYihlbmNvZGVyLmdldE91dHB1dCgpLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIGFzIHBhcnQgb2YgYW4gZXhpc3RpbmcgZW5jb2RlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBlbmNvZGVyCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3aXJlRW5jb2RlKFRsdkVuY29kZXIgZW5jb2RlcikgewotICAgIGludCBzYXZlTGVuZ3RoID0gZW5jb2Rlci5nZXRMZW5ndGgoKTsKLSAgICBlbmNvZGVyLndyaXRlT3B0aW9uYWxOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0V4cGlyYXRpb25QZXJpb2QsIGZhY2VJZCk7Ci0gICAgZW5jb2Rlci53cml0ZU5vbk5lZ2F0aXZlSW50ZWdlclRsdihUbHYuQ29udHJvbFBhcmFtZXRlcnNfRmxhZ3MsIGZsYWdzLmdldEZvcndhcmRpbmdFbnRyeUZsYWdzKCkpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0Nvc3QsIGNvc3QpOwotICAgIGVuY29kZXIud3JpdGVOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX09yaWdpbiwgb3JpZ2luKTsKLSAgICBlbmNvZGVyLndyaXRlTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19GYWNlSWQsIGZhY2VJZCk7Ci0gICAgZW5jb2Rlci53cml0ZVR5cGVBbmRMZW5ndGgoVExWX1JPVVRFLCBlbmNvZGVyLmdldExlbmd0aCgpIC0gc2F2ZUxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIHRoZSBpbnB1dCBmcm9tIGl0cyBUTFYgZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IGJ1ZmZlciB0byBkZWNvZGUuIFRoaXMgcmVhZHMgZnJvbSBwb3NpdGlvbigpIHRvCi0gICAqIGxpbWl0KCksIGJ1dCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uLgotICAgKiBAdGhyb3dzIG5ldC5uYW1lZF9kYXRhLmpuZG4uZW5jb2RpbmcuRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdpcmVEZWNvZGUoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBUbHZEZWNvZGVyIGRlY29kZXIgPSBuZXcgVGx2RGVjb2RlcihpbnB1dCk7Ci0gICAgd2lyZURlY29kZShkZWNvZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgYXMgcGFydCBvZiBhbiBleGlzdGluZyBkZWNvZGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIGRlY29kZXIKLSAgICogQHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd2lyZURlY29kZShUbHZEZWNvZGVyIGRlY29kZXIpIHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgaW50IGVuZE9mZnNldCA9IGRlY29kZXIucmVhZE5lc3RlZFRsdnNTdGFydChUTFZfUk9VVEUpOwotICAgIHRoaXMuZmFjZUlkID0gKGludCkgZGVjb2Rlci5yZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19GYWNlSWQpOwotICAgIHRoaXMub3JpZ2luID0gKGludCkgZGVjb2Rlci5yZWFkTm9uTmVnYXRpdmVJbnRlZ2VyVGx2KFRsdi5Db250cm9sUGFyYW1ldGVyc19PcmlnaW4pOwotICAgIHRoaXMuY29zdCA9IChpbnQpIGRlY29kZXIucmVhZE5vbk5lZ2F0aXZlSW50ZWdlclRsdihUbHYuQ29udHJvbFBhcmFtZXRlcnNfQ29zdCk7Ci0gICAgdGhpcy5mbGFncy5zZXRGb3J3YXJkaW5nRW50cnlGbGFncygoaW50KSBkZWNvZGVyLnJlYWROb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0ZsYWdzKSk7Ci0gICAgdGhpcy5leHBpcmF0aW9uUGVyaW9kID0gKGludCkgZGVjb2Rlci5yZWFkT3B0aW9uYWxOb25OZWdhdGl2ZUludGVnZXJUbHYoVGx2LkNvbnRyb2xQYXJhbWV0ZXJzX0V4cGlyYXRpb25QZXJpb2QsIGVuZE9mZnNldCk7Ci0gICAgZGVjb2Rlci5maW5pc2hOZXN0ZWRUbHZzKGVuZE9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEZhY2UgSUQKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRGYWNlSWQoKSB7Ci0gICAgcmV0dXJuIGZhY2VJZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgRmFjZSBJRAotICAgKgotICAgKiBAcGFyYW0gZmFjZUlkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWNlSWQoaW50IGZhY2VJZCkgewotICAgIHRoaXMuZmFjZUlkID0gZmFjZUlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBvcmlnaW4KLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRPcmlnaW4oKSB7Ci0gICAgcmV0dXJuIG9yaWdpbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgb3JpZ2luCi0gICAqCi0gICAqIEBwYXJhbSBvcmlnaW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9yaWdpbihpbnQgb3JpZ2luKSB7Ci0gICAgdGhpcy5vcmlnaW4gPSBvcmlnaW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGNvc3QKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb3N0KCkgewotICAgIHJldHVybiBjb3N0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjb3N0Ci0gICAqCi0gICAqIEBwYXJhbSBjb3N0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb3N0KGludCBjb3N0KSB7Ci0gICAgdGhpcy5jb3N0ID0gY29zdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZmxhZ3MKLSAgICoKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIEZvcndhcmRpbmdGbGFncyBnZXRGbGFncygpIHsKLSAgICByZXR1cm4gZmxhZ3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGZsYWdzCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmxhZ3MoRm9yd2FyZGluZ0ZsYWdzIGZsYWdzKSB7Ci0gICAgdGhpcy5mbGFncyA9IGZsYWdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBleHBpcmF0aW9uIHBlcmlvZAotICAgKgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZG91YmxlIGdldEV4cGlyYXRpb25QZXJpb2QoKSB7Ci0gICAgcmV0dXJuIGV4cGlyYXRpb25QZXJpb2Q7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGV4cGlyYXRpb24gcGVyaW9kCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcmF0aW9uUGVyaW9kCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uUGVyaW9kKGRvdWJsZSBleHBpcmF0aW9uUGVyaW9kKSB7Ci0gICAgdGhpcy5leHBpcmF0aW9uUGVyaW9kID0gZXhwaXJhdGlvblBlcmlvZDsKLSAgfQotCi0gIHByaXZhdGUgaW50IGZhY2VJZCA9IC0xOwotICBwcml2YXRlIGludCBvcmlnaW4gPSAtMTsKLSAgcHJpdmF0ZSBpbnQgY29zdCA9IC0xOwotICBwcml2YXRlIEZvcndhcmRpbmdGbGFncyBmbGFncyA9IG5ldyBGb3J3YXJkaW5nRmxhZ3MoKTsKLSAgcHJpdmF0ZSBkb3VibGUgZXhwaXJhdGlvblBlcmlvZCA9IC0xLjA7Ci19CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvU3RhdHVzRGF0YXNldC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L3R5cGVzL1N0YXR1c0RhdGFzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlZjkwYy4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvdHlwZXMvU3RhdHVzRGF0YXNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIGpuZG4tbWFuYWdlbWVudAotICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi0gKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotcGFja2FnZSBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzOwotCi1pbXBvcnQgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC5NYW5hZ2VtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5lbmNvZGluZy5FbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLnRsdi5UbHZEZWNvZGVyOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgU3RhdHVzRGF0YXNldHMsIHNlZQotICogaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvU3RhdHVzRGF0YXNldAotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgU3RhdHVzRGF0YXNldCB7Ci0KLSAgLyoqCi0gICAqIERlY29kZSBtdWx0aXBsZSBzdGF0dXMgZW50cmllcyBhcyBwYXJ0IG9mIGEgU3RhdHVzRGF0YXNldCwgc2VlCi0gICAqIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1N0YXR1c0RhdGFzZXQKLSAgICoKLSAgICogQHBhcmFtIDxUPgotICAgKiBAcGFyYW0gc3RhdHVzRGF0YXNldAotICAgKiBAcGFyYW0gdHlwZQotICAgKiBAcmV0dXJuCi0gICAqIEB0aHJvd3MgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC5NYW5hZ2VtZW50RXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIDxUIGV4dGVuZHMgRGVjb2RhYmxlPiBMaXN0PFQ+IHdpcmVEZWNvZGUoQmxvYiBzdGF0dXNEYXRhc2V0LCBDbGFzczxUPiB0eXBlKSB0aHJvd3MgTWFuYWdlbWVudEV4Y2VwdGlvbiB7Ci0gICAgTGlzdDxUPiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgaW50IGVuZE9mZnNldCA9IHN0YXR1c0RhdGFzZXQuc2l6ZSgpOwotICAgIFRsdkRlY29kZXIgZGVjb2RlciA9IG5ldyBUbHZEZWNvZGVyKHN0YXR1c0RhdGFzZXQuYnVmKCkpOwotICAgIHdoaWxlIChkZWNvZGVyLmdldE9mZnNldCgpIDwgZW5kT2Zmc2V0KSB7Ci0gICAgICB0cnkgewotICAgICAgICBUIGVudHJ5ID0gdHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBlbnRyeS53aXJlRGVjb2RlKGRlY29kZXIpOwotICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7Ci0gICAgICB9IGNhdGNoIChFbmNvZGluZ0V4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE1hbmFnZW1lbnRFeGNlcHRpb24oIkZhaWxlZCB0byByZWFkIHN0YXR1cyBkYXRhc2V0LiIsIGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZW50cmllczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L0NvbnRyb2xSZXNwb25zZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9Db250cm9sUmVzcG9uc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjQ2MjUuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L0NvbnRyb2xSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudDsKLQotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuQ29udHJvbFJlc3BvbnNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5Db250cm9sUGFyYW1ldGVyczsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLnV0aWwuQmxvYjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBUZXN0IGVuY29kaW5nL2RlY29kaW5nIG9mIENvbnRyb2xSZXNwb25zZXMuCi0gKgotICogQGF1dGhvciBBbmRyZXcgQnJvd24gPGFuZHJldy5icm93bkBpbnRlbC5jb20+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUmVzcG9uc2VUZXN0IHsKLQotICAvKioKLSAgICogVGVzdCBlbmNvZGluZy9kZWNvZGluZwotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVEZWNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb250cm9sUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xQYXJhbWV0ZXJzKCk7Ci0gICAgcGFyYW1ldGVycy5zZXRGYWNlSWQoMyk7Ci0gICAgQ29udHJvbFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENvbnRyb2xSZXNwb25zZSgpOwotICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoNDA0KTsKLSAgICByZXNwb25zZS5zZXRTdGF0dXNUZXh0KCJOb3QgRm91bmQiKTsKLSAgICByZXNwb25zZS5nZXRCb2R5KCkuYWRkKHBhcmFtZXRlcnMpOwotCi0gICAgLy8gZW5jb2RlCi0gICAgQmxvYiBlbmNvZGVkID0gcmVzcG9uc2Uud2lyZUVuY29kZSgpOwotCi0gICAgLy8gZGVjb2RlCi0gICAgQ29udHJvbFJlc3BvbnNlIGRlY29kZWQgPSBuZXcgQ29udHJvbFJlc3BvbnNlKCk7Ci0gICAgZGVjb2RlZC53aXJlRGVjb2RlKGVuY29kZWQuYnVmKCkpOwotCi0gICAgLy8gdGVzdAotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLCBkZWNvZGVkLmdldFN0YXR1c0NvZGUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRTdGF0dXNUZXh0KCksIGRlY29kZWQuZ2V0U3RhdHVzVGV4dCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldEJvZHkoKS5zaXplKCksIGRlY29kZWQuZ2V0Qm9keSgpLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRCb2R5KCkuZ2V0KDApLmdldEZhY2VJZCgpLCBkZWNvZGVkLmdldEJvZHkoKS5nZXQoMCkuZ2V0RmFjZUlkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvRmFjZVN0YXR1c1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9GYWNlU3RhdHVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU4N2E2Li4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9GYWNlU3RhdHVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudDsKLQotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuU3RhdHVzRGF0YXNldDsKLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzLkZhY2VTdGF0dXM7Ci1pbXBvcnQgY29tLmludGVsLmpuZG4udXRpbHMuU2ltcGxlQ2xpZW50OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5EYXRhOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uRmFjZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkludGVyZXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLS8qKgotICogVGVzdCB3aGV0aGVyIHRoZSBkZWNvZGluZyBmb3IgdGhlIGZhY2UgbWFuYWdlbWVudCBzZXJ2aWNlIGlzIHdvcmtpbmcKLSAqIGNvcnJlY3RseQotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgRmFjZVN0YXR1c1Rlc3QgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZhY2VTdGF0dXNUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgLyoqCi0gICAqIFRlc3QgZW5jb2RpbmcvZGVjb2RpbmcKLSAgICoKLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRGVjb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmFjZVN0YXR1cyBzdGF0dXMgPSBuZXcgRmFjZVN0YXR1cygpOwotICAgIHN0YXR1cy5zZXRGYWNlSWQoNDIpOwotICAgIHN0YXR1cy5zZXRVcmkoIi4uLiIpOwotICAgIHN0YXR1cy5zZXRMb2NhbFVyaSgiLi4uIik7Ci0KLSAgICAvLyBlbmNvZGUKLSAgICBCbG9iIGVuY29kZWQgPSBzdGF0dXMud2lyZUVuY29kZSgpOwotCi0gICAgLy8gZGVjb2RlCi0gICAgRmFjZVN0YXR1cyBkZWNvZGVkID0gbmV3IEZhY2VTdGF0dXMoKTsKLSAgICBkZWNvZGVkLndpcmVEZWNvZGUoZW5jb2RlZC5idWYoKSk7Ci0KLSAgICAvLyB0ZXN0Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdGF0dXMuZ2V0RmFjZUlkKCksIGRlY29kZWQuZ2V0RmFjZUlkKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLmdldFVyaSgpLCBkZWNvZGVkLmdldFVyaSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRMb2NhbFVyaSgpLCBkZWNvZGVkLmdldExvY2FsVXJpKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLmdldEV4cGlyYXRpb25QZXJpb2QoKSwgZGVjb2RlZC5nZXRFeHBpcmF0aW9uUGVyaW9kKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLmdldEZhY2VTY29wZSgpLCBkZWNvZGVkLmdldEZhY2VTY29wZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRGYWNlUGVyc2lzdGVuY3koKSwgZGVjb2RlZC5nZXRGYWNlUGVyc2lzdGVuY3koKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdGF0dXMuZ2V0TGlua1R5cGUoKSwgZGVjb2RlZC5nZXRMaW5rVHlwZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRJbkJ5dGVzKCksIGRlY29kZWQuZ2V0SW5CeXRlcygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cy5nZXRPdXRCeXRlcygpLCBkZWNvZGVkLmdldE91dEJ5dGVzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgb2YgZGVjb2RlIG1ldGhvZCwgb2YgY2xhc3MgRmFjZVN0YXR1cy4KLSAgICoKLSAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAqLwotICBAVGVzdAotICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlRmFrZURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEYXRhIGRhdGEgPSBnZXRGYWNlRGF0YSh0cnVlKTsKLSAgICBMaXN0PEZhY2VTdGF0dXM+IHJlc3VsdHMgPSBTdGF0dXNEYXRhc2V0LndpcmVEZWNvZGUoZGF0YS5nZXRDb250ZW50KCksIEZhY2VTdGF0dXMuY2xhc3MpOwotICAgIGFzc2VydFRydWUocmVzdWx0cy5zaXplKCkgPiA0KTsKLSAgICBmb3IgKEZhY2VTdGF0dXMgZiA6IHJlc3VsdHMpIHsKLSAgICAgIC8vIHRoZSBmaXJzdCBmYWNlIChmYWNlIDEpIHNob3VsZCBhbHdheXMgYmUgdGhlIGludGVybmFsIGZhY2UKLSAgICAgIGlmIChmLmdldEZhY2VJZCgpID09IDEpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRlcm5hbDovLyIsIGYuZ2V0VXJpKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludGVybmFsOi8vIiwgZi5nZXRMb2NhbFVyaSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW50ZWdyYXRpb24gdGVzdCB0byBydW4gb24gYWN0dWFsIHN5c3RlbQotICAgKgotICAgKiBAcGFyYW0gYXJncwotICAgKiBAdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEYXRhIGRhdGEgPSBnZXRGYWNlRGF0YShmYWxzZSk7Ci0gICAgTGlzdDxGYWNlU3RhdHVzPiByZXN1bHRzID0gU3RhdHVzRGF0YXNldC53aXJlRGVjb2RlKGRhdGEuZ2V0Q29udGVudCgpLCBGYWNlU3RhdHVzLmNsYXNzKTsKLSAgICBhc3NlcnRUcnVlKHJlc3VsdHMuc2l6ZSgpID4gNCk7Ci0gICAgZm9yIChGYWNlU3RhdHVzIGYgOiByZXN1bHRzKSB7Ci0gICAgICAvLyB0aGUgZmlyc3QgZmFjZSAoZmFjZSAxKSBzaG91bGQgYWx3YXlzIGJlIHRoZSBpbnRlcm5hbCBmYWNlCi0gICAgICBpZiAoZi5nZXRGYWNlSWQoKSA9PSAxKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJuYWw6Ly8iLCBmLmdldFVyaSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRlcm5hbDovLyIsIGYuZ2V0TG9jYWxVcmkoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlIGEgVExWIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2UgbGlzdCBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSB1c2VQcmVDb21wdXRlZERhdGEgdG8gYXZvaWQgZXJyb3JzIHdoZW4gbG9jYWwgTkZEIGlzIG5vdCBwcmVzZW50Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIERhdGEgZ2V0RmFjZURhdGEoYm9vbGVhbiB1c2VQcmVDb21wdXRlZERhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy8gdXNlIHByZS1jb21wdXRlZCBkYXRhIHRvIGF2b2lkIGVycm9ycyB3aGVuIGxvY2FsIE5GRCBpcyBub3QgcHJlc2VudAotICAgIGlmICh1c2VQcmVDb21wdXRlZERhdGEpIHsKLSAgICAgIERhdGEgZGF0YSA9IG5ldyBEYXRhKCk7Ci0gICAgICBkYXRhLnNldENvbnRlbnQobmV3IEJsb2IoaGV4U3RyaW5nVG9CeXRlQXJyYXkoREFUQSkpKTsKLSAgICAgIHJldHVybiBkYXRhOwotICAgIH0gLy8gYWx0ZXJuYXRlbHksIHF1ZXJ5IHRoZSBhY3R1YWwgbG9jYWxob3N0IGZvciBjdXJyZW50IGRhdGEKLSAgICBlbHNlIHsKLSAgICAgIEZhY2UgZm9yd2FyZGVyID0gbmV3IEZhY2UoImxvY2FsaG9zdCIpOwotCi0gICAgICAvLyBidWlsZCBtYW5hZ2VtZW50IEludGVyZXN0IHBhY2tldDsgc2VlIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1N0YXR1c0RhdGFzZXQKLSAgICAgIEludGVyZXN0IGludGVyZXN0ID0gbmV3IEludGVyZXN0KG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9mYWNlcy9saXN0IikpOwotICAgICAgaW50ZXJlc3Quc2V0TXVzdEJlRnJlc2godHJ1ZSk7Ci0gICAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKEludGVyZXN0LkNISUxEX1NFTEVDVE9SX1JJR0hUKTsKLSAgICAgIGludGVyZXN0LnNldEludGVyZXN0TGlmZXRpbWVNaWxsaXNlY29uZHMoMjAwMC4wKTsKLQotICAgICAgLy8gc2VuZCBwYWNrZXQKLSAgICAgIERhdGEgZGF0YSA9IFNpbXBsZUNsaWVudC5nZXREZWZhdWx0KCkuZ2V0U3luYyhmb3J3YXJkZXIsIGludGVyZXN0KTsKLSAgICAgIFN0cmluZyBoZXggPSBkYXRhLmdldENvbnRlbnQoKS50b0hleCgpOwotICAgICAgbG9nZ2VyLmluZm8oIkhleCBkdW1wIG9mIGZhY2UgbGlzdDogIiArIGhleCk7Ci0gICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJlLWNvbXB1dGVkIGZhY2UgbGlzdCBmcm9tIGEgdmFuaWxsYSBORkQgcnVubmluZyBvbiBVYnVudHUgMTQuMDQKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBID0gIjgwM2E2OTAxMDE3MjBiNjk2ZTc0NjU3MjZlNjE2YzNhMmYyZjgxMGI2OTZlNzQ2NTcyNmU2MTZjM2EyZjJmODQwMTAxODUwMTAwODYwMTAwOTAwMTAwOTEwMjAxNDI5MjAyMDYzOTkzMDEwMDk0MDEwMDk1MDEwMDgwNDA2OTAxZmU3MjBmNjM2ZjZlNzQ2NTZlNzQ3Mzc0NmY3MjY1M2EyZjJmODEwZjYzNmY2ZTc0NjU2ZTc0NzM3NDZmNzI2NTNhMmYyZjg0MDEwMTg1MDEwMDg2MDEwMDkwMDEwMDkxMDEwMDkyMDEwMDkzMDEwMDk0MDEwMDk1MDEwMDgwMzA2OTAxZmY3MjA3NmU3NTZjNmMzYTJmMmY4MTA3NmU3NTZjNmMzYTJmMmY4NDAxMDE4NTAxMDA4NjAxMDA5MDAxMDA5MTAxMDA5MjAxMDA5MzAxMDA5NDAxMDA5NTAxMDA4MDUzNjkwMjAxMDA3MjE5NzU2NDcwMzQzYTJmMmYzMjMyMzQyZTMwMmUzMjMzMmUzMTM3MzAzYTM1MzYzMzM2MzM4MTE3NzU2NDcwMzQzYTJmMmYzMTMwMmUzNTM0MmUzMTMyMmUzNzNhMzUzNjMzMzYzMzg0MDEwMDg1MDEwMDg2MDEwMDkwMDEwMDkxMDEwMDkyMDEwMDkzMDEwMDk0MDEwMDk1MDEwMDgwNTY2OTAyMDEwMTcyMTk3NTY0NzAzNDNhMmYyZjMyMzIzNDJlMzAyZTMyMzMyZTMxMzczMDNhMzUzNjMzMzYzMzgxMWE3NTY0NzAzNDNhMmYyZjMxMzkzMjJlMzEzNjM4MmUzNTMwMmUzNTM3M2EzNTM2MzMzNjMzODQwMTAwODUwMTAwODYwMTAwOTAwMTAwOTEwMTAwOTIwMTAwOTMwMTAwOTQwMTAwOTUwMTAwODA0ODY5MDIwMTAyNzIxYjY1NzQ2ODY1NzIzYTJmMmY1YjMwMzEzYTMwMzAzYTM1NjUzYTMwMzAzYTMxMzczYTYxNjE1ZDgxMGE2NDY1NzYzYTJmMmY2NTc0NjgzMDg0MDEwMDg1MDEwMDg2MDEwMDkwMDEwMDkxMDEwMDkyMDEwMDkzMDEwMDk0MDEwMDk1MDEwMDgwNDk2OTAyMDEwMzcyMWI2NTc0Njg2NTcyM2EyZjJmNWIzMDMxM2EzMDMwM2EzNTY1M2EzMDMwM2EzMTM3M2E2MTYxNWQ4MTBiNjQ2NTc2M2EyZjJmNzc2YzYxNmUzMDg0MDEwMDg1MDEwMDg2MDEwMDkwMDEwMDkxMDEwMDkyMDEwMDkzMDEwMDk0MDEwMDk1MDEwMDgwNDY2OTAyMDEwNDcyMDc2NjY0M2EyZjJmMzIzMjgxMTQ3NTZlNjk3ODNhMmYyZjJmNzI3NTZlMmY2ZTY2NjQyZTczNmY2MzZiODQwMTAxODUwMTAxODYwMTAwOTAwMjA2MzQ5MTAxMDE5MjAxMDE5MzAyMDEyZTk0MDQwMDAxNDA3OTk1MDQwMDA0MTkwMzgwNGU2OTAyMDExOTcyMTY3NDYzNzAzNDNhMmYyZjMxMzIzNzJlMzAyZTMwMmUzMTNhMzUzNjMzMzYzNTgxMTU3NDYzNzAzNDNhMmYyZjMxMzIzNzJlMzAyZTMwMmUzMTNhMzYzMzM2MzM4NDAxMDE4NTAxMDE4NjAxMDA5MDAxMDE5MTAxMDA5MjAxMDA5MzAxMDA5NDAxMzI5NTAxMDAiOwotCi0gIC8qKgotICAgKiBDb252ZXJ0IGhleCBzdHJpbmcgdG8gYnl0ZXM7IHNwZWNpYWwgdGhhbmtzIHRvCi0gICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQwMTMxCi0gICAqCi0gICAqIEBwYXJhbSBzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBoZXhTdHJpbmdUb0J5dGVBcnJheShTdHJpbmcgcykgewotICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOwotICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuIC8gMl07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgewotICAgICAgZGF0YVtpIC8gMl0gPSAoYnl0ZSkgKChDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSksIDE2KSA8PCA0KQotICAgICAgICAgICAgICArIENoYXJhY3Rlci5kaWdpdChzLmNoYXJBdChpICsgMSksIDE2KSk7Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9GaWJFbnRyeVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9GaWJFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkNTg5Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvRmliRW50cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogam5kbi1tYW5hZ2VtZW50Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMywgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLSAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi1wYWNrYWdlIGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQ7Ci0KLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzLlN0YXR1c0RhdGFzZXQ7Ci1pbXBvcnQgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlcy5OZXh0SG9wUmVjb3JkOwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuRmliRW50cnk7Ci1pbXBvcnQgY29tLmludGVsLmpuZG4udXRpbHMuU2ltcGxlQ2xpZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5EYXRhOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uRmFjZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkludGVyZXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3QgZW5jb2RlL2RlY29kZSBvZiBGaWJFbnRyeSBhbmQgTmV4dEhvcFJlY29yZAotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgRmliRW50cnlUZXN0IHsKLQotICAvKioKLSAgICogVGVzdCBlbmNvZGluZy9kZWNvZGluZwotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVEZWNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBOZXh0SG9wUmVjb3JkIG5leHRIb3BSZWNvcmQgPSBuZXcgTmV4dEhvcFJlY29yZCgpOwotICAgIG5leHRIb3BSZWNvcmQuc2V0RmFjZUlkKDQyKTsKLSAgICBuZXh0SG9wUmVjb3JkLnNldENvc3QoMTAwKTsKLSAgICBGaWJFbnRyeSBlbnRyeSA9IG5ldyBGaWJFbnRyeSgpOwotICAgIGVudHJ5LnNldE5hbWUobmV3IE5hbWUoIi9maWIvZW50cnkvdGVzdCIpKTsKLSAgICBlbnRyeS5nZXRSZWNvcmRzKCkuYWRkKG5leHRIb3BSZWNvcmQpOwotCi0gICAgLy8gZW5jb2RlCi0gICAgQmxvYiBlbmNvZGVkID0gZW50cnkud2lyZUVuY29kZSgpOwotCi0gICAgLy8gZGVjb2RlCi0gICAgRmliRW50cnkgZGVjb2RlZCA9IG5ldyBGaWJFbnRyeSgpOwotICAgIGRlY29kZWQud2lyZURlY29kZShlbmNvZGVkLmJ1ZigpKTsKLQotICAgIC8vIHRlc3QKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudHJ5LmdldE5hbWUoKS50b1VyaSgpLCBkZWNvZGVkLmdldE5hbWUoKS50b1VyaSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudHJ5LmdldFJlY29yZHMoKS5nZXQoMCkuZ2V0RmFjZUlkKCksIGRlY29kZWQuZ2V0UmVjb3JkcygpLmdldCgwKS5nZXRGYWNlSWQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhlbnRyeS5nZXRSZWNvcmRzKCkuZ2V0KDApLmdldENvc3QoKSwgZGVjb2RlZC5nZXRSZWNvcmRzKCkuZ2V0KDApLmdldENvc3QoKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW50ZWdyYXRpb24gdGVzdCB0byBydW4gb24gYWN0dWFsIHN5c3RlbQotICAgKgotICAgKiBAcGFyYW0gYXJncwotICAgKiBAdGhyb3dzIEVuY29kaW5nRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGYWNlIGZvcndhcmRlciA9IG5ldyBGYWNlKCJsb2NhbGhvc3QiKTsKLQotICAgIC8vIGJ1aWxkIG1hbmFnZW1lbnQgSW50ZXJlc3QgcGFja2V0OyBzZWUgaHR0cDovL3JlZG1pbmUubmFtZWQtZGF0YS5uZXQvcHJvamVjdHMvbmZkL3dpa2kvU3RhdHVzRGF0YXNldAotICAgIEludGVyZXN0IGludGVyZXN0ID0gbmV3IEludGVyZXN0KG5ldyBOYW1lKCIvbG9jYWxob3N0L25mZC9maWIvbGlzdCIpKTsKLSAgICBpbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKLSAgICBpbnRlcmVzdC5zZXRDaGlsZFNlbGVjdG9yKEludGVyZXN0LkNISUxEX1NFTEVDVE9SX1JJR0hUKTsKLSAgICBpbnRlcmVzdC5zZXRJbnRlcmVzdExpZmV0aW1lTWlsbGlzZWNvbmRzKDIwMDAuMCk7Ci0KLSAgICAvLyBzZW5kIHBhY2tldAotICAgIERhdGEgZGF0YSA9IFNpbXBsZUNsaWVudC5nZXREZWZhdWx0KCkuZ2V0U3luYyhmb3J3YXJkZXIsIGludGVyZXN0KTsKLQotICAgIC8vIGRlY29kZSByZXN1bHRzCi0gICAgTGlzdDxGaWJFbnRyeT4gcmVzdWx0cyA9IFN0YXR1c0RhdGFzZXQud2lyZURlY29kZShkYXRhLmdldENvbnRlbnQoKSwgRmliRW50cnkuY2xhc3MpOwotICAgIGFzc2VydFRydWUocmVzdWx0cy5zaXplKCkgPiAwKTsKLSAgICBhc3NlcnRFcXVhbHMoIi9sb2NhbGhvc3QvbmZkIiwgcmVzdWx0cy5nZXQoMCkuZ2V0TmFtZSgpLnRvVXJpKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvSW50ZWdyYXRpb25TdWl0ZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L0ludGVncmF0aW9uU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzMjcxMS4uMDAwMDAwMAotLS0gYS9zcmMvdGVzdC9qYXZhL2NvbS9pbnRlbC9qbmRuL21hbmFnZW1lbnQvSW50ZWdyYXRpb25TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIGpuZG4tbWFuYWdlbWVudAotICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCi0gKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotcGFja2FnZSBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50OwotCi1pbXBvcnQgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudC50eXBlcy5SaWJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkZhY2U7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5OYW1lOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uc2VjdXJpdHkuS2V5Q2hhaW47Ci0KLS8qKgotICogVGVzdHMgdG8gcnVuIHdpdGggYSBsb2NhbCBORkQgYXMgcGFydCBvZiBpbnRlZ3JhdGlvbiB0ZXN0aW5nOyB3aWxsIG5vdCBydW4gaW4KLSAqIHRoZSBtYXZlbiB0ZXN0IHBoYXNlLCBtdXN0IGJlIHJ1biBtYW51YWxseS4KLSAqCi0gKiBAYXV0aG9yIEFuZHJldyBCcm93biA8YW5kcmV3LmJyb3duQGludGVsLmNvbT4KLSAqLwotcHVibGljIGNsYXNzIEludGVncmF0aW9uU3VpdGUgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEludGVncmF0aW9uU3VpdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAvKioKLSAgICogVGVzdCBORkQgbWV0aG9kcwotICAgKgotICAgKiBAcGFyYW0gYXJncwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmFjZSBmYWNlID0gbmV3IEZhY2UoImxvY2FsaG9zdCIpOwotICAgIEtleUNoYWluIGtleUNoYWluID0gYnVpbGRUZXN0S2V5Q2hhaW4oKTsKLSAgICBmYWNlLnNldENvbW1hbmRTaWduaW5nSW5mbyhrZXlDaGFpbiwga2V5Q2hhaW4uZ2V0RGVmYXVsdENlcnRpZmljYXRlTmFtZSgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKE5GRC5waW5nTG9jYWwoZmFjZSkpOwotCi0gICAgLy8gZ3JhYiBkYXRhc2V0cwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShORkQuZ2V0RmFjZUxpc3QoZmFjZSkuaXNFbXB0eSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoTkZELmdldEZpYkxpc3QoZmFjZSkuaXNFbXB0eSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoTkZELmdldFJvdXRlTGlzdChmYWNlKS5pc0VtcHR5KCkpOwotCi0gICAgLy8gY3JlYXRlIGEgbmV3IHJvdXRlCi0gICAgTkZELnJlZ2lzdGVyKGZhY2UsICJ1ZHA0Oi8vMTI3LjAuMC4xOjU2MzYzIiwgbmV3IE5hbWUoIi9teS90ZXN0L3JvdXRlIiksIDk5OSk7Ci0gICAgCi0gICAgLy8gY2hlY2sgdGhhdCByb3V0ZSBpcyBjcmVhdGVkCi0gICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgIGZvcihSaWJFbnRyeSByb3V0ZSA6IE5GRC5nZXRSb3V0ZUxpc3QoZmFjZSkpewotICAgICAgbG9nZ2VyLmluZm8oIkZvdW5kIHJvdXRlOiAiICsgcm91dGUuZ2V0TmFtZSgpLnRvVXJpKCkpOwotICAgICAgaWYocm91dGUuZ2V0TmFtZSgpLmVxdWFscyhuZXcgTmFtZSgiL215L3Rlc3Qvcm91dGUiKSkpewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvdW5kKTsKLQotICAgIC8vIHJlbW92ZSB0aGUgcm91dGUKLSAgICBORkQudW5yZWdpc3RlcihmYWNlLCBuZXcgTmFtZSgiL215L3Rlc3Qvcm91dGUiKSwgInVkcDQ6Ly8xMjcuMC4wLjE6NTYzNjMiKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXR1cCB0aGUgS2V5Q2hhaW4gd2l0aCBhIGRlZmF1bHQgaWRlbnRpdHk7IFRPRE8gbW92ZSB0aGlzIHRvCi0gICAqIE1lbW9yeUlkZW50aXR5U3RvcmFnZSBvbmNlIGl0IGNhbiBoYW5kbGUgZ2V0dGluZy9zZXR0aW5nIGRlZmF1bHRzCi0gICAqCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBuZXQubmFtZWRfZGF0YS5qbmRuLnNlY3VyaXR5LlNlY3VyaXR5RXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEtleUNoYWluIGJ1aWxkVGVzdEtleUNoYWluKCkgdGhyb3dzIG5ldC5uYW1lZF9kYXRhLmpuZG4uc2VjdXJpdHkuU2VjdXJpdHlFeGNlcHRpb24gewotICAgIEtleUNoYWluIGtleUNoYWluID0gbmV3IEtleUNoYWluKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGtleUNoYWluLmdldERlZmF1bHRDZXJ0aWZpY2F0ZU5hbWUoKTsKLSAgICB9IGNhdGNoIChuZXQubmFtZWRfZGF0YS5qbmRuLnNlY3VyaXR5LlNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgIGtleUNoYWluLmNyZWF0ZUlkZW50aXR5KG5ldyBOYW1lKCIvdGVzdC9pZGVudGl0eSIpKTsKLSAgICAgIGtleUNoYWluLmdldElkZW50aXR5TWFuYWdlcigpLnNldERlZmF1bHRJZGVudGl0eShuZXcgTmFtZSgiL3Rlc3QvaWRlbnRpdHkiKSk7Ci0gICAgfQotICAgIHJldHVybiBrZXlDaGFpbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L0xvY2FsQ29udHJvbEhlYWRlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9Mb2NhbENvbnRyb2xIZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODY2MTYuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L0xvY2FsQ29udHJvbEhlYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudDsKLQotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuTG9jYWxDb250cm9sSGVhZGVyOwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLnV0aWxzLlNpbXBsZUNsaWVudDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkRhdGE7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5GYWNlOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uc2VjdXJpdHkuS2V5Q2hhaW47Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotLyoqCi0gKiBUZXN0IGZ1bmN0aW9uYWxpdHkgZm9yIExvY2FsQ29udHJvbEhlYWRlcgotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxDb250cm9sSGVhZGVyVGVzdCB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSW50ZWdyYXRpb25TdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gIC8qKgotICAgKiBJbnRlZ3JhdGlvbiB0ZXN0IHRvIHJ1biBvbiBhY3R1YWwgc3lzdGVtCi0gICAqCi0gICAqIEBwYXJhbSBhcmdzCi0gICAqIEB0aHJvd3MgRW5jb2RpbmdFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIHNldHVwIGZvcndhcmRlciBmYWNlCi0gICAgRmFjZSBmb3J3YXJkZXIgPSBuZXcgRmFjZSgibG9jYWxob3N0Iik7Ci0gICAgS2V5Q2hhaW4ga2V5Q2hhaW4gPSBJbnRlZ3JhdGlvblN1aXRlLmJ1aWxkVGVzdEtleUNoYWluKCk7Ci0gICAgZm9yd2FyZGVyLnNldENvbW1hbmRTaWduaW5nSW5mbyhrZXlDaGFpbiwga2V5Q2hhaW4uZ2V0RGVmYXVsdENlcnRpZmljYXRlTmFtZSgpKTsKLQotICAgIC8vIGVuYWJsZSBpbmNvbWluZyBmYWNlIElEIGhlYWRlcgotICAgIE5GRC5lbmFibGVMb2NhbENvbnRyb2xIZWFkZXIoZm9yd2FyZGVyLCBMb2NhbENvbnRyb2xIZWFkZXIuSU5DT01JTkdfRkFDRV9JRCk7Ci0gICAgCi0gICAgLy8gdXNlIGFuZCB2ZXJpZnkKLSAgICBEYXRhIGRhdGEgPSBTaW1wbGVDbGllbnQuZ2V0RGVmYXVsdCgpLmdldFN5bmMoZm9yd2FyZGVyLCBuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQiKSk7Ci0gICAgbG9uZyBmYWNlSWQgPSBkYXRhLmdldEluY29taW5nRmFjZUlkKCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoZmFjZUlkICE9IC0xKTsgLy8gdGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBoZWFkZXJzIGFyZSB3b3JraW5nIGNvcnJlY3RseQotICAgIGxvZ2dlci5pbmZvKCJGYWNlIElEIGZvciB0aGlzIGNsaWVudCBvbiB0aGUgZm9yd2FyZGVyOiAiICsgZmFjZUlkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L1JpYkVudHJ5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9jb20vaW50ZWwvam5kbi9tYW5hZ2VtZW50L1JpYkVudHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYzYWJiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L2phdmEvY29tL2ludGVsL2puZG4vbWFuYWdlbWVudC9SaWJFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBqbmRuLW1hbmFnZW1lbnQKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAzLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLXBhY2thZ2UgY29tLmludGVsLmpuZG4ubWFuYWdlbWVudDsKLQotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuU3RhdHVzRGF0YXNldDsKLWltcG9ydCBjb20uaW50ZWwuam5kbi5tYW5hZ2VtZW50LnR5cGVzLlJpYkVudHJ5OwotaW1wb3J0IGNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQudHlwZXMuUm91dGU7Ci1pbXBvcnQgY29tLmludGVsLmpuZG4udXRpbHMuU2ltcGxlQ2xpZW50OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgbmV0Lm5hbWVkX2RhdGEuam5kbi5EYXRhOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uRmFjZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLkludGVyZXN0OwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4uTmFtZTsKLWltcG9ydCBuZXQubmFtZWRfZGF0YS5qbmRuLmVuY29kaW5nLkVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IG5ldC5uYW1lZF9kYXRhLmpuZG4udXRpbC5CbG9iOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3QgZW5jb2RpbmcvZGVjb2RpbmcgZm9yIFJpYkVudHJ5LgotICoKLSAqIEBhdXRob3IgQW5kcmV3IEJyb3duIDxhbmRyZXcuYnJvd25AaW50ZWwuY29tPgotICovCi1wdWJsaWMgY2xhc3MgUmliRW50cnlUZXN0IHsKLQotICAvKioKLSAgICogVGVzdCBlbmNvZGluZy9kZWNvZGluZwotICAgKgotICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICovCi0gIEBUZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVEZWNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBSb3V0ZSByb3V0ZSA9IG5ldyBSb3V0ZSgpOwotICAgIHJvdXRlLnNldEZhY2VJZCg0Mik7Ci0gICAgcm91dGUuc2V0Q29zdCgxMDApOwotICAgIHJvdXRlLnNldE9yaWdpbigwKTsKLSAgICBSaWJFbnRyeSBlbnRyeSA9IG5ldyBSaWJFbnRyeSgpOwotICAgIGVudHJ5LnNldE5hbWUobmV3IE5hbWUoIi9yaWIvZW50cnkvdGVzdCIpKTsKLSAgICBlbnRyeS5nZXRSb3V0ZXMoKS5hZGQocm91dGUpOwotCi0gICAgLy8gZW5jb2RlCi0gICAgQmxvYiBlbmNvZGVkID0gZW50cnkud2lyZUVuY29kZSgpOwotCi0gICAgLy8gZGVjb2RlCi0gICAgUmliRW50cnkgZGVjb2RlZCA9IG5ldyBSaWJFbnRyeSgpOwotICAgIGRlY29kZWQud2lyZURlY29kZShlbmNvZGVkLmJ1ZigpKTsKLQotICAgIC8vIHRlc3QKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudHJ5LmdldE5hbWUoKS50b1VyaSgpLCBkZWNvZGVkLmdldE5hbWUoKS50b1VyaSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudHJ5LmdldFJvdXRlcygpLmdldCgwKS5nZXRGYWNlSWQoKSwgZGVjb2RlZC5nZXRSb3V0ZXMoKS5nZXQoMCkuZ2V0RmFjZUlkKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZW50cnkuZ2V0Um91dGVzKCkuZ2V0KDApLmdldENvc3QoKSwgZGVjb2RlZC5nZXRSb3V0ZXMoKS5nZXQoMCkuZ2V0Q29zdCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudHJ5LmdldFJvdXRlcygpLmdldCgwKS5nZXRPcmlnaW4oKSwgZGVjb2RlZC5nZXRSb3V0ZXMoKS5nZXQoMCkuZ2V0T3JpZ2luKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEludGVncmF0aW9uIHRlc3QgdG8gcnVuIG9uIGFjdHVhbCBzeXN0ZW0KLSAgICoKLSAgICogQHBhcmFtIGFyZ3MKLSAgICogQHRocm93cyBFbmNvZGluZ0V4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmFjZSBmb3J3YXJkZXIgPSBuZXcgRmFjZSgibG9jYWxob3N0Iik7Ci0KLSAgICAvLyBidWlsZCBtYW5hZ2VtZW50IEludGVyZXN0IHBhY2tldDsgc2VlIGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL1N0YXR1c0RhdGFzZXQKLSAgICBJbnRlcmVzdCBpbnRlcmVzdCA9IG5ldyBJbnRlcmVzdChuZXcgTmFtZSgiL2xvY2FsaG9zdC9uZmQvcmliL2xpc3QiKSk7Ci0gICAgaW50ZXJlc3Quc2V0TXVzdEJlRnJlc2godHJ1ZSk7Ci0gICAgaW50ZXJlc3Quc2V0Q2hpbGRTZWxlY3RvcihJbnRlcmVzdC5DSElMRF9TRUxFQ1RPUl9SSUdIVCk7Ci0gICAgaW50ZXJlc3Quc2V0SW50ZXJlc3RMaWZldGltZU1pbGxpc2Vjb25kcygyMDAwLjApOwotCi0gICAgLy8gc2VuZCBwYWNrZXQKLSAgICBEYXRhIGRhdGEgPSBTaW1wbGVDbGllbnQuZ2V0RGVmYXVsdCgpLmdldFN5bmMoZm9yd2FyZGVyLCBpbnRlcmVzdCk7Ci0KLSAgICAvLyBkZWNvZGUgcmVzdWx0cwotICAgIExpc3Q8UmliRW50cnk+IHJlc3VsdHMgPSBTdGF0dXNEYXRhc2V0LndpcmVEZWNvZGUoZGF0YS5nZXRDb250ZW50KCksIFJpYkVudHJ5LmNsYXNzKTsKLSAgICBhc3NlcnRUcnVlKHJlc3VsdHMuc2l6ZSgpID4gMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIvbG9jYWxob3N0L25mZC9yaWIiLCByZXN1bHRzLmdldCgwKS5nZXROYW1lKCkudG9VcmkoKSk7Ci0gIH0KLX0K