ZGlmZiAtLWdpdCBhL2N1cnJlbnQvTElDRU5TRSBiL2N1cnJlbnQvTElDRU5TRQppbmRleCA4NzJmZTFjLi5iMWM3NGY5IDEwMDY0NAotLS0gYS9jdXJyZW50L0xJQ0VOU0UKKysrIGIvY3VycmVudC9MSUNFTlNFCkBAIC0xLDI2MyArMSw3NTkgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCitDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMQogCiAxLiBEZWZpbml0aW9ucy4KIAotICAgMS4xLiBDb250cmlidXRvci4gbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCisgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yCisgICAgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCiAKLSAgIDEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbi4gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KKyAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsCisgICAgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQKKyAgICB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KIAotICAgMS4zLiBDb3ZlcmVkIFNvZnR3YXJlLiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisgICAgMS4zLiAiQ292ZXJlZCBTb2Z0d2FyZSIgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpCisgICAgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsCisgICAgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcKKyAgICBwb3J0aW9ucyB0aGVyZW9mLgogCi0gICAxLjQuIEV4ZWN1dGFibGUuIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCisgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbgorICAgIFNvdXJjZSBDb2RlLgogCi0gICAxLjUuIEluaXRpYWwgRGV2ZWxvcGVyLiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgorICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdAorICAgIG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCiAKLSAgIDEuNi4gTGFyZ2VyIFdvcmsuIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvcgorICAgIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgogCi0gICAxLjcuIExpY2Vuc2UuIG1lYW5zIHRoaXMgZG9jdW1lbnQuCisgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4KIAotICAgMS44LiBMaWNlbnNhYmxlLiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KKyAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bQorICAgIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvcgorICAgIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCiAKLSAgIDEuOS4gTW9kaWZpY2F0aW9ucy4gbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YKKyAgICBhbnkgb2YgdGhlIGZvbGxvd2luZzoKIAotICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7CisgICAgQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IKKyAgICBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlCisgICAgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKIAotICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgorICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvcgorICAgIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKIAotICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKyAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUKKyAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgogCi0gICAxLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZS4gbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgorICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0KKyAgICBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzCisgICAgTGljZW5zZS4KIAotICAgMS4xMS4gUGF0ZW50IENsYWltcy4gbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCisgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvcgorICAgIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLAorICAgIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KIAotICAgMS4xMi4gU291cmNlIENvZGUuIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgorICAgIDEuMTIuICJTb3VyY2UgQ29kZSIgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZQorICAgIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQKKyAgICBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgogCi0gICAxLjEzLiBZb3UuIChvciAuWW91ci4pIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgLllvdS4gaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIC5jb250cm9sLiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKyAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5CisgICAgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLAorICAgIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoCisgICAgY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IKKyAgICBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3QKKyAgICBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LAorICAgIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbgorICAgIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsCisgICAgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgogCiAyLiBMaWNlbnNlIEdyYW50cy4KIAotICAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCisgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCiAKLSAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CisgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdAorICAgIHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlcgorICAgIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CiAKLSAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgorICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsCisgICAgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCisgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCiAKLSAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCisgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YKKyAgICBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQKKyAgICBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQorICAgIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KIAotICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24KKyAgICB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlCisgICAgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMKKyAgICBMaWNlbnNlLgogCi0gICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KKyAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcworICAgIGdyYW50ZWQ6ICgxKSBmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yCisgICAgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQorICAgIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KIAogICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCiAKLSAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKKyAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0CisgICAgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CiAKLSAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCisgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yCisgICAgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksCisgICAgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucworICAgIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbgorICAgIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZQorICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAogCi0gICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCisgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nCisgICAgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbgorICAgIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKKyAgICBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yCisgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IKKyAgICBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5CisgICAgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoCisgICAgY29tYmluYXRpb24pLgogCi0gICAgICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjIoYSkgYW5kIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KKyAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZQorICAgIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUKKyAgICBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgogCi0gICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuCisgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMKKyAgICBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUKKyAgICBDb250cmlidXRvciBWZXJzaW9uOyAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQKKyAgICBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uCisgICAgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZQorICAgIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpCisgICAgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZgorICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgogCiAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCiAKLSAgICAgIDMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKyAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KIAotICAgICAgMy4yLiBNb2RpZmljYXRpb25zLgotICAgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKyAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZQorICAgIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybQorICAgIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcworICAgIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkKKyAgICBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlCisgICAgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaAorICAgIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaAorICAgIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yCisgICAgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KIAotICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KKyAgICAzLjIuIE1vZGlmaWNhdGlvbnMuCiAKLSAgICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLSAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMuIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCisgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZQorICAgIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UKKyAgICBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91CisgICAgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KIAotICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLSAgICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50LnMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgorICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KIAotICAgICAgMy42LiBMYXJnZXIgV29ya3MuCi0gICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KKyAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQKKyAgICBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QKKyAgICByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZAorICAgIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueQorICAgIGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUKKyAgICBJbml0aWFsIERldmVsb3Blci4KKworICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KKworICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4KKyAgICBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mCisgICAgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0bworICAgIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvcgorICAgIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuCisgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YKKyAgICB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0CisgICAgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IKKyAgICBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUKKyAgICB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55CisgICAgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEKKyAgICByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgorCisgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KKworICAgIFlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyCisgICAgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIKKyAgICBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwKKyAgICBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UKKyAgICBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvCisgICAgbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tCisgICAgdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlCisgICAgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UKKyAgICBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IKKyAgICBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZAorICAgIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsCisgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgorCisgICAgMy42LiBMYXJnZXIgV29ya3MuCisKKyAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGgKKyAgICBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlCisgICAgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlCisgICAgc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlLgogCiA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KIAotICAgICAgNC4xLiBOZXcgVmVyc2lvbnMuCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KKyAgICA0LjEuIE5ldyBWZXJzaW9ucy4KIAotICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZyBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4KKyAgICBPcmFjbGUgaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vcgorICAgIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlCisgICAgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24KKyAgICA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkKKyAgICB0aGlzIExpY2Vuc2UuCiAKLSAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0gICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KKyAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCisKKyAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlCisgICAgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZQorICAgIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmCisgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQorICAgIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlCisgICAgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQKKyAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24KKyAgICBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZAorICAgIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yCisgICAgb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkKKyAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCisKKyAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgorCisgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcKKyAgICBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEKKyAgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUgdGhlIGxpY2Vuc2UgYW5kCisgICAgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0bworICAgIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UKKyAgICBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcworICAgIExpY2Vuc2UuCiAKIDUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCiAKLSAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIC5BUyBJUy4gQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCisgICAgQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCisgICAgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRQorICAgIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCisgICAgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YKKyAgICBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFCisgICAgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZCisgICAgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywKKyAgICBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOCisgICAgRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMKKyAgICBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgogCiA2LiBURVJNSU5BVElPTi4KIAotICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgorICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlCisgICAgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8KKyAgICBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guCisgICAgUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZQorICAgIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgogCi0gICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAuUGFydGljaXBhbnQuKSBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvciBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KKyAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcKKyAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEKKyAgICBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UKKyAgICBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKSBhbGxlZ2luZyB0aGF0IHRoZQorICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZQorICAgIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZQorICAgIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgIGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yCisgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUKKyAgICBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlcgorICAgIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZQorICAgIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlCisgICAgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAKKyAgICBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUgUGFydGljaXBhbnQKKyAgICBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0bworICAgIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KIAotICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KKyAgICA2LjMuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIGFnYWluc3QgUGFydGljaXBhbnQKKyAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICAgaW5mcmluZ2VzIGFueSBwYXRlbnQgd2hlcmUgc3VjaCBjbGFpbSBpcyByZXNvbHZlZCAoc3VjaCBhcyBieQorICAgIGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50CisgICAgaW5mcmluZ2VtZW50IGxpdGlnYXRpb24sIHRoZW4gdGhlIHJlYXNvbmFibGUgdmFsdWUgb2YgdGhlIGxpY2Vuc2VzCisgICAgZ3JhbnRlZCBieSBzdWNoIFBhcnRpY2lwYW50IHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIgc2hhbGwgYmUgdGFrZW4KKyAgICBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvcgorICAgIGxpY2Vuc2UuCisKKyAgICA2LjQuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yIGFib3ZlLAorICAgIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueQorICAgIGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzCisgICAgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgogCiA3LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KIAotICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFkuUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgorICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUCisgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUKKyAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YKKyAgICBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFCisgICAgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUgorICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVAorICAgIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSCisgICAgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SCisgICAgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QKKyAgICBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNICisgICAgUEFSVFknUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0gKKyAgICBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IKKyAgICBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTgorICAgIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgogCiA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgogCi0gICBUaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIC5jb21tZXJjaWFsIGl0ZW0sLiBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgLmNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUuIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gwrogMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgLmNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbi4gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCisgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQKKyAgICBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKKyAgICBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDCpworICAgIDI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24iCisgICAgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudAorICAgIHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00CisgICAgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZQorICAgIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzCisgICAgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlcgorICAgIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIKKyAgICBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCiAKIDkuIE1JU0NFTExBTkVPVVMuCiAKLSAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9uLnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cy4gZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KKyAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAorICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKKyAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQKKyAgICBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5CisgICAgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluCisgICAgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LAorICAgIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbidzIGNvbmZsaWN0LW9mLWxhdworICAgIHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0CisgICAgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQKKyAgICB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsCisgICAgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0CisgICAgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4KKyAgICBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvcgorICAgIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yCisgICAgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlCisgICAgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91CisgICAgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZAorICAgIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wKKyAgICBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwgZGlzdHJpYnV0ZQorICAgIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KIAogMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCiAKLSAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KKyAgICBBcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzCisgICAgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LAorICAgIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvCisgICAgd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoCisgICAgcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvcgorICAgIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgogCi0gICBOT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgIFRoZSBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuCitOT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTgorTElDRU5TRSAoQ0RETCkKKworVGhlIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCitTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkKK2xpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbgorb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUKK3N0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYQorQ291bnR5LCBDYWxpZm9ybmlhLgogCiAKLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCi1Db3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCitDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCis1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCitCb3N0b24sIE1BIDAyMTEwLTEzMzUKK1VTQQogCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKK29mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgogCiBQcmVhbWJsZQogCi1UaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiBUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcworaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUgc29mdHdhcmUtLXRvCittYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQKK3RvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAoU29tZSBvdGhlciBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KIAotV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4KK091ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlCitmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMKK3NlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCiAKLVRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCitUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZQordG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuIFRoZXNlCityZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgogCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCitGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuCitZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuCitBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCiAKLVdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KK1dlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgogCi1BbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KK0Fsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCiAKLUZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbAoraW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0KK3Byb3ByaWV0YXJ5LiBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdAorYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KIAotVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQorVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCiAKIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgogCi0wLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCiswLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zIGEKK25vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlcgordGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycwordG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMKK2VpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMKK3RvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIKK3ZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuCisoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybQorIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KIAotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcKK3RoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzCitjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtCisoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0CitpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgogCi0xLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKzEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UKK2NvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkKK2FuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UKK2FuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0bwordGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlcgorcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCiAKLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgogCi0yLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mCitpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUKK3N1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkCit0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CiAKLSAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCiAKLSAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbiB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0CisgICAgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMKKyAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgogCi0gICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dCBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UKKyAgICB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhCisgICAgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UKKyAgICBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLgorICAgIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3QKKyAgICBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtCisgICAgaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCiAKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZiBpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZSBzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuIEJ1dCB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwgYW5kCitjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZCBvbgordGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUKK3dob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgogCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgeW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvIGV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvciBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KIAotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSB3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhCitzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlCitzY29wZSBvZiB0aGlzIExpY2Vuc2UuCiAKLTMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKIAotICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxCisgICAgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAogCi0gICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdAorICAgIG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAogCi0gICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIgdG8KKyAgICBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQKKyAgICBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlCisgICAgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoIGFuIG9mZmVyLCBpbgorICAgIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCiAKLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUKK21lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wKK2NvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbAorZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlCitleGVjdXRhYmxlLgogCi1JZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MKK3RvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weQordGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlCitjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZQorYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCiAKLTQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlCit0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbAorYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiBIb3dldmVyLCBwYXJ0aWVzCit3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwKK25vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluCitmdWxsIGNvbXBsaWFuY2UuCiAKLTUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKzUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwKK2l0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUKK1Byb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCiAKLTYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgorNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zCitvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QKK3Jlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KIAotNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudCBpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLCBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKzcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUKK3NvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kCithbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZAorbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYWxsIHRob3NlIHdobworcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91Citjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20KK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KIAotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCiAKLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkgcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdCBzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdCBjaG9pY2UuCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzIGltcGxlbWVudGVkCitieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuIE1hbnkgcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cworY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQKK3N5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQgc3lzdGVtOyBpdCBpcyB1cCB0bwordGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8gZGlzdHJpYnV0ZQorc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdCBjaG9pY2UuCiAKLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZQorYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCiAKLTguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkKK2FkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlCitjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcworbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUKK2xpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCiAKLTkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcKK3ZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heQorZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KIAotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbgorbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAKLTEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUgcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlCithdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlCitzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlCit0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlCitzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCiAKIE5PIFdBUlJBTlRZCiAKLTExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUKK0VOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRICitZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMCitORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KIAotMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IKK0RBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTQorKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKK0lOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YKK1RIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SCitPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAKIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwogCi0KIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcwogCi1JZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQgZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KIAotVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0bworYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkKK3RoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgogCi0gICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KKyAgICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiA8bmFtZSBvZiBhdXRob3I+CiAKLSAgIENvcHlyaWdodCAoQykKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMzUgVVNBCiAKIEFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgogCi1JZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgogCi0gICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKLSAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlCisgICAgYHNob3cgdycuIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUKKyAgICBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCiAKLVRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlIG1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUKK2FwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcworeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleQorY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgogCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91ciBzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CiAKLSAgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0gYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisgICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgICBwcm9ncmFtIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkKKyAgICBKYW1lcyBIYWNrZXIuCiAKLSAgIHNpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKLSAgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisgICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQorICAgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCiAKLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zCit3aXRoIHRoZSBsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCiAKKyMKIAotIkNMQVNTUEFUSCIgRVhDRVBUSU9OIFRPIFRIRSBHUEwgVkVSU0lPTiAyCitDZXJ0YWluIHNvdXJjZSBmaWxlcyBkaXN0cmlidXRlZCBieSBPcmFjbGUgQW1lcmljYSwgSW5jLiBhbmQvb3IgaXRzCithZmZpbGlhdGVzIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbAorZXhjZXB0aW9uIHRvIHRoZSBHUEx2MiwgYmFzZWQgb24gdGhlIEdOVSBQcm9qZWN0IGV4Y2VwdGlvbiBmb3IgaXRzCitDbGFzc3BhdGggbGlicmFyaWVzLCBrbm93biBhcyB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIGJ1dCBvbmx5Cit3aGVyZSBPcmFjbGUgaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzCitoZWFkZXIgdGhlIHdvcmRzICJPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvCit0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlCit0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4iCiAKLUNlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIFZlcnNpb24gMiwgYnV0IG9ubHkgd2hlcmUgU3VuIGhhcyBleHByZXNzbHkgaW5jbHVkZWQgaW4gdGhlIHBhcnRpY3VsYXIgc291cmNlIGZpbGUncyBoZWFkZXIgdGhlIHdvcmRzCitZb3Ugc2hvdWxkIGFsc28gbm90ZSB0aGF0IE9yYWNsZSBpbmNsdWRlcyBtdWx0aXBsZSwgaW5kZXBlbmRlbnQKK3Byb2dyYW1zIGluIHRoaXMgc29mdHdhcmUgcGFja2FnZS4gU29tZSBvZiB0aG9zZSBwcm9ncmFtcyBhcmUgcHJvdmlkZWQKK3VuZGVyIGxpY2Vuc2VzIGRlZW1lZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgR1BMdjIgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24gYW5kIG90aGVycy4gIEZvciBleGFtcGxlLCB0aGUgcGFja2FnZSBpbmNsdWRlcyBwcm9ncmFtcworbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gIFN1Y2ggcHJvZ3JhbXMgYXJlCitsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlaXIgb3JpZ2luYWwgbGljZW5zZXMuCiAKLSJTdW4gZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgU3VuIGluIHRoZSBMaWNlbnNlIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuIgorT3JhY2xlIGZhY2lsaXRhdGVzIHlvdXIgZnVydGhlciBkaXN0cmlidXRpb24gb2YgdGhpcyBwYWNrYWdlIGJ5IGFkZGluZwordGhlIENsYXNzcGF0aCBFeGNlcHRpb24gdG8gdGhlIG5lY2Vzc2FyeSBwYXJ0cyBvZiBpdHMgR1BMdjIgY29kZSwgd2hpY2gKK3Blcm1pdHMgeW91IHRvIHVzZSB0aGF0IGNvZGUgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBpbmRlcGVuZGVudAorbW9kdWxlcyBub3QgbGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyLiAgSG93ZXZlciwgbm90ZSB0aGF0IHRoaXMgd291bGQKK25vdCBwZXJtaXQgeW91IHRvIGNvbW1pbmdsZSBjb2RlIHVuZGVyIGFuIGluY29tcGF0aWJsZSBsaWNlbnNlIHdpdGgKK09yYWNsZSdzIEdQTHYyIGxpY2Vuc2VkIGNvZGUgYnksIGZvciBleGFtcGxlLCBjdXR0aW5nIGFuZCBwYXN0aW5nIHN1Y2gKK2NvZGUgaW50byBhIGZpbGUgYWxzbyBjb250YWluaW5nIE9yYWNsZSdzIEdQTHYyIGxpY2Vuc2VkIGNvZGUgYW5kIHRoZW4KK2Rpc3RyaWJ1dGluZyB0aGUgcmVzdWx0LiAgQWRkaXRpb25hbGx5LCBpZiB5b3Ugd2VyZSB0byByZW1vdmUgdGhlCitDbGFzc3BhdGggRXhjZXB0aW9uIGZyb20gYW55IG9mIHRoZSBmaWxlcyB0byB3aGljaCBpdCBhcHBsaWVzIGFuZAorZGlzdHJpYnV0ZSB0aGUgcmVzdWx0LCB5b3Ugd291bGQgbGlrZWx5IGJlIHJlcXVpcmVkIHRvIGxpY2Vuc2Ugc29tZSBvcgorYWxsIG9mIHRoZSBvdGhlciBjb2RlIGluIHRoYXQgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBHUEx2MiBhcyB3ZWxsLCBhbmQKK3NpbmNlIHRoZSBHUEx2MiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbGljZW5zZSB0ZXJtcyBvZiBzb21lIGl0ZW1zCitpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGJ5IE9yYWNsZSwgcmVtb3ZpbmcgdGhlIENsYXNzcGF0aAorRXhjZXB0aW9uIGNvdWxkIHRoZXJlZm9yZSBlZmZlY3RpdmVseSBjb21wcm9taXNlIHlvdXIgYWJpbGl0eSB0bworZnVydGhlciBkaXN0cmlidXRlIHRoZSBwYWNrYWdlLgogCi1MaW5raW5nIHRoaXMgbGlicmFyeSBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcyBtYWtpbmcgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gVGh1cywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgorUHJvY2VlZCB3aXRoIGNhdXRpb24gYW5kIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBvYnRhaW4gdGhlIGFkdmljZSBvZiBhCitsYXd5ZXIgc2tpbGxlZCBpbiBvcGVuIHNvdXJjZSBtYXR0ZXJzIGJlZm9yZSByZW1vdmluZyB0aGUgQ2xhc3NwYXRoCitFeGNlcHRpb24gb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBwYWNrYWdlIHdoaWNoIG1heQorc3Vic2VxdWVudGx5IGJlIHJlZGlzdHJpYnV0ZWQgYW5kL29yIGludm9sdmUgdGhlIHVzZSBvZiB0aGlyZCBwYXJ0eQorc29mdHdhcmUuCiAKLUFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIGxpYnJhcnkgZ2l2ZSB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZXNlIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuPyBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSBvciBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuPyBJZiB5b3UgbW9kaWZ5IHRoaXMgbGlicmFyeSwgeW91IG1heSBleHRlbmQgdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBidXQgeW91IGFyZSBub3Qgb2JsaWdhdGVkIHRvIGRvIHNvLj8gSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLgorQ0xBU1NQQVRIIEVYQ0VQVElPTgorTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMKK21ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgVGh1cywgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGNvdmVyIHRoZSB3aG9sZQorY29tYmluYXRpb24uCisKK0FzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIGxpYnJhcnkgZ2l2ZSB5b3UKK3Blcm1pc3Npb24gdG8gbGluayB0aGlzIGxpYnJhcnkgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzIHRvIHByb2R1Y2UgYW4KK2V4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQKK21vZHVsZXMsIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlcgordGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkCitpbmRlcGVuZGVudCBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0Cittb2R1bGUuICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSBvcgorYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgSWYgeW91IG1vZGlmeSB0aGlzIGxpYnJhcnksIHlvdSBtYXkgZXh0ZW5kIHRoaXMKK2V4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8KK2RvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50Citmcm9tIHlvdXIgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvYXV0aC9NRDQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvYXV0aC9NRDQuamF2YQppbmRleCA1ZmUwOTRjLi42OTc5ZjEwIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvTUQ0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9hdXRoL01ENC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9hdXRoL050bG0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvYXV0aC9OdGxtLmphdmEKaW5kZXggNTczNTRhNC4uNTYxZjQzMiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9hdXRoL050bG0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvTnRsbS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMzU5LDcgKzM1OSw3IEBACiAJeyAnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRicgfTsKIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0hleChieXRlW10gYikgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoYi5sZW5ndGggKiAzKTsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoYi5sZW5ndGggKiAzKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspCiAJICAgIHNiLmFwcGVuZChoZXhbKGJbaV0+PjQpJjB4Rl0pLmFwcGVuZChoZXhbYltpXSYweEZdKS5hcHBlbmQoJyAnKTsKIAlyZXR1cm4gc2IudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvYXV0aC9PQXV0aDJTYXNsQ2xpZW50LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvT0F1dGgyU2FzbENsaWVudC5qYXZhCmluZGV4IDZjNjhiMTguLjQyYWI3YzUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvYXV0aC9PQXV0aDJTYXNsQ2xpZW50LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9hdXRoL09BdXRoMlNhc2xDbGllbnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02OSwxNyArNjksMTcgQEAKIAl0aGlzLmNiaCA9IGNiaDsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVjaGFuaXNtTmFtZSgpIHsKIAlyZXR1cm4gIlhPQVVUSDIiOwogICAgIH0KIAotICAgIC8vQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzSW5pdGlhbFJlc3BvbnNlKCkgewogCXJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8vQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGVbXSBldmFsdWF0ZUNoYWxsZW5nZShieXRlW10gY2hhbGxlbmdlKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CiAJaWYgKGNvbXBsZXRlKQogCSAgICByZXR1cm4gbmV3IGJ5dGVbMF07CkBAIC0xMTQsMzEgKzExNCwzMSBAQAogCXJldHVybiByZXNwb25zZTsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CiAJcmV0dXJuIGNvbXBsZXRlOwogICAgIH0KIAotICAgIC8vQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQogCQkJCXRocm93cyBTYXNsRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPQVVUSDIgdW53cmFwIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBieXRlW10gd3JhcChieXRlW10gb3V0Z29pbmcsIGludCBvZmZzZXQsIGludCBsZW4pCiAJCQkJdGhyb3dzIFNhc2xFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9BVVRIMiB3cmFwIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewogCWlmICghY29tcGxldGUpCiAJICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9BVVRIMiBnZXROZWdvdGlhdGVkUHJvcGVydHkiKTsKIAlyZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9hdXRoL09BdXRoMlNhc2xDbGllbnRGYWN0b3J5LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvT0F1dGgyU2FzbENsaWVudEZhY3RvcnkuamF2YQppbmRleCAzNzI0NjRjLi4yMWZjMjA4IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvT0F1dGgyU2FzbENsaWVudEZhY3RvcnkuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2F1dGgvT0F1dGgyU2FzbENsaWVudEZhY3RvcnkuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02NSw3ICs2NSw3IEBACiAJfQogICAgIH0KIAotICAgIC8vQE92ZXJyaWRlCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNhc2xDbGllbnQgY3JlYXRlU2FzbENsaWVudChTdHJpbmdbXSBtZWNoYW5pc21zLAogCQkJCVN0cmluZyBhdXRob3JpemF0aW9uSWQsIFN0cmluZyBwcm90b2NvbCwKIAkJCQlTdHJpbmcgc2VydmVyTmFtZSwgTWFwPFN0cmluZyw/PiBwcm9wcywKQEAgLTc3LDcgKzc3LDcgQEAKIAlyZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICAvL0BPdmVycmlkZQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZWNoYW5pc21OYW1lcyhNYXA8U3RyaW5nLD8+IHByb3BzKSB7CiAJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJYT0FVVEgyIiB9OwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvaGFuZGxlcl9iYXNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2hhbmRsZXJfYmFzZS5qYXZhCmluZGV4IDJlZDk5ZDEuLjMxZmI0ZjQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvaGFuZGxlcl9iYXNlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy9oYW5kbGVyX2Jhc2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTUyLDEyICs1MiwxOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBBY3RpdmF0aW9uRGF0YUZsYXZvcnMgdGhhdCB3ZSBzdXBwb3J0LgogICAgICAqIFVzdWFsbHkgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JYXJyYXkgb2YgQWN0aXZhdGlvbkRhdGFGbGF2b3JzIHRoYXQgd2Ugc3VwcG9ydAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBY3RpdmF0aW9uRGF0YUZsYXZvcltdIGdldERhdGFGbGF2b3JzKCk7CiAKICAgICAvKioKICAgICAgKiBHaXZlbiB0aGUgZmxhdm9yIHRoYXQgbWF0Y2hlZCwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIG9iamVjdC4KICAgICAgKiBVc3VhbGx5IHRoZXJlJ3Mgb25seSBvbmUgZmxhdm9yIHNvIGp1c3QgY2FsbCBnZXRDb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtCWFGbGF2b3IJdGhlIEFjdGl2YXRpb25EYXRhRmxhdm9yCisgICAgICogQHBhcmFtCWRzCURhdGFTb3VyY2UgY29udGFpbmluZyB0aGUgZGF0YQorICAgICAqIEByZXR1cm4JdGhlIG9iamVjdAorICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIGVycm9ycyByZWFkaW5nIHRoZSBkYXRhCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREYXRhKEFjdGl2YXRpb25EYXRhRmxhdm9yIGFGbGF2b3IsIERhdGFTb3VyY2UgZHMpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTY5LDYgKzc2LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIERhdGFGbGF2b3JzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERhdGFGbGF2b3JbXSBnZXRUcmFuc2ZlckRhdGFGbGF2b3JzKCkgewogCUFjdGl2YXRpb25EYXRhRmxhdm9yW10gYWRmID0gZ2V0RGF0YUZsYXZvcnMoKTsKIAlpZiAoYWRmLmxlbmd0aCA9PSAxKQkvLyB0aGUgY29tbW9uIGNhc2UKQEAgLTgxLDEwICs4OSwxMiBAQAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgVHJhbnNmZXIgRGF0YSBvZiB0eXBlIERhdGFGbGF2b3IgZnJvbSBJbnB1dFN0cmVhbS4KICAgICAgKgotICAgICAqIEBwYXJhbSBkZiBUaGUgRGF0YUZsYXZvcgotICAgICAqIEBwYXJhbSBkcyBUaGUgRGF0YVNvdXJjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhCi0gICAgICogQHJldHVybiBTdHJpbmcgb2JqZWN0CisgICAgICogQHBhcmFtCWRmCVRoZSBEYXRhRmxhdm9yCisgICAgICogQHBhcmFtCWRzCVRoZSBEYXRhU291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuCXRoZSBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCWZvciBlcnJvcnMgcmVhZGluZyB0aGUgZGF0YQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJhbnNmZXJEYXRhKERhdGFGbGF2b3IgZGYsIERhdGFTb3VyY2UgZHMpIAogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlBY3RpdmF0aW9uRGF0YUZsYXZvcltdIGFkZiA9IGdldERhdGFGbGF2b3JzKCk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2ltYWdlX2dpZi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy9pbWFnZV9naWYuamF2YQppbmRleCA1NmY5MDVmLi45NWQzYTQ0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2ltYWdlX2dpZi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvaW1hZ2VfZ2lmLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC01MiwxMCArNTIsMTIgQEAKIAluZXcgQWN0aXZhdGlvbkRhdGFGbGF2b3IoSW1hZ2UuY2xhc3MsICJpbWFnZS9naWYiLCAiR0lGIEltYWdlIikKICAgICB9OwogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEFjdGl2YXRpb25EYXRhRmxhdm9yW10gZ2V0RGF0YUZsYXZvcnMoKSB7CiAJcmV0dXJuIG15REY7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KERhdGFTb3VyY2UgZHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJSW5wdXRTdHJlYW0gaXMgPSBkcy5nZXRJbnB1dFN0cmVhbSgpOwogCWludCBwb3MgPSAwOwpAQCAtODIsNiArODQsNyBAQAogICAgIC8qKgogICAgICAqIFdyaXRlIHRoZSBvYmplY3QgdG8gdGhlIG91dHB1dCBzdHJlYW0sIHVzaW5nIHRoZSBzcGVjaWZpZWQgTUlNRSB0eXBlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IG9iaiwgU3RyaW5nIHR5cGUsIE91dHB1dFN0cmVhbSBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgSW1hZ2UpKQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy9pbWFnZV9qcGVnLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2ltYWdlX2pwZWcuamF2YQppbmRleCA4Y2Y1Yjc1Li5lZjY2MzI5IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2ltYWdlX2pwZWcuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL2ltYWdlX2pwZWcuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTUxLDYgKzUxLDcgQEAKIAluZXcgQWN0aXZhdGlvbkRhdGFGbGF2b3IoSW1hZ2UuY2xhc3MsICJpbWFnZS9qcGVnIiwgIkpQRUcgSW1hZ2UiKQogICAgIH07CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQWN0aXZhdGlvbkRhdGFGbGF2b3JbXSBnZXREYXRhRmxhdm9ycygpIHsKIAlyZXR1cm4gbXlERjsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL21lc3NhZ2VfcmZjODIyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL21lc3NhZ2VfcmZjODIyLmphdmEKaW5kZXggYWRmZjUwNy4uYjQ4OGFiYyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy9tZXNzYWdlX3JmYzgyMi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvbWVzc2FnZV9yZmM4MjIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTU4LDYgKzU4LDcgQEAKIAluZXcgQWN0aXZhdGlvbkRhdGFGbGF2b3IoTWVzc2FnZS5jbGFzcywgIm1lc3NhZ2UvcmZjODIyIiwgIk1lc3NhZ2UiKQogICAgIH07CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQWN0aXZhdGlvbkRhdGFGbGF2b3JbXSBnZXREYXRhRmxhdm9ycygpIHsKIAlyZXR1cm4gb3VyRGF0YUZsYXZvcjsKICAgICB9CkBAIC02NSw2ICs2Niw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjb250ZW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudChEYXRhU291cmNlIGRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCS8vIGNyZWF0ZSBhIG5ldyBNaW1lTWVzc2FnZQogCXRyeSB7CkBAIC05Miw2ICs5NCw3IEBACiAgICAgLyoqCiAgICAgICogV3JpdGUgdGhlIG9iamVjdCBhcyBhIGJ5dGUgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IG9iaiwgU3RyaW5nIG1pbWVUeXBlLCBPdXRwdXRTdHJlYW0gb3MpIAogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkvLyBpZiB0aGUgb2JqZWN0IGlzIGEgbWVzc2FnZSwgd2Uga25vdyBob3cgdG8gd3JpdGUgdGhhdCBvdXQKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvbXVsdGlwYXJ0X21peGVkLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL211bHRpcGFydF9taXhlZC5qYXZhCmluZGV4IDU3ODAxYTMuLmY1YWYxZTAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvbXVsdGlwYXJ0X21peGVkLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy9tdWx0aXBhcnRfbWl4ZWQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTUzLDYgKzUzLDcgQEAKIAkJCQkgICAgIm11bHRpcGFydC9taXhlZCIsICJNdWx0aXBhcnQiKQogICAgIH07CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQWN0aXZhdGlvbkRhdGFGbGF2b3JbXSBnZXREYXRhRmxhdm9ycygpIHsKIAlyZXR1cm4gbXlERjsKICAgICB9CkBAIC02MCw2ICs2MSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjb250ZW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudChEYXRhU291cmNlIGRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXRyeSB7CiAJICAgIHJldHVybiBuZXcgTWltZU11bHRpcGFydChkcyk7IApAQCAtNzQsNiArNzYsNyBAQAogICAgIC8qKgogICAgICAqIFdyaXRlIHRoZSBvYmplY3QgdG8gdGhlIG91dHB1dCBzdHJlYW0sIHVzaW5nIHRoZSBzcGVjaWZpYyBNSU1FIHR5cGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3Qgb2JqLCBTdHJpbmcgbWltZVR5cGUsIE91dHB1dFN0cmVhbSBvcykgCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aXBhcnQpIHsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvdGV4dF9odG1sLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL3RleHRfaHRtbC5qYXZhCmluZGV4IDU1YTIwYWIuLmRkMTRhMDcgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvdGV4dF9odG1sLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy90ZXh0X2h0bWwuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTUxLDYgKzUxLDcgQEAKIAluZXcgQWN0aXZhdGlvbkRhdGFGbGF2b3IoU3RyaW5nLmNsYXNzLCAidGV4dC9odG1sIiwgIkhUTUwgU3RyaW5nIikKICAgICB9OwogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEFjdGl2YXRpb25EYXRhRmxhdm9yW10gZ2V0RGF0YUZsYXZvcnMoKSB7CiAJcmV0dXJuIG15REY7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy90ZXh0X3BsYWluLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL3RleHRfcGxhaW4uamF2YQppbmRleCA4NTUwNzI1Li45M2YwMjc1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL3RleHRfcGxhaW4uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL3RleHRfcGxhaW4uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTYyLDE1ICs2MiwxOCBAQAogCSAgICBzdXBlcihvcyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJICAgIC8vIGRvIG5vdGhpbmcKIAl9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEFjdGl2YXRpb25EYXRhRmxhdm9yW10gZ2V0RGF0YUZsYXZvcnMoKSB7CiAJcmV0dXJuIG15REY7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KERhdGFTb3VyY2UgZHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJU3RyaW5nIGVuYyA9IG51bGw7CiAJSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBudWxsOwpAQCAtMTIxLDYgKzEyNCw3IEBACiAgICAgLyoqCiAgICAgICogV3JpdGUgdGhlIG9iamVjdCB0byB0aGUgb3V0cHV0IHN0cmVhbSwgdXNpbmcgdGhlIHNwZWNpZmllZCBNSU1FIHR5cGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSwgT3V0cHV0U3RyZWFtIG9zKSAKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgU3RyaW5nKSkKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvdGV4dF94bWwuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaGFuZGxlcnMvdGV4dF94bWwuamF2YQppbmRleCBkYzcxOTMyLi42NDQzOGIxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2hhbmRsZXJzL3RleHRfeG1sLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9oYW5kbGVycy90ZXh0X3htbC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNjksMTAgKzY5LDEyIEBACiAJbmV3IEFjdGl2YXRpb25EYXRhRmxhdm9yKFN0cmVhbVNvdXJjZS5jbGFzcywgImFwcGxpY2F0aW9uL3htbCIsICJYTUwiKQogICAgIH07CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQWN0aXZhdGlvbkRhdGFGbGF2b3JbXSBnZXREYXRhRmxhdm9ycygpIHsKIAlyZXR1cm4gZmxhdm9yczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERhdGEoQWN0aXZhdGlvbkRhdGFGbGF2b3IgYUZsYXZvciwgRGF0YVNvdXJjZSBkcykKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmIChhRmxhdm9yLmdldFJlcHJlc2VudGF0aW9uQ2xhc3MoKSA9PSBTdHJpbmcuY2xhc3MpCkBAIC04NSw2ICs4Nyw3IEBACiAKICAgICAvKioKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE9iamVjdCBvYmosIFN0cmluZyBtaW1lVHlwZSwgT3V0cHV0U3RyZWFtIG9zKQogCQkJCSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmICghaXNYbWxUeXBlKG1pbWVUeXBlKSkKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0FyZ3VtZW50LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Bcmd1bWVudC5qYXZhCmluZGV4IGIwMDlmMDkuLjE1ZDE5MGYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0FyZ3VtZW50LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQXJndW1lbnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQzLDcgKzQzLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKIAogLyoqCiAgKiBAYXV0aG9yICBKb2huIE1hbmkKQEAgLTU3LDcgKzU5LDcgQEAKICAgICAgKiBDb25zdHJ1Y3RvcgogICAgICAqLwogICAgIHB1YmxpYyBBcmd1bWVudCgpIHsKLQlpdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigxKTsKKwlpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNyw2ICsxMDksMjMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBzdHJpbmcgaW50byBieXRlcyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogY2hhcnNldCwgYW5kIHdyaXRlIHRoZSBieXRlcyBvdXQgYXMgYW4gQVNUUklORworICAgICAqCisgICAgICogQHBhcmFtCXMJU3RyaW5nIHRvIHdyaXRlIG91dAorICAgICAqIEBwYXJhbQljaGFyc2V0CXRoZSBjaGFyc2V0CisgICAgICogQHJldHVybgkJdGhpcworICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjYuMAorICAgICAqLworICAgIHB1YmxpYyBBcmd1bWVudCB3cml0ZVN0cmluZyhTdHJpbmcgcywgQ2hhcnNldCBjaGFyc2V0KSB7CisJaWYgKGNoYXJzZXQgPT0gbnVsbCkgLy8gY29udmVuaWVuY2UKKwkgICAgd3JpdGVTdHJpbmcocyk7CisJZWxzZQorCSAgICBpdGVtcy5hZGQobmV3IEFTdHJpbmcocy5nZXRCeXRlcyhjaGFyc2V0KSkpOworCXJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgogICAgICAqIFdyaXRlIG91dCBnaXZlbiBzdHJpbmcgYXMgYW4gTlNUUklORywgZGVwZW5kaW5nIG9uIHRoZSB0eXBlCiAgICAgICogb2YgdGhlIGNoYXJhY3RlcnMgaW5zaWRlIHRoZSBzdHJpbmcuIFRoZSBzdHJpbmcgc2hvdWxkCiAgICAgICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMuIDxwPgpAQCAtMTQ1LDYgKzE2NCwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGdpdmVuIHN0cmluZyBpbnRvIGJ5dGVzIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjaGFyc2V0LCBhbmQgd3JpdGUgdGhlIGJ5dGVzIG91dCBhcyBhbiBOU1RSSU5HCisgICAgICoKKyAgICAgKiBAcGFyYW0JcwlTdHJpbmcgdG8gd3JpdGUgb3V0CisgICAgICogQHBhcmFtCWNoYXJzZXQJdGhlIGNoYXJzZXQKKyAgICAgKiBAcmV0dXJuCQl0aGlzCisgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNi4wCisgICAgICovCisgICAgcHVibGljIEFyZ3VtZW50IHdyaXRlTlN0cmluZyhTdHJpbmcgcywgQ2hhcnNldCBjaGFyc2V0KSB7CisJaWYgKHMgPT0gbnVsbCkKKwkgICAgaXRlbXMuYWRkKG5ldyBOU3RyaW5nKG51bGwpKTsKKwllbHNlIGlmIChjaGFyc2V0ID09IG51bGwpIC8vIGNvbnZlbmllbmNlCisJICAgIHdyaXRlU3RyaW5nKHMpOworCWVsc2UKKwkgICAgaXRlbXMuYWRkKG5ldyBOU3RyaW5nKHMuZ2V0Qnl0ZXMoY2hhcnNldCkpKTsKKwlyZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBXcml0ZSBvdXQgZ2l2ZW4gYnl0ZVtdIGFzIGEgTGl0ZXJhbC4KICAgICAgKiBAcGFyYW0gYiAgYnl0ZVtdIHRvIHdyaXRlIG91dAogICAgICAqIEByZXR1cm4JdGhpcwpAQCAtMjg2LDE3ICszMjQsMjAgQEAKICAgICAgICAgLy8gaWYgMCBsZW5ndGgsIHNlbmQgYXMgcXVvdGVkLXN0cmluZwogICAgICAgICBib29sZWFuIHF1b3RlID0gbGVuID09IDAgPyB0cnVlIDogZG9RdW90ZTsKIAlib29sZWFuIGVzY2FwZSA9IGZhbHNlOwotIAkKKwlib29sZWFuIHV0ZjggPSBwcm90b2NvbC5zdXBwb3J0c1V0ZjgoKTsKKwogCWJ5dGUgYjsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJICAgIGIgPSBieXRlc1tpXTsKLQkgICAgaWYgKGIgPT0gJ1wwJyB8fCBiID09ICdccicgfHwgYiA9PSAnXG4nIHx8ICgoYiAmIDB4ZmYpID4gMDE3NykpIHsKKwkgICAgaWYgKGIgPT0gJ1wwJyB8fCBiID09ICdccicgfHwgYiA9PSAnXG4nIHx8CisJCSAgICAoIXV0ZjggJiYgKChiICYgMHhmZikgPiAwMTc3KSkpIHsKIAkJLy8gTlVMLCBDUiBvciBMRiBtZWFucyB0aGUgYnl0ZXMgbmVlZCB0byBiZSBzZW50IGFzIGxpdGVyYWxzCiAJCWxpdGVyYWwoYnl0ZXMsIHByb3RvY29sKTsKIAkJcmV0dXJuOwogCSAgICB9CiAJICAgIGlmIChiID09ICcqJyB8fCBiID09ICclJyB8fCBiID09ICcoJyB8fCBiID09ICcpJyB8fCBiID09ICd7JyB8fAotCQliID09ICciJyB8fCBiID09ICdcXCcgfHwgKChiICYgMHhmZikgPD0gJyAnKSkgeworCQkgICAgYiA9PSAnIicgfHwgYiA9PSAnXFwnIHx8CisJCSAgICAoKGIgJiAweGZmKSA8PSAnICcpIHx8ICgoYiAmIDB4ZmYpID4gMDE3NykpIHsKIAkJcXVvdGUgPSB0cnVlOwogCQlpZiAoYiA9PSAnIicgfHwgYiA9PSAnXFwnKSAvLyBuZWVkIHRvIGVzY2FwZSB0aGVzZSBjaGFyYWN0ZXJzCiAJCSAgICBlc2NhcGUgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQmFkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQmFkQ29tbWFuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDEzMmI1OTEuLmRkZTdiNWIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0JhZENvbW1hbmRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9CYWRDb21tYW5kRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9CeXRlQXJyYXkuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0J5dGVBcnJheS5qYXZhCmluZGV4IDliYTMyNGYuLmJmOGNlNjAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0J5dGVBcnJheS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0J5dGVBcnJheS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ1YjU1YzMuLmFlYjYzMGMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0NvbW1hbmRGYWlsZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Db21tYW5kRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Db25uZWN0aW9uRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Db25uZWN0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMWQ4YmQ4Ni4uMTg3Yjg1MiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0Nvbm5lY3Rpb25FeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0xpdGVyYWwuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0xpdGVyYWwuamF2YQppbmRleCBlYTg3NDU0Li40NDcwNmIwIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9MaXRlcmFsLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvTGl0ZXJhbC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvTGl0ZXJhbEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvTGl0ZXJhbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDdkYTI1YmEuLmZmMTJkNDkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL0xpdGVyYWxFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9MaXRlcmFsRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9QYXJzaW5nRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9QYXJzaW5nRXhjZXB0aW9uLmphdmEKaW5kZXggNmU3M2YyMS4uYzk0NzYwOSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUGFyc2luZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1BhcnNpbmdFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Byb3RvY29sLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Qcm90b2NvbC5qYXZhCmluZGV4IGZhMDM5MzEuLmJlZDllZjAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Byb3RvY29sLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUHJvdG9jb2wuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ0LDE4ICs0NCwyNCBAQAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwogaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyOwogaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiAKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUHJvcFV0aWw7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWFpbExvZ2dlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Tb2NrZXRGZXRjaGVyOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlRyYWNlSW5wdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuVHJhY2VPdXRwdXRTdHJlYW07CiAKIC8qKgogICogR2VuZXJhbCBwcm90b2NvbCBoYW5kbGluZyBjb2RlIGZvciBJTUFQLWxpa2UgcHJvdG9jb2xzLiA8cD4KQEAgLTg0LDE0ICs5MCwxOCBAQAogICAgIHByaXZhdGUgdm9sYXRpbGUgRGF0YU91dHB1dFN0cmVhbSBvdXRwdXQ7CiAKICAgICBwcml2YXRlIGludCB0YWdDb3VudGVyID0gMDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWdQcmVmaXg7CiAKICAgICBwcml2YXRlIFN0cmluZyBsb2NhbEhvc3ROYW1lOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc3BvbnNlSGFuZGxlcj4gaGFuZGxlcnMKLQkgICAgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UmVzcG9uc2VIYW5kbGVyPigpOworCSAgICA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgdGltZXN0YW1wOwogCisgICAgLy8gcGFja2FnZSBwcml2YXRlLCB0byBhbGxvdyB0ZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgdGFnTnVtID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGID0geyAoYnl0ZSknXHInLCAoYnl0ZSknXG4nfTsKICAKICAgICAvKioKQEAgLTExMyw2ICsxMjMsNyBAQAogCQkgICAgYm9vbGVhbiBpc1NTTCwgTWFpbExvZ2dlciBsb2dnZXIpCiAJCSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFByb3RvY29sRXhjZXB0aW9uIHsKIAlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwkJLy8gZGlkIGNvbnN0cnVjdG9yIHN1Y2NlZWQ/CisJdGFnUHJlZml4ID0gY29tcHV0ZVByZWZpeChwcm9wcywgcHJlZml4KTsKIAl0cnkgewogCSAgICB0aGlzLmhvc3QgPSBob3N0OwogCSAgICB0aGlzLnByb3BzID0gcHJvcHM7CkBAIC0xNTYsNiArMTY3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ29tcHV0ZSB0aGUgdGFnIHByZWZpeCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgICAgICogU3RhcnQgd2l0aCAiQSIgLSAiWiIsIHRoZW4gIkFBIiAtICJaWiIsIGFuZCBmaW5hbGx5ICJBQUEiIC0gIlpaWiIuCisgICAgICogV3JhcCBhcm91bmQgYWZ0ZXIgdGhhdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wdXRlUHJlZml4KFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZyBwcmVmaXgpIHsKKwkvLyBYWFggLSBpbiBjYXNlIHNvbWVvbmUgZGVwZW5kcyBvbiB0aGUgdGFnIHByZWZpeAorCWlmIChQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCisJCQkJICAgIHByZWZpeCArICIucmV1c2V0YWdwcmVmaXgiLCBmYWxzZSkpCisJICAgIHJldHVybiAiQSI7CisJLy8gdGFnIHByZWZpeCwgd3JhcCBhcm91bmQgYWZ0ZXIgdGhyZWUgbGV0dGVycworCWludCBuID0gdGFnTnVtLmdldEFuZEluY3JlbWVudCgpICUgKDI2KjI2KjI2ICsgMjYqMjYgKyAyNik7CisJU3RyaW5nIHRhZ1ByZWZpeDsKKwlpZiAobiA8IDI2KQorCSAgICB0YWdQcmVmaXggPSBuZXcgU3RyaW5nKG5ldyBjaGFyW10geyAoY2hhcikoJ0EnICsgbikgfSk7CisJZWxzZSBpZiAobiA8ICgyNioyNiArIDI2KSkgeworCSAgICBuIC09IDI2OworCSAgICB0YWdQcmVmaXggPSBuZXcgU3RyaW5nKG5ldyBjaGFyW10geworCQkJICAgIChjaGFyKSgnQScgKyBuLzI2KSwgKGNoYXIpKCdBJyArIG4lMjYpIH0pOworCX0gZWxzZSB7CisJICAgIG4gLT0gKDI2KjI2ICsgMjYpOworCSAgICB0YWdQcmVmaXggPSBuZXcgU3RyaW5nKG5ldyBjaGFyW10geworCQkoY2hhcikoJ0EnICsgbi8oMjYqMjYpKSwKKwkJKGNoYXIpKCdBJyArIChuJSgyNioyNikpLzI2KSwKKwkJKGNoYXIpKCdBJyArIG4lMjYpIH0pOworCX0KKwlyZXR1cm4gdGFnUHJlZml4OworICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIGZvciBkZWJ1Z2dpbmcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4JdGhlIElucHV0U3RyZWFtIHRvIHJlYWQgZnJvbQpAQCAtMTY5LDYgKzIwOSw3IEBACiAJdGhpcy5ob3N0ID0gImxvY2FsaG9zdCI7CiAJdGhpcy5wcm9wcyA9IHByb3BzOwogCXRoaXMucXVvdGUgPSBmYWxzZTsKKwl0YWdQcmVmaXggPSBjb21wdXRlUHJlZml4KHByb3BzLCAibWFpbC5pbWFwIik7CiAJbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLCAiREVCVUciLCBkZWJ1ZywgU3lzdGVtLm91dCk7CiAJdHJhY2VMb2dnZXIgPSBsb2dnZXIuZ2V0U3ViTG9nZ2VyKCJwcm90b2NvbCIsIG51bGwpOwogCkBAIC0zMDYsNyArMzQ3LDcgQEAKIAkJdGhyb3dzIElPRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJLy8gYXNzZXJ0IFRocmVhZC5ob2xkc0xvY2sodGhpcyk7CiAJLy8gY2FuJ3QgYXNzZXJ0IGJlY2F1c2UgaXQncyBjYWxsZWQgZnJvbSBjb25zdHJ1Y3RvcgotCVN0cmluZyB0YWcgPSAiQSIgKyBJbnRlZ2VyLnRvU3RyaW5nKHRhZ0NvdW50ZXIrKywgMTApOyAvLyB1bmlxdWUgdGFnCisJU3RyaW5nIHRhZyA9IHRhZ1ByZWZpeCArIEludGVnZXIudG9TdHJpbmcodGFnQ291bnRlcisrKTsgLy8gdW5pcXVlIHRhZwogCiAJb3V0cHV0LndyaXRlQnl0ZXModGFnICsgIiAiICsgY29tbWFuZCk7CiAgICAgCkBAIC0zMzEsMTAgKzM3Miw5IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBSZXNwb25zZVtdIGNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEFyZ3VtZW50IGFyZ3MpIHsKIAljb21tYW5kU3RhcnQoY29tbWFuZCk7Ci0JTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8UmVzcG9uc2U+KCk7CisJTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwogCVN0cmluZyB0YWcgPSBudWxsOwotCVJlc3BvbnNlIHIgPSBudWxsOwogCiAJLy8gd3JpdGUgdGhlIGNvbW1hbmQKIAl0cnkgewpAQCAtMzUwLDEzICszOTAsMTQgQEAKIAogCVJlc3BvbnNlIGJ5ZVJlc3AgPSBudWxsOwogCXdoaWxlICghZG9uZSkgeworCSAgICBSZXNwb25zZSByID0gbnVsbDsKIAkgICAgdHJ5IHsKIAkJciA9IHJlYWRSZXNwb25zZSgpOwogCSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7Ci0JCWlmIChieWVSZXNwICE9IG51bGwpCS8vIGNvbm5lY3Rpb24gY2xvc2VkIGFmdGVyIEJZRSB3YXMgc2VudAotCQkgICAgYnJlYWs7Ci0JCS8vIGNvbnZlcnQgdGhpcyBpbnRvIGEgQllFIHJlc3BvbnNlCi0JCXIgPSBSZXNwb25zZS5ieWVSZXNwb25zZShpb2V4KTsKKwkJaWYgKGJ5ZVJlc3AgPT0gbnVsbCkJLy8gY29udmVydCB0aGlzIGludG8gYSBCWUUgcmVzcG9uc2UKKwkJICAgIGJ5ZVJlc3AgPSBSZXNwb25zZS5ieWVSZXNwb25zZShpb2V4KTsKKwkJLy8gZWxzZSwgY29ubmVjdGlvbiBjbG9zZWQgYWZ0ZXIgQllFIHdhcyBzZW50CisJCWJyZWFrOwogCSAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZXgpIHsKIAkJbG9nZ2VyLmxvZyhMZXZlbC5GSU5FLCAiaWdub3JpbmcgYmFkIHJlc3BvbnNlIiwgcGV4KTsKIAkJY29udGludWU7IC8vIHNraXAgdGhpcyByZXNwb25zZQpAQCAtNDUzLDIxICs0OTQsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydENvbXByZXNzaW9uKFN0cmluZyBjbWQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JLyoKLQkgKiBUaGUgRGVmbGF0b3IuU1lOQ19GTFVTSCBzdXBwb3J0IHJlcXVpcmVzIEpESyAxLjcgc28gdXNlCi0JICogcmVmbGVjdGlvbiB0byBhbGxvdyBjb21waWxpbmcgb24gMS41IGJ1dCBydW5uaW5nIG9uIDEuNy4KLQkgKi8KLQlDbGFzczxEZWZsYXRlck91dHB1dFN0cmVhbT4gZGMgPSBEZWZsYXRlck91dHB1dFN0cmVhbS5jbGFzczsKLQlDb25zdHJ1Y3RvcjxEZWZsYXRlck91dHB1dFN0cmVhbT4gY29ucyA9IG51bGw7Ci0JdHJ5IHsKLQkgICAgY29ucyA9IGRjLmdldENvbnN0cnVjdG9yKAotCQkJICAgIE91dHB1dFN0cmVhbS5jbGFzcywgRGVmbGF0ZXIuY2xhc3MsIGJvb2xlYW4uY2xhc3MpOwotCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCSAgICBsb2dnZXIuZmluZSgiSWdub3JpbmcgQ09NUFJFU1M7ICIgKwotCQkJIm1pc3NpbmcgSkRLIDEuNyBEZWZsYXRlck91dHB1dFN0cmVhbSBjb25zdHJ1Y3RvciIpOwotCSAgICByZXR1cm47CS8vIGlnbm9yZSByZXF1ZXN0LCBqdXN0IGFzIGlmIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgaXQKLQl9Ci0KIAkvLyBYWFggLSBjaGVjayB3aGV0aGVyIGNvbXByZXNzaW9uIGlzIGFscmVhZHkgZW5hYmxlZD8KIAlzaW1wbGVDb21tYW5kKGNtZCwgbnVsbCk7CiAKQEAgLTQ5OSwxNCArNTI1LDggQEAKIAl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKIAkgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FLCAiSWdub3JpbmcgYmFkIGNvbXByZXNzaW9uIHN0cmF0ZWd5IiwgZXgpOwogCX0KLQkvL3RyYWNlT3V0cHV0ID0gbmV3IFRyYWNlT3V0cHV0U3RyZWFtKG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbSgKLQkvLwkJICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgZGVmLCB0cnVlKSwgdHJhY2VMb2dnZXIpOwotCXRyeSB7Ci0JICAgIHRyYWNlT3V0cHV0ID0gbmV3IFRyYWNlT3V0cHV0U3RyZWFtKGNvbnMubmV3SW5zdGFuY2UoCisJdHJhY2VPdXRwdXQgPSBuZXcgVHJhY2VPdXRwdXRTdHJlYW0obmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtKAogCQkJICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgZGVmLCB0cnVlKSwgdHJhY2VMb2dnZXIpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCSAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBkZWZsYXRlciIsIGV4KTsKLQl9CiAJdHJhY2VPdXRwdXQuc2V0UXVvdGUocXVvdGUpOwogCW91dHB1dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSh0cmFjZU91dHB1dCkpOwogICAgIH0KQEAgLTUzOCw3ICs1NTgsMzUgQEAKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS41LjIKICAgICAgKi8KICAgICBwdWJsaWMgU29ja2V0Q2hhbm5lbCBnZXRDaGFubmVsKCkgewotCXJldHVybiBzb2NrZXQuZ2V0Q2hhbm5lbCgpOworCVNvY2tldENoYW5uZWwgcmV0ID0gc29ja2V0LmdldENoYW5uZWwoKTsKKwlpZiAocmV0ICE9IG51bGwpCisJICAgIHJldHVybiByZXQ7CisKKwkvLyBYWFggLSBBbmRyb2lkIGlzIGJyb2tlbiBhbmQgU1NMIHdyYXBwZWQgc29ja2V0cyBkb24ndCBkZWxlZ2F0ZQorCS8vIHRoZSBnZXRDaGFubmVsIG1ldGhvZCB0byB0aGUgd3JhcHBlZCBTb2NrZXQKKwlpZiAoc29ja2V0IGluc3RhbmNlb2YgU1NMU29ja2V0KSB7CisJICAgIHRyeSB7CisJCUZpZWxkIGYgPSBzb2NrZXQuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJzb2NrZXQiKTsKKwkJZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQlTb2NrZXQgcyA9IChTb2NrZXQpZi5nZXQoc29ja2V0KTsKKwkJcmV0ID0gcy5nZXRDaGFubmVsKCk7CisJICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkvLyBpZ25vcmUgYW55dGhpbmcgdGhhdCBtaWdodCBnbyB3cm9uZworCSAgICB9CisJfQorCXJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgc2VydmVyIHN1cHBvcnQgVVRGLTg/CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHJldHVybgl0cnVlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgVVRGLTgKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1V0ZjgoKSB7CisJcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjMwLDYgKzY3OCw3IEBACiAgICAgLyoqCiAgICAgICogRmluYWxpemVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAJdHJ5IHsKIAkgICAgZGlzY29ubmVjdCgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Byb3RvY29sRXhjZXB0aW9uLmphdmEKaW5kZXggY2QzMzQ0OS4uYjdlMzY2YSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUHJvdG9jb2xFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9Qcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Jlc3BvbnNlLmphdmEKaW5kZXggZjFjNWI2MC4uMDIyNWQ5YSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2UuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9SZXNwb25zZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDIsMTMgKzQyLDE2IEBACiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5BU0NJSVV0aWxpdHk7CiAKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcmVzcG9uc2Ugb2J0YWluZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCiAgKiBvZiBhbiBJTUFQIHNlcnZlci4KICAqCi0gKiBAYXV0aG9yICBKb2huIE1hbmkKKyAqIEBhdXRob3IgSm9obiBNYW5pCisgKiBAYXV0aG9yIEJpbGwgU2hhbm5vbgogICovCiAKIHB1YmxpYyBjbGFzcyBSZXNwb25zZSB7CkBAIC02MCw2ICs2Myw3IEBACiAgICAgcHJvdGVjdGVkIFN0cmluZyB0YWcgPSBudWxsOwogICAgIC8qKiBAc2luY2UgSmF2YU1haWwgMS41LjQgKi8KICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uIGV4OworICAgIHByb3RlY3RlZCBib29sZWFuIHV0Zjg7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaW5jcmVtZW50ID0gMTAwOwogCkBAIC05Niw4ICsxMDAsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVNUUklOR19DSEFSX0RFTElNID0gIiAoKXslKlwiXFwiOwogCiAgICAgcHVibGljIFJlc3BvbnNlKFN0cmluZyBzKSB7Ci0JYnVmZmVyID0gQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHMpOworCXRoaXMocywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRlc3RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0Jcwl0aGUgcmVzcG9uc2Ugc3RyaW5nCisgICAgICogQHBhcmFtCXN1cHBvcnRzVXRmOAlhbGxvdyBVVEYtOCBpbiByZXNwb25zZT8KKyAgICAgKiBAc2luY2UJSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2UoU3RyaW5nIHMsIGJvb2xlYW4gc3VwcG9ydHNVdGY4KSB7CisJaWYgKHN1cHBvcnRzVXRmOCkKKwkgICAgYnVmZmVyID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwllbHNlCisJICAgIGJ1ZmZlciA9IHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7CiAJc2l6ZSA9IGJ1ZmZlci5sZW5ndGg7CisJdXRmOCA9IHN1cHBvcnRzVXRmODsKIAlwYXJzZSgpOwogICAgIH0KIApAQCAtMTE0LDYgKzEzMyw3IEBACiAJQnl0ZUFycmF5IHJlc3BvbnNlID0gcC5nZXRJbnB1dFN0cmVhbSgpLnJlYWRSZXNwb25zZShiYSk7CiAJYnVmZmVyID0gcmVzcG9uc2UuZ2V0Qnl0ZXMoKTsKIAlzaXplID0gcmVzcG9uc2UuZ2V0Q291bnQoKSAtIDI7IC8vIFNraXAgdGhlIHRlcm1pbmF0aW5nIENSTEYKKwl1dGY4ID0gcC5zdXBwb3J0c1V0ZjgoKTsKIAogCXBhcnNlKCk7CiAgICAgfQpAQCAtMTI1LDEwICsxNDUsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzcG9uc2UoUmVzcG9uc2UgcikgewogCWluZGV4ID0gci5pbmRleDsKKwlwaW5kZXggPSByLnBpbmRleDsKIAlzaXplID0gci5zaXplOwogCWJ1ZmZlciA9IHIuYnVmZmVyOwogCXR5cGUgPSByLnR5cGU7CiAJdGFnID0gci50YWc7CisJZXggPSByLmV4OworCXV0ZjggPSByLnV0Zjg7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDcsNiArMTcwLDE2IEBACiAJcmV0dXJuIHI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgc2VydmVyIHN1cHBvcnQgVVRGLTg/CisgICAgICoKKyAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgVVRGLTgKKyAgICAgKiBAc2luY2UJSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1V0ZjgoKSB7CisJcmV0dXJuIHV0Zjg7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewogCWluZGV4ID0gMDsgLy8gcG9zaXRpb24gaW50ZXJuYWwgaW5kZXggYXQgc3RhcnQKIApAQCAtMTkxLDYgKzIyNCwyMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNraXAgcGFzdCBhbnkgc3BhY2VzLiAgSWYgdGhlIG5leHQgbm9uLXNwYWNlIGNoYXJhY3RlciBpcyBjLAorICAgICAqIGNvbnN1bWUgaXQgYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHN0b3AgYXQgdGhhdCBwb2ludAorICAgICAqIGFuZCByZXR1cm4gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0JYwl0aGUgY2hhcmFjdGVyIHRvIGxvb2sgZm9yCisgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGZvdW5kCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXh0Tm9uU3BhY2UoY2hhciBjKSB7CisJc2tpcFNwYWNlcygpOworCWlmIChpbmRleCA8IHNpemUgJiYgYnVmZmVyW2luZGV4XSA9PSAoYnl0ZSljKSB7CisJICAgIGluZGV4Kys7CisJICAgIHJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2tpcCB0byB0aGUgbmV4dCBzcGFjZSwgZm9yIHVzZSBpbiBlcnJvciByZWNvdmVyeSB3aGlsZSBwYXJzaW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNraXBUb2tlbigpIHsKQEAgLTI0MSwxMyArMjkxLDEzIEBACiAJaWYgKGluZGV4ID49IHNpemUpIC8vIGFscmVhZHkgYXQgZW5kIG9mIHJlc3BvbnNlCiAJICAgIHJldHVybiBudWxsOwogCi0JYnl0ZSBiOworCWludCBiOwogCWludCBzdGFydCA9IGluZGV4OwotCXdoaWxlIChpbmRleCA8IHNpemUgJiYgKChiID0gYnVmZmVyW2luZGV4XSkgPiAnICcpICYmCi0JICAgICAgIGRlbGltLmluZGV4T2YoKGNoYXIpYikgPCAwICYmIGIgPj0gJyAnICYmIGIgIT0gMHg3ZikKKwl3aGlsZSAoaW5kZXggPCBzaXplICYmICgoYiA9ICgoKGludClidWZmZXJbaW5kZXhdKSYweGZmKSkgPj0gJyAnKSAmJgorCSAgICAgICBkZWxpbS5pbmRleE9mKChjaGFyKWIpIDwgMCAmJiBiICE9IDB4N2YpCiAJICAgIGluZGV4Kys7CiAKLQlyZXR1cm4gQVNDSUlVdGlsaXR5LnRvU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIGluZGV4KTsKKwlyZXR1cm4gdG9TdHJpbmcoYnVmZmVyLCBzdGFydCwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY4LDcgKzMxOCw3IEBACiAJd2hpbGUgKGluZGV4IDwgc2l6ZSAmJiBidWZmZXJbaW5kZXhdICE9IGRlbGltKQogCSAgICBpbmRleCsrOwogCi0JcmV0dXJuIEFTQ0lJVXRpbGl0eS50b1N0cmluZyhidWZmZXIsIHN0YXJ0LCBpbmRleCk7CisJcmV0dXJuIHRvU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIGluZGV4KTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nW10gcmVhZFN0cmluZ0xpc3QoKSB7CkBAIC0yODcsMTQgKzMzNywxNSBAQAogCX0KIAlpbmRleCsrOyAvLyBza2lwICcoJwogCi0JTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXNraXBTcGFjZXMoKTsKLQlpZiAocGVla0J5dGUoKSAhPSAnKScpIHsKLQkgICAgZG8gewotCQlyZXN1bHQuYWRkKGF0b20gPyByZWFkQXRvbVN0cmluZygpIDogcmVhZFN0cmluZygpKTsKLQkgICAgfSB3aGlsZSAoaW5kZXggPCBzaXplICYmIGJ1ZmZlcltpbmRleCsrXSAhPSAnKScpOwotCX0gZWxzZQotCSAgICBpbmRleCsrOwkvLyBza2lwICcpJworCS8vIHRvIGhhbmRsZSBidWdneSBJTUFQIHNlcnZlcnMsIHdlIHRvbGVyYXRlIG11bHRpcGxlIHNwYWNlcyBhcworCS8vIHdlbGwgYXMgc3BhY2VzIGFmdGVyIHRoZSBsZWZ0IHBhcmVuIG9yIGJlZm9yZSB0aGUgcmlnaHQgcGFyZW4KKwlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJd2hpbGUgKCFpc05leHROb25TcGFjZSgnKScpKSB7CisJICAgIFN0cmluZyBzID0gYXRvbSA/IHJlYWRBdG9tU3RyaW5nKCkgOiByZWFkU3RyaW5nKCk7CisJICAgIGlmIChzID09IG51bGwpCS8vIG5vdCB0aGUgZXhwZWN0ZWQgc3RyaW5nIG9yIGF0b20KKwkJYnJlYWs7CisJICAgIHJlc3VsdC5hZGQocyk7CisJfQogCiAJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwogICAgIH0KQEAgLTQ0Nyw3ICs0OTgsNyBAQAogCQlpbmRleCsrOyAvLyBza2lwIHBhc3QgdGhlIHRlcm1pbmF0aW5nIHF1b3RlCiAKIAkgICAgaWYgKHJldHVyblN0cmluZykgCi0JCXJldHVybiBBU0NJSVV0aWxpdHkudG9TdHJpbmcoYnVmZmVyLCBzdGFydCwgY29weXRvKTsKKwkJcmV0dXJuIHRvU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIGNvcHl0byk7CiAJICAgIGVsc2UKIAkJcmV0dXJuIG5ldyBCeXRlQXJyYXkoYnVmZmVyLCBzdGFydCwgY29weXRvLXN0YXJ0KTsKIAl9IGVsc2UgaWYgKGIgPT0gJ3snKSB7IC8vIExpdGVyYWwKQEAgLTQ2OCw3ICs1MTksNyBAQAogCSAgICBpbmRleCA9IHN0YXJ0ICsgY291bnQ7IC8vIHBvc2l0aW9uIGluZGV4IHRvIGJleW9uZCB0aGUgbGl0ZXJhbAogCiAJICAgIGlmIChyZXR1cm5TdHJpbmcpIC8vIHJldHVybiBhcyBTdHJpbmcKLQkJcmV0dXJuIEFTQ0lJVXRpbGl0eS50b1N0cmluZyhidWZmZXIsIHN0YXJ0LCBzdGFydCArIGNvdW50KTsKKwkJcmV0dXJuIHRvU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIHN0YXJ0ICsgY291bnQpOwogCSAgICBlbHNlCiAJICAgIAlyZXR1cm4gbmV3IEJ5dGVBcnJheShidWZmZXIsIHN0YXJ0LCBjb3VudCk7CiAJfSBlbHNlIGlmIChwYXJzZUF0b21zKSB7IC8vIHBhcnNlIGFzIEFTVFJJTkctQ0hBUnMKQEAgLTQ4Niw2ICs1MzcsMTIgQEAKIAlyZXR1cm4gbnVsbDsgLy8gRXJyb3IKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhieXRlW10gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlyZXR1cm4gdXRmOCA/CisJCW5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgZW5kIC0gc3RhcnQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpIDoKKwkJQVNDSUlVdGlsaXR5LnRvU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIGVuZCk7CisgICAgfQorCiAgICAgcHVibGljIGludCBnZXRUeXBlKCkgewogCXJldHVybiB0eXBlOwogICAgIH0KQEAgLTUzOSw3ICs1OTYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdCgpIHsKIAlza2lwU3BhY2VzKCk7Ci0JcmV0dXJuIEFTQ0lJVXRpbGl0eS50b1N0cmluZyhidWZmZXIsIGluZGV4LCBzaXplKTsKKwlyZXR1cm4gdG9TdHJpbmcoYnVmZmVyLCBpbmRleCwgc2l6ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NTksOCArNjE2LDkgQEAKIAlpbmRleCA9IHBpbmRleDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiBBU0NJSVV0aWxpdHkudG9TdHJpbmcoYnVmZmVyLCAwLCBzaXplKTsKKwlyZXR1cm4gdG9TdHJpbmcoYnVmZmVyLCAwLCBzaXplKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Jlc3BvbnNlSGFuZGxlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2VIYW5kbGVyLmphdmEKaW5kZXggMGIzNjg1YS4uNTQ0NDhjZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2VIYW5kbGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2VIYW5kbGVyLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9SZXNwb25zZUlucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2lhcC9SZXNwb25zZUlucHV0U3RyZWFtLmphdmEKaW5kZXggOWUwZWNkZS4uOTZjY2EyZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pYXAvUmVzcG9uc2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaWFwL1Jlc3BvbnNlSW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTU4LDggKzU4LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWF4SW5jcmVtZW50ID0gMjU2ICogMTAyNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaW5jcmVtZW50U2xvcCA9IDE2OwogCi0JCXByaXZhdGUgZmluYWwgaW50IGlucHV0U3RyZWFtQnVmZmVyTWF4U2l6ZSA9Ci0JCQkJSW50ZWdlci5nZXRJbnRlZ2VyKCJjb20uc3VuLm1haWwuaWFwLmlucHV0U3RyZWFtQnVmZmVyTWF4U2l6ZSIsIDApOworICAgIHByaXZhdGUgZmluYWwgaW50IGlucHV0U3RyZWFtQnVmZmVyTWF4U2l6ZSA9CisgICAgICAgIEludGVnZXIuZ2V0SW50ZWdlcigiY29tLnN1bi5tYWlsLmlhcC5pbnB1dFN0cmVhbUJ1ZmZlck1heFNpemUiLCAwKTsKIAogICAgIC8vIHdoZXJlIHdlIHJlYWQgZnJvbQogICAgIHByaXZhdGUgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaW47CkBAIC0xOTMsNCArMTkzLDQgQEAKIAkJCX0KIAkJCWJhLmdyb3coaW5jcik7CiAJCX0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvQUNMLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvQUNMLmphdmEKaW5kZXggMjVlOTRhZi4uNTczMGI4MCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0FDTC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9BQ0wuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwOSw2ICsxMDksNyBAQAogICAgIC8qKgogICAgICAqIENsb25lIHRoaXMgQUNMIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCUFDTCBhY2wgPSAoQUNMKXN1cGVyLmNsb25lKCk7CiAJYWNsLnJpZ2h0cyA9IChSaWdodHMpdGhpcy5yaWdodHMuY2xvbmUoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9BcHBlbmRVSUQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9BcHBlbmRVSUQuamF2YQppbmRleCAzOTdlOGFiLi43OGQ0NmIyIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvQXBwZW5kVUlELmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0FwcGVuZFVJRC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0NvcHlVSUQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9Db3B5VUlELmphdmEKaW5kZXggYjhlM2JkYS4uZDRhYzcyMyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0NvcHlVSUQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvQ29weVVJRC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0RlZmF1bHRGb2xkZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9EZWZhdWx0Rm9sZGVyLmphdmEKaW5kZXggNGQzOTRmMi4uMjIxOGJhNCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0RlZmF1bHRGb2xkZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvRGVmYXVsdEZvbGRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDAsMTEgKzQwLDEzIEBACiAKIHBhY2thZ2UgY29tLnN1bi5tYWlsLmltYXA7CiAKLWltcG9ydCBqYXZheC5tYWlsLio7Ci1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC4qOwotaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLmlhcC4qOwotaW1wb3J0IGNvbS5zdW4ubWFpbC5pbWFwLnByb3RvY29sLio7CitpbXBvcnQgamF2YXgubWFpbC5Gb2xkZXI7CitpbXBvcnQgamF2YXgubWFpbC5NZXNzYWdlOworaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1haWwuTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ubWFpbC5pYXAuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgY29tLnN1bi5tYWlsLmltYXAucHJvdG9jb2wuSU1BUFByb3RvY29sOworaW1wb3J0IGNvbS5zdW4ubWFpbC5pbWFwLnByb3RvY29sLkxpc3RJbmZvOwogCiAvKioKICAqIFRoZSBkZWZhdWx0IElNQVAgZm9sZGVyIChyb290IG9mIHRoZSBuYW1pbmcgaGllcmFyY2h5KS4KQEAgLTYwLDE5ICs2MiwyMyBAQAogCXR5cGUgPSBIT0xEU19GT0xERVJTOyAvLyBvYnZpb3VzbHkKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewogCXJldHVybiBmdWxsTmFtZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyIGdldFBhcmVudCgpIHsKIAlyZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEZvbGRlcltdIGxpc3QoZmluYWwgU3RyaW5nIHBhdHRlcm4pCiAJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJTGlzdEluZm9bXSBsaSA9IG51bGw7CiAKIAlsaSA9IChMaXN0SW5mb1tdKWRvQ29tbWFuZChuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCXJldHVybiBwLmxpc3QoIiIsIHBhdHRlcm4pOwogCSAgICB9CkBAIC04NywxMSArOTMsMTMgQEAKIAlyZXR1cm4gZm9sZGVyczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEZvbGRlcltdIGxpc3RTdWJzY3JpYmVkKGZpbmFsIFN0cmluZyBwYXR0ZXJuKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCUxpc3RJbmZvW10gbGkgPSBudWxsOwogCiAJbGkgPSAoTGlzdEluZm9bXSlkb0NvbW1hbmQobmV3IFByb3RvY29sQ29tbWFuZCgpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyBPYmplY3QgZG9Db21tYW5kKElNQVBQcm90b2NvbCBwKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQlyZXR1cm4gcC5sc3ViKCIiLCBwYXR0ZXJuKTsKIAkgICAgfQpAQCAtMTA2LDMwICsxMTQsMzYgQEAKIAlyZXR1cm4gZm9sZGVyczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXdNZXNzYWdlcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIE5vdCBhcHBsaWNhYmxlIG9uIERlZmF1bHRGb2xkZXIKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiAoKElNQVBTdG9yZSlzdG9yZSkubmV3SU1BUEZvbGRlcihuYW1lLCBVTktOT1dOX1NFUEFSQVRPUik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlKGJvb2xlYW4gcmVjdXJzZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7ICAKIAkvLyBOb3QgYXBwbGljYWJsZSBvbiBEZWZhdWx0Rm9sZGVyCiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBEZWZhdWx0IEZvbGRlciIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlbmFtZVRvKEZvbGRlciBmKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAkvLyBOb3QgYXBwbGljYWJsZSBvbiBEZWZhdWx0Rm9sZGVyCiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSBEZWZhdWx0IEZvbGRlciIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFwcGVuZE1lc3NhZ2VzKE1lc3NhZ2VbXSBtc2dzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAkvLyBOb3QgYXBwbGljYWJsZSBvbiBEZWZhdWx0Rm9sZGVyCiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQ2Fubm90IGFwcGVuZCB0byBEZWZhdWx0IEZvbGRlciIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBNZXNzYWdlW10gZXhwdW5nZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIE5vdCBhcHBsaWNhYmxlIG9uIERlZmF1bHRGb2xkZXIKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJDYW5ub3QgZXhwdW5nZSBEZWZhdWx0IEZvbGRlciIpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBCb2R5UGFydC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBCb2R5UGFydC5qYXZhCmluZGV4IDVkODcxZmMuLjQxNmEwZjQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQQm9keVBhcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUEJvZHlQYXJ0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEyIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00Nyw3ICs0NywxMCBAQAogaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuKjsKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLio7CiAKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlByb3BVdGlsOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlJlYWRhYmxlTWltZTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5MaW5lT3V0cHV0U3RyZWFtOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlNoYXJlZEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBjb20uc3VuLm1haWwuaWFwLio7CiBpbXBvcnQgY29tLnN1bi5tYWlsLmltYXAucHJvdG9jb2wuKjsKIApAQCAtODcsNDYgKzkwLDU3IEBACiAgICAgICogYmUgaW5zZXJ0ZWQgaW4gbmV3bHkgY3JhZnRlZCBNaW1lTWVzc2FnZXMsIGVzcGVjaWFsbHkgd2hlbgogICAgICAqIGZvcndhcmRpbmcgb3IgcmVwbHlpbmcgdG8gbWVzc2FnZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVhZGVycygpIHsKIAlyZXR1cm47CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGJzLnNpemU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gYnMubGluZXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiB0eXBlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcG9zaXRpb24oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gYnMuZGlzcG9zaXRpb247CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQQm9keVBhcnQgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBicy5lbmNvZGluZzsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRJRCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBicy5pZDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRNRDUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gYnMubWQ1OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRNRDUoU3RyaW5nIG1kNSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUEJvZHlQYXJ0IGlzIHJlYWQtb25seSIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgLy8gY2FjaGVkIHZhbHVlID8KIAkgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwpAQCAtMTQzLDE2ICsxNTcsMTggQEAKIAlyZXR1cm4gZGVzY3JpcHRpb247CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgY2hhcnNldCkKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBCb2R5UGFydCBpcyByZWFkLW9ubHkiKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKIAlpZiAoYnMuZFBhcmFtcyAhPSBudWxsKQogCSAgICBmaWxlbmFtZSA9IGJzLmRQYXJhbXMuZ2V0KCJmaWxlbmFtZSIpOwotCWlmIChmaWxlbmFtZSA9PSBudWxsICYmIGJzLmNQYXJhbXMgIT0gbnVsbCkKKwlpZiAoKGZpbGVuYW1lID09IG51bGwgfHwgZmlsZW5hbWUuaXNFbXB0eSgpKSAmJiBicy5jUGFyYW1zICE9IG51bGwpCiAJICAgIGZpbGVuYW1lID0gYnMuY1BhcmFtcy5nZXQoIm5hbWUiKTsKIAlpZiAoZGVjb2RlRmlsZU5hbWUgJiYgZmlsZW5hbWUgIT0gbnVsbCkgewogCSAgICB0cnkgewpAQCAtMTY0LDEwICsxODAsMTIgQEAKIAlyZXR1cm4gZmlsZW5hbWU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQQm9keVBhcnQgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CiAJYm9vbGVhbiBwayA9IG1lc3NhZ2UuZ2V0UGVlaygpOwkvLyBhY3F1aXJlIG91dHNpZGUgb2YgbWVzc2FnZSBjYWNoZSBsb2NrCkBAIC0yMDIsMTAgKzIyMCwxNSBAQAogCSAgICB9CiAJfQogCi0JaWYgKGlzID09IG51bGwpCi0JICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIk5vIGNvbnRlbnQiKTsKLQllbHNlCi0JICAgIHJldHVybiBpczsKKwlpZiAoaXMgPT0gbnVsbCkgeworCSAgICBtZXNzYWdlLmZvcmNlQ2hlY2tFeHB1bmdlZCgpOyAvLyBtYXkgdGhyb3cgTWVzc2FnZVJlbW92ZWRFeGNlcHRpb24KKwkgICAgLy8gbm9wZSwgdGhlIHNlcnZlciBkb2Vzbid0IHRoaW5rIGl0J3MgZXhwdW5nZWQuCisJICAgIC8vIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2VydmVyIHJldHVybmluZyBOSUwKKwkgICAgLy8gYW5kIHNvbWUgb3RoZXIgZXJyb3IgdGhhdCBjYXVzZWQgbnVsbCB0byBiZSByZXR1cm5lZCBhYm92ZSwKKwkgICAgLy8gc28gd2UnbGwganVzdCBhc3N1bWUgaXQgd2FzIGVtcHR5IGNvbnRlbnQuCisJICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsKKwl9CisJcmV0dXJuIGlzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQzLDcgKzI2Niw2IEBACiAKIAkJICAgIHRyeSB7CiAJCQkvLyBXcml0ZSBvdXQgdGhlIGhlYWRlcgotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGhkckxpbmVzCiAJCQkJPSBzdXBlci5nZXRBbGxIZWFkZXJMaW5lcygpOwogCQkJd2hpbGUgKGhkckxpbmVzLmhhc01vcmVFbGVtZW50cygpKQpAQCAtMjc1LDYgKzI5Nyw3IEBACiAgICAgICogQHJldHVybgl0aGUgTUlNRSBmb3JtYXQgc3RyZWFtCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNC41CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldE1pbWVTdHJlYW0oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAkvKgogCSAqIFRoZSBJTUFQIHByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCByZXR1cm5pbmcgdGhlIGVudGlyZQpAQCAtMjg0LDYgKzMwNyw3IEBACiAJcmV0dXJuIG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKGdldEhlYWRlclN0cmVhbSgpLCBnZXRDb250ZW50U3RyZWFtKCkpOwogICAgIH0KIAkgICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcigpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoZGggPT0gbnVsbCkgewpAQCAtMzA1LDc1ICszMjksODMgQEAKIAlyZXR1cm4gc3VwZXIuZ2V0RGF0YUhhbmRsZXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBjb250ZW50KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQQm9keVBhcnQgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChPYmplY3QgbywgU3RyaW5nIHR5cGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBCb2R5UGFydCBpcyByZWFkLW9ubHkiKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KE11bHRpcGFydCBtcCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUEJvZHlQYXJ0IGlzIHJlYWQtb25seSIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWxvYWRIZWFkZXJzKCk7CiAJcmV0dXJuIHN1cGVyLmdldEhlYWRlcihuYW1lKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKIAkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUEJvZHlQYXJ0IGlzIHJlYWQtb25seSIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQQm9keVBhcnQgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQQm9keVBhcnQgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0QWxsSGVhZGVycygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWxvYWRIZWFkZXJzKCk7CiAJcmV0dXJuIHN1cGVyLmdldEFsbEhlYWRlcnMoKTsKICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRNYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCiAJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWxvYWRIZWFkZXJzKCk7CiAJcmV0dXJuIHN1cGVyLmdldE1hdGNoaW5nSGVhZGVycyhuYW1lcyk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlsb2FkSGVhZGVycygpOwogCXJldHVybiBzdXBlci5nZXROb25NYXRjaGluZ0hlYWRlcnMobmFtZXMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlckxpbmUoU3RyaW5nIGxpbmUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBCb2R5UGFydCBpcyByZWFkLW9ubHkiKTsKICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBbGxIZWFkZXJMaW5lcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWxvYWRIZWFkZXJzKCk7CiAJcmV0dXJuIHN1cGVyLmdldEFsbEhlYWRlckxpbmVzKCk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKIAkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJbG9hZEhlYWRlcnMoKTsKIAlyZXR1cm4gc3VwZXIuZ2V0TWF0Y2hpbmdIZWFkZXJMaW5lcyhuYW1lcyk7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKIAkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJbG9hZEhlYWRlcnMoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQRm9sZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUEZvbGRlci5qYXZhCmluZGV4IGI4MDE0NTkuLjA1OGFkNTYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQRm9sZGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBGb2xkZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTU4LDcgKzU4LDkgQEAKIGltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lio7CiBpbXBvcnQgamF2YXgubWFpbC5zZWFyY2guKjsKIAotaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLio7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUHJvcFV0aWw7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWFpbExvZ2dlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5DUkxGT3V0cHV0U3RyZWFtOwogaW1wb3J0IGNvbS5zdW4ubWFpbC5pYXAuKjsKIGltcG9ydCBjb20uc3VuLm1haWwuaW1hcC5wcm90b2NvbC4qOwogCkBAIC0yNzYsNiArMjc4LDcgQEAKICAgICAJCQkJCS8vIHRoZSBzZXJ2ZXIKICAgICBwcml2YXRlIGxvbmcgdWlkdmFsaWRpdHkgPSAtMTsJLy8gVUlEVmFsaWRpdHkKICAgICBwcml2YXRlIGxvbmcgdWlkbmV4dCA9IC0xOwkJLy8gVUlETmV4dAorICAgIHByaXZhdGUgYm9vbGVhbiB1aWROb3RTdGlja3kgPSBmYWxzZTsJLy8gUkZDIDQzMTUKICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgaGlnaGVzdG1vZHNlcSA9IC0xOwkvLyBSRkMgNDU1MSAtIENPTkRTVE9SRQogICAgIHByaXZhdGUgYm9vbGVhbiBkb0V4cHVuZ2VOb3RpZmljYXRpb24gPSB0cnVlOyAvLyB1c2VkIGluIGV4cHVuZ2UgaGFuZGxlcgogCkBAIC0zOTMsOCArMzk2LDggQEAKIAkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJGb2xkZXIgbmFtZSBpcyBudWxsIik7CiAJdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOwogCXRoaXMuc2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCWxvZ2dlciA9IG5ldyBNYWlsTG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKSwKLQkJCQkiREVCVUcgSU1BUCIsIHN0b3JlLmdldFNlc3Npb24oKSk7CisJbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLCAiREVCVUcgSU1BUCIsCisJICAgIHN0b3JlLmdldFNlc3Npb24oKS5nZXREZWJ1ZygpLCBzdG9yZS5nZXRTZXNzaW9uKCkuZ2V0RGVidWdPdXQoKSk7CiAJY29ubmVjdGlvblBvb2xMb2dnZXIgPSBzdG9yZS5nZXRDb25uZWN0aW9uUG9vbExvZ2dlcigpOwogCiAJLyoKQEAgLTUzNCw2ICs1MzcsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGlzIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewogCS8qIFJldHVybiB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhpcyBGb2xkZXIncyBmdWxsIG5hbWUuCiAJICogRm9sZGVyIGNvbXBvbmVudHMgYXJlIGRlbGltaXRlZCBieSB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KQEAgLTU1MSw2ICs1NTUsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgZnVsbG5hbWUgb2YgdGhpcyBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKIAlyZXR1cm4gZnVsbE5hbWU7CQogICAgIH0KQEAgLTU1OCw2ICs1NjMsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGlzIGZvbGRlcidzIHBhcmVudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEZvbGRlciBnZXRQYXJlbnQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGFyIGMgPSBnZXRTZXBhcmF0b3IoKTsKIAlpbnQgaW5kZXg7CkBAIC01NzEsNiArNTc3LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgZm9sZGVyIHJlYWxseSBleGlzdHMgb24gdGhlIHNlcnZlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXhpc3RzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJLy8gQ2hlY2sgd2hldGhlciB0aGlzIGZvbGRlciBleGlzdHMgLi4KIAlMaXN0SW5mb1tdIGxpID0gbnVsbDsKQEAgLTU4MSw2ICs1ODgsNyBAQAogCSAgICBsbmFtZSA9IGZ1bGxOYW1lOwogCiAJbGkgPSAoTGlzdEluZm9bXSlkb0NvbW1hbmQobmV3IFByb3RvY29sQ29tbWFuZCgpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyBPYmplY3QgZG9Db21tYW5kKElNQVBQcm90b2NvbCBwKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQlyZXR1cm4gcC5saXN0KCIiLCBsbmFtZSk7CiAJICAgIH0KQEAgLTYzNCw2ICs2NDIsNyBAQAogICAgIC8qKgogICAgICAqIExpc3QgYWxsIHN1YmZvbGRlcnMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGb2xkZXJbXSBsaXN0KFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZG9MaXN0KHBhdHRlcm4sIGZhbHNlKTsKICAgICB9CkBAIC02NDEsNiArNjUwLDcgQEAKICAgICAvKioKICAgICAgKiBMaXN0IGFsbCBzdWJzY3JpYmVkIHN1YmZvbGRlcnMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGb2xkZXJbXSBsaXN0U3Vic2NyaWJlZChTdHJpbmcgcGF0dGVybikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGRvTGlzdChwYXR0ZXJuLCB0cnVlKTsKICAgICB9CkBAIC02NTcsNiArNjY3LDcgQEAKIAogCUxpc3RJbmZvW10gbGkgPSAoTGlzdEluZm9bXSlkb0NvbW1hbmRJZ25vcmVGYWlsdXJlKAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgaWYgKHN1YnNjcmliZWQpCkBAIC02OTUsMTEgKzcwNiwxMyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGNoYXIgZ2V0U2VwYXJhdG9yKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKHNlcGFyYXRvciA9PSBVTktOT1dOX1NFUEFSQVRPUikgewogCSAgICBMaXN0SW5mb1tdIGxpID0gbnVsbDsKIAogCSAgICBsaSA9IChMaXN0SW5mb1tdKWRvQ29tbWFuZChuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgLy8gUkVWMSBhbGxvd3MgdGhlIGZvbGxvd2luZyBMSVNUIGZvcm1hdCB0byBvYnRhaW4KQEAgLTcyMyw2ICs3MzYsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUeXBlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKG9wZW5lZCkgewogCSAgICAvLyBuZXZlciB0aHJvdyBGb2xkZXJOb3RGb3VuZEV4Y2VwdGlvbiBpZiBmb2xkZXIgaXMgb3BlbgpAQCAtNzM3LDYgKzc1MSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIGZvbGRlciBpcyBzdWJzY3JpYmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N1YnNjcmliZWQoKSB7CiAJTGlzdEluZm9bXSBsaSA9IG51bGw7CiAJZmluYWwgU3RyaW5nIGxuYW1lOwpAQCAtNzQ3LDYgKzc2Miw3IEBACiAKIAl0cnkgewogCSAgICBsaSA9IChMaXN0SW5mb1tdKWRvUHJvdG9jb2xDb21tYW5kKG5ldyBQcm90b2NvbENvbW1hbmQoKSB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGRvQ29tbWFuZChJTUFQUHJvdG9jb2wgcCkKIAkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCSAgICByZXR1cm4gcC5sc3ViKCIiLCBsbmFtZSk7CkBAIC03NjUsOSArNzgxLDExIEBACiAgICAgLyoqCiAgICAgICogU3Vic2NyaWJlL1Vuc3Vic2NyaWJlIHRoaXMgZm9sZGVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdWJzY3JpYmVkKGZpbmFsIGJvb2xlYW4gc3Vic2NyaWJlKSAKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWRvQ29tbWFuZElnbm9yZUZhaWx1cmUobmV3IFByb3RvY29sQ29tbWFuZCgpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyBPYmplY3QgZG9Db21tYW5kKElNQVBQcm90b2NvbCBwKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQlpZiAoc3Vic2NyaWJlKQogCQkgICAgcC5zdWJzY3JpYmUoZnVsbE5hbWUpOwpAQCAtNzgxLDYgKzc5OSw3IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlIHRoaXMgZm9sZGVyLCB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY3JlYXRlKGZpbmFsIGludCB0eXBlKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCkBAIC03ODksNiArODA4LDcgQEAKIAkgICAgYyA9IGdldFNlcGFyYXRvcigpOwogCWZpbmFsIGNoYXIgc2VwID0gYzsKIAlPYmplY3QgcmV0ID0gZG9Db21tYW5kSWdub3JlRmFpbHVyZShuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCSAgICBAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgaWYgKCh0eXBlICYgSE9MRFNfTUVTU0FHRVMpID09IDApCS8vIG9ubHkgaG9sZHMgZm9sZGVycwpAQCAtODMxLDYgKzg1MSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIGZvbGRlciBoYXMgbmV3IG1lc3NhZ2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXdNZXNzYWdlcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXN5bmNocm9uaXplZCAobWVzc2FnZUNhY2hlTG9jaykgewogCSAgICBpZiAob3BlbmVkKSB7IC8vIElmIHdlIGFyZSBvcGVuLCB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBpbmZvcm1hdGlvbgpAQCAtODU3LDYgKzg3OCw3IEBACiAJZWxzZQogCSAgICBsbmFtZSA9IGZ1bGxOYW1lOwogCWxpID0gKExpc3RJbmZvW10pZG9Db21tYW5kSWdub3JlRmFpbHVyZShuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCXJldHVybiBwLmxpc3QoIiIsIGxuYW1lKTsKIAkgICAgfQpAQCAtODkyLDYgKzkxNCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBuYW1lZCBzdWJmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBuYW1lKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIElmIHdlIGtub3cgdGhhdCB0aGlzIGZvbGRlciBpcyAqbm90KiBhIGRpcmVjdG9yeSwgZG9uJ3QKQEAgLTkwNiw2ICs5MjksNyBAQAogICAgIC8qKgogICAgICAqIERlbGV0ZSB0aGlzIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGVsZXRlKGJvb2xlYW4gcmVjdXJzZSkgCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsgIAogCWNoZWNrQ2xvc2VkKCk7IC8vIGluc3VyZSB0aGF0IHRoaXMgZm9sZGVyIGlzIGNsb3NlZC4KQEAgLTkyMCw2ICs5NDQsNyBAQAogCS8vIEF0dGVtcHQgdG8gZGVsZXRlIHRoaXMgZm9sZGVyCiAKIAlPYmplY3QgcmV0ID0gZG9Db21tYW5kSWdub3JlRmFpbHVyZShuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCXAuZGVsZXRlKGZ1bGxOYW1lKTsKIAkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKQEAgLTk0Miw2ICs5NjcsNyBAQAogICAgIC8qKgogICAgICAqIFJlbmFtZSB0aGlzIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVuYW1lVG8oZmluYWwgRm9sZGVyIGYpCiAJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tDbG9zZWQoKTsgLy8gaW5zdXJlIHRoYXQgd2UgYXJlIGNsb3NlZC4KQEAgLTk1MSw2ICs5NzcsNyBAQAogCiAKIAlPYmplY3QgcmV0ID0gZG9Db21tYW5kSWdub3JlRmFpbHVyZShuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCXAucmVuYW1lKGZ1bGxOYW1lLCBmLmdldEZ1bGxOYW1lKCkpOwogCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwpAQCAtOTY5LDYgKzk5Niw3IEBACiAgICAgLyoqCiAgICAgICogT3BlbiB0aGlzIGZvbGRlciBpbiB0aGUgZ2l2ZW4gbW9kZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb3BlbihpbnQgbW9kZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJb3Blbihtb2RlLCBudWxsKTsKICAgICB9CkBAIC0xMDU2LDEyICsxMDg0LDkgQEAKIAkgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGV4KSB7CiAJCS8vIGdvdCBhIEJBRCBvciBhIEJZRTsgY29ubmVjdGlvbiBtYXkgYmUgYmFkLCBjbG9zZSBpdAogCQl0cnkgewotCQkgICAgcHJvdG9jb2wubG9nb3V0KCk7Ci0JCX0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHBleDIpIHsKLQkJICAgIC8vIGlnbm9yZQorCQkgICAgdGhyb3cgbG9nb3V0QW5kVGhyb3cocGV4LmdldE1lc3NhZ2UoKSwgcGV4KTsKIAkJfSBmaW5hbGx5IHsKIAkJICAgIHJlbGVhc2VQcm90b2NvbChmYWxzZSk7Ci0JCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKHBleC5nZXRNZXNzYWdlKCksIHBleCk7CiAJCX0KIAkgICAgfQogCkBAIC0xMDcwLDI0ICsxMDk1LDkgQEAKIAkJCSgoSU1BUFN0b3JlKXN0b3JlKS5hbGxvd1JlYWRPbmx5U2VsZWN0KCkpIHsKIAkJICAgIDsJCS8vIGFsbCBvaywgYWxsb3cgaXQKIAkJfSBlbHNlIHsJLy8gb3RoZXJ3aXNlLCBpdCdzIGFuIGVycm9yCi0JCSAgICB0cnkgewotCQkJLy8gY2xvc2UgbWFpbGJveCBhbmQgcmV0dXJuIGNvbm5lY3Rpb24KLQkJCXByb3RvY29sLmNsb3NlKCk7Ci0JCQlyZWxlYXNlUHJvdG9jb2wodHJ1ZSk7Ci0JCSAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZXgpIHsKLQkJCS8vIHNvbWV0aGluZyB3ZW50IHdyb25nLCBjbG9zZSBjb25uZWN0aW9uCi0JCQl0cnkgewotCQkJICAgIHByb3RvY29sLmxvZ291dCgpOwotCQkJfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGV4MikgewotCQkJICAgIC8vIGlnbm9yZQotCQkJfSBmaW5hbGx5IHsKLQkJCSAgICByZWxlYXNlUHJvdG9jb2woZmFsc2UpOwotCQkJfQotCQkgICAgfSBmaW5hbGx5IHsKLQkJCXRocm93IG5ldyBSZWFkT25seUZvbGRlckV4Y2VwdGlvbih0aGlzLAotCQkJCSAgICAgICJDYW5ub3Qgb3BlbiBpbiBkZXNpcmVkIG1vZGUiKTsKLQkJICAgIH0KLQorCQkgICAgUmVhZE9ubHlGb2xkZXJFeGNlcHRpb24gaWZlID0gbmV3IFJlYWRPbmx5Rm9sZGVyRXhjZXB0aW9uKAorCQkJICAgIHRoaXMsICJDYW5ub3Qgb3BlbiBpbiBkZXNpcmVkIG1vZGUiKTsKKwkJICAgIHRocm93IGNsZWFudXBBbmRUaHJvdyhpZmUpOwogCQl9CiAgICAgICAgICAgICB9CiAJCkBAIC0xMTAxLDYgKzExMTEsNyBAQAogCSAgICByZWNlbnQgPSBtaS5yZWNlbnQ7CiAJICAgIHVpZHZhbGlkaXR5ID0gbWkudWlkdmFsaWRpdHk7CiAJICAgIHVpZG5leHQgPSBtaS51aWRuZXh0OworCSAgICB1aWROb3RTdGlja3kgPSBtaS51aWROb3RTdGlja3k7CiAJICAgIGhpZ2hlc3Rtb2RzZXEgPSBtaS5oaWdoZXN0bW9kc2VxOwogCiAJICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSBjYWNoZSBvZiBhcHByb3ByaWF0ZSBzaXplCkBAIC0xMTA4LDcgKzExMTksNyBAQAogCiAJICAgIC8vIHByb2Nlc3Mgc2F2ZWQgcmVzcG9uc2VzIGFuZCByZXR1cm4gY29ycmVzcG9uZGluZyBldmVudHMKIAkgICAgaWYgKG1pLnJlc3BvbnNlcyAhPSBudWxsKSB7Ci0JCW9wZW5FdmVudHMgPSBuZXcgQXJyYXlMaXN0PE1haWxFdmVudD4oKTsKKwkJb3BlbkV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlmb3IgKElNQVBSZXNwb25zZSBpciA6IG1pLnJlc3BvbnNlcykgewogCQkgICAgaWYgKGlyLmtleUVxdWFscygiVkFOSVNIRUQiKSkgewogCQkJLy8gIlZBTklTSEVEIiBTUCBbIihFQVJMSUVSKSJdIFNQIGtub3duLXVpZHMKQEAgLTExNDUsOSArMTE1Niw1OSBAQAogCXJldHVybiBvcGVuRXZlbnRzOwogICAgIH0KIAorICAgIHByaXZhdGUgTWVzc2FnaW5nRXhjZXB0aW9uIGNsZWFudXBBbmRUaHJvdyhNZXNzYWdpbmdFeGNlcHRpb24gaWZlKSB7CisJdHJ5IHsKKwkgICAgdHJ5IHsKKwkJLy8gY2xvc2UgbWFpbGJveCBhbmQgcmV0dXJuIGNvbm5lY3Rpb24KKwkJcHJvdG9jb2wuY2xvc2UoKTsKKwkJcmVsZWFzZVByb3RvY29sKHRydWUpOworCSAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZXgpIHsKKwkJLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcsIGNsb3NlIGNvbm5lY3Rpb24KKwkJdHJ5IHsKKwkJICAgIGFkZFN1cHByZXNzZWQoaWZlLCBsb2dvdXRBbmRUaHJvdyhwZXguZ2V0TWVzc2FnZSgpLCBwZXgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJICAgIHJlbGVhc2VQcm90b2NvbChmYWxzZSk7CisJCX0KKwkgICAgfQorCX0gY2F0Y2ggKFRocm93YWJsZSB0aHIpIHsKKwkgICAgYWRkU3VwcHJlc3NlZChpZmUsIHRocik7CisJfQorCXJldHVybiBpZmU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXNzYWdpbmdFeGNlcHRpb24gbG9nb3V0QW5kVGhyb3coU3RyaW5nIHdoeSwgUHJvdG9jb2xFeGNlcHRpb24gdCkgeworCU1lc3NhZ2luZ0V4Y2VwdGlvbiBpZmUgPSBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKHdoeSwgdCk7CisJdHJ5IHsKKwkgICAgcHJvdG9jb2wubG9nb3V0KCk7CisJfSBjYXRjaCAoVGhyb3dhYmxlIHRocikgeworCSAgICBhZGRTdXBwcmVzc2VkKGlmZSwgdGhyKTsKKwl9CisJcmV0dXJuIGlmZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkU3VwcHJlc3NlZChUaHJvd2FibGUgaWZlLCBUaHJvd2FibGUgdGhyKSB7CisJaWYgKGlzUmVjb3ZlcmFibGUodGhyKSkgeworCSAgICBpZmUuYWRkU3VwcHJlc3NlZCh0aHIpOworCX0gZWxzZSB7CisJICAgIHRoci5hZGRTdXBwcmVzc2VkKGlmZSk7CisJICAgIGlmICh0aHIgaW5zdGFuY2VvZiBFcnJvcikgeworCQl0aHJvdyAoRXJyb3IpIHRocjsKKwkgICAgfQorCSAgICBpZiAodGhyIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgdGhyOworCSAgICB9CisJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHRocik7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlY292ZXJhYmxlKFRocm93YWJsZSB0KSB7CisJcmV0dXJuICh0IGluc3RhbmNlb2YgRXhjZXB0aW9uKSB8fCAodCBpbnN0YW5jZW9mIExpbmthZ2VFcnJvcik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUHJlZmV0Y2ggYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIGdpdmVuIEZldGNoUHJvZmlsZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmV0Y2goTWVzc2FnZVtdIG1zZ3MsIEZldGNoUHJvZmlsZSBmcCkKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIGNhY2hlIHRoaXMgaW5mb3JtYXRpb24gaW4gY2FzZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQKQEAgLTExNjAsNyArMTIyMSw3IEBACiAJICAgIGZpdGVtcyA9IHByb3RvY29sLmdldEZldGNoSXRlbXMoKTsKIAl9CiAKLQlTdHJpbmdCdWZmZXIgY29tbWFuZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmdCdWlsZGVyIGNvbW1hbmQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwogCWJvb2xlYW4gYWxsSGVhZGVycyA9IGZhbHNlOwogCkBAIC0xMjQ4LDcgKzEzMDksNyBAQAogCiAJICAgIFJlc3BvbnNlW10gciA9IG51bGw7CiAJICAgIC8vIHRvIGNvbGxlY3Qgbm9uLUZFVENIIHJlc3BvbnNlcyAmIHVuc29saWNpdGVkIEZFVENIIEZMQUcgcmVzcG9uc2VzIAotCSAgICBMaXN0PFJlc3BvbnNlPiB2ID0gbmV3IEFycmF5TGlzdDxSZXNwb25zZT4oKTsKKwkgICAgTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCSAgICB0cnkgewogCQlyID0gZ2V0UHJvdG9jb2woKS5mZXRjaChtc2dzZXRzLCBjb21tYW5kLnRvU3RyaW5nKCkpOwogCSAgICB9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGNleCkgewpAQCAtMTMzOSwxMiArMTQwMCwxMiBAQAogICAgICAqIHJlcXVlc3RlZCBoZWFkZXJzLgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUhlYWRlckNvbW1hbmQoU3RyaW5nW10gaGRycywgYm9vbGVhbiBpc1JldjEpIHsKLQlTdHJpbmdCdWZmZXIgc2I7CisJU3RyaW5nQnVpbGRlciBzYjsKIAogCWlmIChpc1JldjEpCi0JICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQk9EWS5QRUVLW0hFQURFUi5GSUVMRFMgKCIpOworCSAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJCT0RZLlBFRUtbSEVBREVSLkZJRUxEUyAoIik7CiAJZWxzZQotCSAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJGQzgyMi5IRUFERVIuTElORVMgKCIpOworCSAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJSRkM4MjIuSEVBREVSLkxJTkVTICgiKTsKIAogCWZvciAoaW50IGkgPSAwOyBpIDwgaGRycy5sZW5ndGg7IGkrKykgewogCSAgICBpZiAoaSA+IDApCkBAIC0xMzYzLDYgKzE0MjQsNyBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGZsYWdzIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbWVzc2FnZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZsYWdzKE1lc3NhZ2VbXSBtc2dzLCBGbGFncyBmbGFnLCBib29sZWFuIHZhbHVlKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tPcGVuZWQoKTsKQEAgLTEzOTAsNiArMTQ1Miw3IEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBzcGVjaWZpZWQgZmxhZ3MgZm9yIHRoZSBnaXZlbiByYW5nZSBvZiBtZXNzYWdlIG51bWJlcnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZsYWdzKGludCBzdGFydCwgaW50IGVuZCwKIAkJCUZsYWdzIGZsYWcsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrT3BlbmVkKCk7CkBAIC0xNDAzLDYgKzE0NjYsNyBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGZsYWdzIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbWVzc2FnZSBudW1iZXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGbGFncyhpbnRbXSBtc2dudW1zLCBGbGFncyBmbGFnLCBib29sZWFuIHZhbHVlKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tPcGVuZWQoKTsKQEAgLTE0MTUsNiArMTQ3OSw3IEBACiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhpcyBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKGJvb2xlYW4gZXhwdW5nZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2xvc2UoZXhwdW5nZSwgZmFsc2UpOwogICAgIH0KQEAgLTE1NDUsNiArMTYxMCw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gaXMgcmVhbGx5IG9wZW4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzT3BlbigpIHsKIAlzeW5jaHJvbml6ZWQobWVzc2FnZUNhY2hlTG9jaykgewogCSAgICAvLyBQcm9iZSB0aGUgY29ubmVjdGlvbiB0byBtYWtlIHN1cmUgaXRzIHJlYWxseSBvcGVuLgpAQCAtMTU2MSw2ICsxNjI3LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBlcm1hbmVudCBmbGFncyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEZsYWdzIGdldFBlcm1hbmVudEZsYWdzKCkgewogCWlmIChwZXJtYW5lbnRGbGFncyA9PSBudWxsKQogCSAgICByZXR1cm4gbnVsbDsKQEAgLTE1NzAsNiArMTYzNyw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB0b3RhbCBtZXNzYWdlIGNvdW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1lc3NhZ2VDb3VudCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXN5bmNocm9uaXplZCAobWVzc2FnZUNhY2hlTG9jaykgewogCSAgICBpZiAob3BlbmVkKSB7CkBAIC0xNjE4LDYgKzE2ODYsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgbmV3IG1lc3NhZ2UgY291bnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TmV3TWVzc2FnZUNvdW50KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc3luY2hyb25pemVkIChtZXNzYWdlQ2FjaGVMb2NrKSB7CiAJICAgIGlmIChvcGVuZWQpIHsKQEAgLTE2NjYsNiArMTczNSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB1bnJlYWQgbWVzc2FnZSBjb3VudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRVbnJlYWRNZXNzYWdlQ291bnQoKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKCFvcGVuZWQpIHsKQEAgLTE3MDcsNiArMTc3Nyw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBkZWxldGVkIG1lc3NhZ2UgY291bnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0RGVsZXRlZE1lc3NhZ2VDb3VudCgpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoIW9wZW5lZCkgewpAQCAtMTc2NCw2ICsxODM1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZSBnZXRNZXNzYWdlKGludCBtc2dudW0pIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja09wZW5lZCgpOwpAQCAtMTc5Miw2ICsxODY0LDcgQEAKICAgICAvKioKICAgICAgKiBBcHBlbmQgdGhlIGdpdmVuIG1lc3NhZ2VzIGludG8gdGhpcyBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFwcGVuZE1lc3NhZ2VzKE1lc3NhZ2VbXSBtc2dzKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhpc3RzKCk7IC8vIHZlcmlmeSB0aGF0IHNlbGYgZXhpc3RzCkBAIC0xODI0LDYgKzE4OTcsNyBAQAogCSAgICB9CiAKIAkgICAgZG9Db21tYW5kKG5ldyBQcm90b2NvbENvbW1hbmQoKSB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGRvQ29tbWFuZChJTUFQUHJvdG9jb2wgcCkKIAkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJCSAgICBwLmFwcGVuZChmdWxsTmFtZSwgZiwgZGQsIG1vcyk7CkBAIC0xODg0LDYgKzE5NTgsNyBAQAogCSAgICBmaW5hbCBEYXRlIGRkID0gZDsKIAkgICAgZmluYWwgRmxhZ3MgZiA9IG0uZ2V0RmxhZ3MoKTsKIAkgICAgQXBwZW5kVUlEIGF1aWQgPSAoQXBwZW5kVUlEKWRvQ29tbWFuZChuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAuYXBwZW5kdWlkKGZ1bGxOYW1lLCBmLCBkZCwgbW9zKTsKQEAgLTE5MzcsNiArMjAxMiw3IEBACiAgICAgICogQ29weSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VzIGZyb20gdGhpcyBmb2xkZXIsIHRvIHRoZQogICAgICAqIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29weU1lc3NhZ2VzKE1lc3NhZ2VbXSBtc2dzLCBGb2xkZXIgZm9sZGVyKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY29weW1vdmVNZXNzYWdlcyhtc2dzLCBmb2xkZXIsIGZhbHNlKTsKQEAgLTE5NjgsNyArMjA0NCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29weSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VzIGZyb20gdGhpcyBmb2xkZXIsIHRvIHRoZQorICAgICAqIE1vdmUgdGhlIHNwZWNpZmllZCBtZXNzYWdlcyBmcm9tIHRoaXMgZm9sZGVyLCB0byB0aGUKICAgICAgKiBzcGVjaWZpZWQgZGVzdGluYXRpb24uCiAgICAgICoKICAgICAgKiBEZXBlbmRzIG9uIHRoZSBNT1ZFIGV4dGVuc2lvbgpAQCAtMTk4NiwxNCArMjA2MiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcHkgdGhlIHNwZWNpZmllZCBtZXNzYWdlcyBmcm9tIHRoaXMgZm9sZGVyLCB0byB0aGUKKyAgICAgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgbWVzc2FnZXMgZnJvbSB0aGlzIGZvbGRlciwgdG8gdGhlCiAgICAgICogc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgogICAgICAqIFJldHVybiBhcnJheSBvZiBBcHBlbmRVSUQgb2JqZWN0cyBjb250YWluaW5nCiAgICAgICogVUlEcyBvZiB0aGVzZSBtZXNzYWdlcyBpbiB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgogICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgY29ycmVzcG9uZHMgdG8KICAgICAgKiBhbiBlbGVtZW50IG9mIHRoZSA8Y29kZT5tc2dzPC9jb2RlPiBhcnJheS4gIEEgbnVsbAogICAgICAqIGVsZW1lbnQgbWVhbnMgdGhlIHNlcnZlciBkaWRuJ3QgcmV0dXJuIFVJRCBpbmZvcm1hdGlvbgotICAgICAqIGZvciB0aGUgY29waWVkIG1lc3NhZ2UuICA8cD4KKyAgICAgKiBmb3IgdGhlIG1vdmVkIG1lc3NhZ2UuICA8cD4KICAgICAgKgogICAgICAqIERlcGVuZHMgb24gdGhlIE1PVkUgZXh0ZW5zaW9uCiAgICAgICogKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzY4NTEudHh0Ij5SRkMgNjg1MTwvQT4pCkBAIC0yMDAxLDggKzIwNzcsOCBAQAogICAgICAqIFVJRFBMVVMgZXh0ZW5zaW9uCiAgICAgICogKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQzMTUudHh0Ij5SRkMgNDMxNTwvQT4pLgogICAgICAqCi0gICAgICogQHBhcmFtCW1zZ3MJdGhlIG1lc3NhZ2VzIHRvIGNvcHkKLSAgICAgKiBAcGFyYW0JZm9sZGVyCXRoZSBmb2xkZXIgdG8gY29weSB0aGUgbWVzc2FnZXMgdG8KKyAgICAgKiBAcGFyYW0JbXNncwl0aGUgbWVzc2FnZXMgdG8gbW92ZQorICAgICAqIEBwYXJhbQlmb2xkZXIJdGhlIGZvbGRlciB0byBtb3ZlIHRoZSBtZXNzYWdlcyB0bwogICAgICAqIEByZXR1cm4JCWFycmF5IG9mIEFwcGVuZFVJRCBvYmplY3RzCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNS40CkBAIC0yMTk3LDYgKzIyNzMsNyBAQAogICAgIC8qKgogICAgICAqIEV4cHVuZ2UgYWxsIG1lc3NhZ2VzIG1hcmtlZCBhcyBERUxFVEVELgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZVtdIGV4cHVuZ2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZXhwdW5nZShudWxsKTsKICAgICB9CkBAIC0yMjg2LDYgKzIzNjMsNyBAQAogICAgICAqCQkJdHJ1ZSBhbmQgdGhlIHNlYXJjaCBpcyB0b28gY29tcGxleCBmb3IgdGhlIElNQVAgcHJvdG9jb2wKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lc3NhZ2VbXSBzZWFyY2goU2VhcmNoVGVybSB0ZXJtKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrT3BlbmVkKCk7CkBAIC0yMzIxLDYgKzIzOTksNyBAQAogICAgICAqIGFycmF5IG9mIG1hdGNoaW5nIG1lc3NhZ2VzLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIG5vIG1hdGNoaW5nCiAgICAgICogbWVzc2FnZXMgYXJlIGZvdW5kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZVtdIHNlYXJjaChTZWFyY2hUZXJtIHRlcm0sIE1lc3NhZ2VbXSBtc2dzKSAKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrT3BlbmVkKCk7CkBAIC0yNDI2LDYgKzI1MDUsNyBAQAogICAgICAqIG1ldGhvZC4gIEl0J3MgdG9vIGhhcmQgdG8ga2VlcCB0cmFjayBvZiB3aGVuIGFsbCBsaXN0ZW5lcnMKICAgICAgKiBhcmUgcmVtb3ZlZCwgYW5kIHRoYXQncyBhIHJhcmUgY2FzZSwgc28gd2UgZG9uJ3QgdHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNZXNzYWdlQ291bnRMaXN0ZW5lcihNZXNzYWdlQ291bnRMaXN0ZW5lciBsKSB7IAogCXN1cGVyLmFkZE1lc3NhZ2VDb3VudExpc3RlbmVyKGwpOwogCWhhc01lc3NhZ2VDb3VudExpc3RlbmVyID0gdHJ1ZTsKQEAgLTI0MzgsNiArMjUxOCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgVUlEVmFsaWRpdHkgZm9yIHRoaXMgZm9sZGVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRVSURWYWxpZGl0eSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmIChvcGVuZWQpIC8vIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGluZm9ybWF0aW9uCiAJICAgIHJldHVybiB1aWR2YWxpZGl0eTsKQEAgLTI0NjEsNiArMjU0Miw4IEBACiAgICAgICAgICAgICByZWxlYXNlU3RvcmVQcm90b2NvbChwKTsKICAgICAgICAgfQogCisJaWYgKHN0YXR1cyA9PSBudWxsKQorCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJDYW5ub3Qgb2J0YWluIFVJRFZhbGlkaXR5Iik7CiAJcmV0dXJuIHN0YXR1cy51aWR2YWxpZGl0eTsKICAgICB9CiAKQEAgLTI0ODIsNyArMjU2NSw3IEBACiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuMy4zCiAgICAgICovCi0gICAgLy8gTm90IGEgVUlERm9sZGVyIG1ldGhvZCwgYnV0IHN0aWxsIHVzZWZ1bAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRVSUROZXh0KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKG9wZW5lZCkgLy8gd2UgYWxyZWFkeSBoYXZlIHRoaXMgaW5mb3JtYXRpb24KIAkgICAgcmV0dXJuIHVpZG5leHQ7CkBAIC0yNTA2LDYgKzI1ODksOCBAQAogICAgICAgICAgICAgcmVsZWFzZVN0b3JlUHJvdG9jb2wocCk7CiAgICAgICAgIH0KIAorCWlmIChzdGF0dXMgPT0gbnVsbCkKKwkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiQ2Fubm90IG9idGFpbiBVSUROZXh0Iik7CiAJcmV0dXJuIHN0YXR1cy51aWRuZXh0OwogICAgIH0KIApAQCAtMjUxMyw2ICsyNTk4LDcgQEAKICAgICAgKiBHZXQgdGhlIE1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVUlELgogICAgICAqIElmIG5vIHN1Y2ggbWVzc2FnZSBleGlzdHMsIDxjb2RlPiBudWxsIDwvY29kZT4gaXMgcmV0dXJuZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBNZXNzYWdlIGdldE1lc3NhZ2VCeVVJRChsb25nIHVpZCkgCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja09wZW5lZCgpOyAvLyBpbnN1cmUgZm9sZGVyIGlzIG9wZW4KQEAgLTI1MjksNyArMjYxNSw3IEBACiAJCSAgICBpZiAobSAhPSBudWxsKSAvLyBmb3VuZCBpdAogCQkJcmV0dXJuIG07CiAJCX0gZWxzZQotCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPExvbmcsIElNQVBNZXNzYWdlPigpOworCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogCQkvLyBDaGVjayB3aXRoIHRoZSBzZXJ2ZXIKIAkJLy8gSXNzdWUgVUlEIEZFVENIIGNvbW1hbmQKQEAgLTI1NTYsNiArMjY0Miw3IEBACiAgICAgICogUmV0dXJucyBNZXNzYWdlIG9iamVjdHMgZm9yIGFsbCB2YWxpZCBtZXNzYWdlcyBpbiB0aGlzIHJhbmdlLgogICAgICAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgbm8gbWVzc2FnZXMgYXJlIGZvdW5kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZVtdIGdldE1lc3NhZ2VzQnlVSUQobG9uZyBzdGFydCwgbG9uZyBlbmQpIAogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tPcGVuZWQoKTsgLy8gaW5zdXJlIHRoYXQgZm9sZGVyIGlzIG9wZW4KQEAgLTI1NjUsMTIgKzI2NTIsMTIgQEAKIAl0cnkgewogCSAgICBzeW5jaHJvbml6ZWQobWVzc2FnZUNhY2hlTG9jaykgewogCQlpZiAodWlkVGFibGUgPT0gbnVsbCkKLQkJICAgIHVpZFRhYmxlID0gbmV3IEhhc2h0YWJsZTxMb25nLCBJTUFQTWVzc2FnZT4oKTsKKwkJICAgIHVpZFRhYmxlID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKIAkJLy8gSXNzdWUgVUlEIEZFVENIIGZvciBnaXZlbiByYW5nZQogCQlsb25nW10gdWEgPSBnZXRQcm90b2NvbCgpLmZldGNoU2VxdWVuY2VOdW1iZXJzKHN0YXJ0LCBlbmQpOwogCi0JCUxpc3Q8TWVzc2FnZT4gbWEgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2U+KCk7CisJCUxpc3Q8TWVzc2FnZT4gbWEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJLy8gTk9URTogQmVsb3cgbXVzdCBiZSB3aXRoaW4gbWVzc2FnZUNhY2hlTG9jayByZWdpb24KIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB1YS5sZW5ndGg7IGkrKykgewogCQkgICAgTWVzc2FnZSBtID0gdWlkVGFibGUuZ2V0KExvbmcudmFsdWVPZih1YVtpXSkpOwpAQCAtMjU5NSw2ICsyNjgyLDcgQEAKICAgICAgKiBJZiBhbnkgVUlEIGluIHRoZSBhcnJheSBpcyBpbnZhbGlkLCBhIDxjb2RlPm51bGw8L2NvZGU+IGVudHJ5CiAgICAgICogaXMgcmV0dXJuZWQgZm9yIHRoYXQgZWxlbWVudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lc3NhZ2VbXSBnZXRNZXNzYWdlc0J5VUlEKGxvbmdbXSB1aWRzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tPcGVuZWQoKTsgLy8gaW5zdXJlIHRoYXQgZm9sZGVyIGlzIG9wZW4KQEAgLTI2MDQsNyArMjY5Miw3IEBACiAJCWxvbmdbXSB1bmF2YWlsVWlkcyA9IHVpZHM7CiAJCWlmICh1aWRUYWJsZSAhPSBudWxsKSB7CiAJCSAgICAvLyB0byBjb2xsZWN0IHVuYXZhaWxhYmxlIFVJRHMKLQkJICAgIExpc3Q8TG9uZz4gdiA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKKwkJICAgIExpc3Q8TG9uZz4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQkgICAgZm9yIChsb25nIHVpZCA6IHVpZHMpIHsKIAkJCWlmICghdWlkVGFibGUuY29udGFpbnNLZXkodWlkKSkgewogCQkJICAgIC8vIFRoaXMgVUlEIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LgpAQCAtMjYxOCw3ICsyNzA2LDcgQEAKIAkJCXVuYXZhaWxVaWRzW2ldID0gdi5nZXQoaSk7CiAJCSAgICB9CiAJCX0gZWxzZQotCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPExvbmcsIElNQVBNZXNzYWdlPigpOworCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogCQlpZiAodW5hdmFpbFVpZHMubGVuZ3RoID4gMCkgewogCQkgICAgLy8gSXNzdWUgVUlEIEZFVENIIHJlcXVlc3QgZm9yIGdpdmVuIHVpZHMKQEAgLTI2NDEsNiArMjcyOSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBVSUQgZm9yIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0VUlEKE1lc3NhZ2UgbWVzc2FnZSkgCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAobWVzc2FnZS5nZXRGb2xkZXIoKSAhPSB0aGlzKQpAQCAtMjY2OSw3ICsyNzU4LDcgQEAKIAogCQkgICAgLy8gaW5zZXJ0IHRoaXMgbWVzc2FnZSBpbnRvIHVpZFRhYmxlCiAJCSAgICBpZiAodWlkVGFibGUgPT0gbnVsbCkKLQkJCXVpZFRhYmxlID0gbmV3IEhhc2h0YWJsZTxMb25nLCBJTUFQTWVzc2FnZT4oKTsKKwkJCXVpZFRhYmxlID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAJCSAgICB1aWRUYWJsZS5wdXQoTG9uZy52YWx1ZU9mKHVpZCksIG0pOwogCQl9CiAJICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25FeGNlcHRpb24gY2V4KSB7CkBAIC0yNjgzLDYgKzI3NzIsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXJ2ZXJzIHRoYXQgc3VwcG9ydCB0aGUgVUlEUExVUyBleHRlbnNpb24KKyAgICAgKiAoPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDMxNS50eHQiPlJGQyA0MzE1PC9BPikKKyAgICAgKiBtYXkgaW5kaWNhdGUgdGhhdCB0aGlzIGZvbGRlciBkb2VzIG5vdCBzdXBwb3J0IHBlcnNpc3RlbnQgVUlEczsKKyAgICAgKiB0aGF0IGlzLCBVSURWQUxJRElUWSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUgdGhlIGZvbGRlciBpcworICAgICAqIG9wZW5lZC4gIE9ubHkgdmFsaWQgd2hlbiB0aGUgZm9sZGVyIGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCXRydWUgaWYgVUlEcyBhcmUgbm90IHN0aWNreQorICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcworICAgICAqIEBleGNlcHRpb24JSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoZSBmb2xkZXIgaXNuJ3Qgb3BlbgorICAgICAqIEBzZWUgIlJGQyA0MzE1IgorICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjYuMAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBnZXRVSUROb3RTdGlja3koKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKKwljaGVja09wZW5lZCgpOworCXJldHVybiB1aWROb3RTdGlja3k7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0IG9yIGNyZWF0ZSBNZXNzYWdlIG9iamVjdHMgZm9yIHRoZSBVSURzLgogICAgICAqLwogICAgIHByaXZhdGUgTWVzc2FnZVtdIGNyZWF0ZU1lc3NhZ2VzRm9yVUlEcyhsb25nW10gdWlkcykgewpAQCAtMjczNSw2ICsyODQyLDggQEAKICAgICAgICAgICAgIHJlbGVhc2VTdG9yZVByb3RvY29sKHApOwogICAgICAgICB9CiAKKwlpZiAoc3RhdHVzID09IG51bGwpCisJICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIkNhbm5vdCBvYnRhaW4gSElHSEVTVE1PRFNFUSIpOwogCXJldHVybiBzdGF0dXMuaGlnaGVzdG1vZHNlcTsKICAgICB9CiAKQEAgLTI3OTQsNiArMjkwMyw3IEBACiAgICAgcHVibGljIFF1b3RhW10gZ2V0UXVvdGEoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gKFF1b3RhW10pZG9PcHRpb25hbENvbW1hbmQoIlFVT1RBIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAuZ2V0UXVvdGFSb290KGZ1bGxOYW1lKTsKQEAgLTI4MTQsNiArMjkyNCw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0UXVvdGEoZmluYWwgUXVvdGEgcXVvdGEpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWRvT3B0aW9uYWxDb21tYW5kKCJRVU9UQSBub3Qgc3VwcG9ydGVkIiwKIAkgICAgbmV3IFByb3RvY29sQ29tbWFuZCgpIHsKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgZG9Db21tYW5kKElNQVBQcm90b2NvbCBwKQogCQkJdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAkJICAgIHAuc2V0UXVvdGEocXVvdGEpOwpAQCAtMjgzMiw2ICsyOTQzLDcgQEAKICAgICBwdWJsaWMgQUNMW10gZ2V0QUNMKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIChBQ0xbXSlkb09wdGlvbmFsQ29tbWFuZCgiQUNMIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAuZ2V0QUNMKGZ1bGxOYW1lKTsKQEAgLTI4NjIsNiArMjk3NCw3IEBACiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQUNMKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlkb09wdGlvbmFsQ29tbWFuZCgiQUNMIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcC5kZWxldGVBQ0woZnVsbE5hbWUsIG5hbWUpOwpAQCAtMjkxNyw2ICszMDMwLDcgQEAKICAgICBwdWJsaWMgUmlnaHRzW10gbGlzdFJpZ2h0cyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIChSaWdodHNbXSlkb09wdGlvbmFsQ29tbWFuZCgiQUNMIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAubGlzdFJpZ2h0cyhmdWxsTmFtZSwgbmFtZSk7CkBAIC0yOTM0LDYgKzMwNDgsNyBAQAogICAgIHB1YmxpYyBSaWdodHMgbXlSaWdodHMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gKFJpZ2h0cylkb09wdGlvbmFsQ29tbWFuZCgiQUNMIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAubXlSaWdodHMoZnVsbE5hbWUpOwpAQCAtMjk0NSw2ICszMDYwLDcgQEAKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlkb09wdGlvbmFsQ29tbWFuZCgiQUNMIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcC5zZXRBQ0woZnVsbE5hbWUsIG1vZCwgYWNsKTsKQEAgLTMwODIsNiArMzE5OCw3IEBACiAJCSAgICAiRm9sZGVyIGFscmVhZHkgYmVpbmcgd2F0Y2hlZCBieSBhbm90aGVyIElkbGVNYW5hZ2VyIik7CiAJICAgIEJvb2xlYW4gc3RhcnRlZCA9IChCb29sZWFuKWRvT3B0aW9uYWxDb21tYW5kKCJJRExFIG5vdCBzdXBwb3J0ZWQiLAogCQluZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQkgICAgQE92ZXJyaWRlCiAJCSAgICBwdWJsaWMgT2JqZWN0IGRvQ29tbWFuZChJTUFQUHJvdG9jb2wgcCkKIAkJCSAgICB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkJLy8gaWYgdGhlIElkbGVNYW5hZ2VyIGlzIGFscmVhZHkgd2F0Y2hpbmcgdGhpcyBmb2xkZXIsCkBAIC0zMzExLDYgKzM0MjgsNyBAQAogCWNoZWNrT3BlbmVkKCk7CiAJcmV0dXJuIChNYXA8U3RyaW5nLFN0cmluZz4pZG9PcHRpb25hbENvbW1hbmQoIklEIG5vdCBzdXBwb3J0ZWQiLAogCSAgICBuZXcgUHJvdG9jb2xDb21tYW5kKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBkb0NvbW1hbmQoSU1BUFByb3RvY29sIHApCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewogCQkgICAgcmV0dXJuIHAuaWQoY2xpZW50UGFyYW1zKTsKQEAgLTMzNDEsNyArMzQ1OSw3IEBACiAJCXAgPSBnZXRTdG9yZVByb3RvY29sKCk7CS8vIFhYWAogCQlTdHJpbmdbXSBpdGVtcyA9IHsgaXRlbSB9OwogCQlzdGF0dXMgPSBwLnN0YXR1cyhmdWxsTmFtZSwgaXRlbXMpOwotCQlyZXR1cm4gc3RhdHVzLmdldEl0ZW0oaXRlbSk7CisJCXJldHVybiBzdGF0dXMgIT0gbnVsbCA/IHN0YXR1cy5nZXRJdGVtKGl0ZW0pIDogLTE7CiAJICAgIH0gY2F0Y2ggKEJhZENvbW1hbmRFeGNlcHRpb24gYmV4KSB7CiAJCS8vIGRvZXNuJ3Qgc3VwcG9ydCBTVEFUVVMsIHByb2JhYmx5IHZhbmlsbGEgSU1BUDQgLi4KIAkJLy8gQ291bGQgRVhBTUlORSwgU0VBUkNIIGZvciBVTlJFQUQgbWVzc2FnZXMgYW5kCkBAIC0zMzcwLDYgKzM0ODgsNyBAQAogICAgICAqIHN5bmNocm9uaXplZCBtZXRob2RzIG9uIElNQVBGb2xkZXIgb3IgSU1BUE1lc3NhZ2UpCiAgICAgICogc2luY2UgdGhhdCB3aWxsIHJlc3VsdCBpbiB2aW9sYXRpbmcgdGhlIGxvY2tpbmcgaGllcmFyY2h5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHIpIHsKIAlhc3NlcnQgVGhyZWFkLmhvbGRzTG9jayhtZXNzYWdlQ2FjaGVMb2NrKTsKIApAQCAtMzQzOSw2ICszNTU4LDEzIEBACiAJICAgIC8vIEVYUFVOR0UgcmVzcG9uc2UuCiAKIAkgICAgaW50IHNlcW51bSA9IGlyLmdldE51bWJlcigpOworCSAgICBpZiAoc2VxbnVtID4gcmVhbFRvdGFsKSB7CisJCS8vIEEgbWVzc2FnZSB3YXMgZXhwdW5nZWQgdGhhdCB3ZSBuZXZlciBrbmV3IGFib3V0LgorCQkvLyBFeGNoYW5nZSB3aWxsIGRvIHRoaXMuICBKdXN0IGlnbm9yZSB0aGUgbm90aWZpY2F0aW9uLgorCQkvLyAoQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgc2ltdWxhdGUgYW4gRVhJU1RTIGZvciB0aGUKKwkJLy8gZXhwdW5nZWQgbWVzc2FnZSBiZWZvcmUgZXhwdW5naW5nIGl0LikKKwkJcmV0dXJuOworCSAgICB9CiAJICAgIE1lc3NhZ2VbXSBtc2dzID0gbnVsbDsKIAkgICAgaWYgKGRvRXhwdW5nZU5vdGlmaWNhdGlvbiAmJiBoYXNNZXNzYWdlQ291bnRMaXN0ZW5lcikgewogCQkvLyBzYXZlIHRoZSBNZXNzYWdlIG9iamVjdCBmaXJzdDsgY2FuJ3QgbG9vayBpdApAQCAtMzUwNyw3ICszNjMzLDcgQEAKIAkgICAgaWYgKHVpZCAhPSBudWxsICYmIG1zZy5nZXRVSUQoKSAhPSB1aWQudWlkKSB7CiAJCW1zZy5zZXRVSUQodWlkLnVpZCk7CiAJCWlmICh1aWRUYWJsZSA9PSBudWxsKQotCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPExvbmcsIElNQVBNZXNzYWdlPigpOworCQkgICAgdWlkVGFibGUgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAkJdWlkVGFibGUucHV0KExvbmcudmFsdWVPZih1aWQudWlkKSwgbXNnKTsKIAkJbm90aWZ5ID0gdHJ1ZTsKIAkgICAgfQpAQCAtMzk1NiwxMCArNDA4MiwxMiBAQAogCWJ1ZiA9IGxjLmdldEJ5dGVzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewogCXJldHVybiBtc2dTaXplOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCS8vIHRoZSBtZXNzYWdlIHNob3VsZCBub3QgY2hhbmdlIGJldHdlZW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGlzIGNhbGwKIAl0cnkgewpAQCAtMzk5Miw2ICs0MTIwLDcgQEAKIAl0aGlzLm1heHNpemUgPSBtYXhzaXplOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CiAJaW50IG5ld3NpemUgPSBzaXplICsgMTsKIAlpZiAoYnVmICE9IG51bGwpIHsKQEAgLTQwMDksNiArNDEzOCw3IEBACiAJc2l6ZSA9IG5ld3NpemU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHsKIAlpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8CiAgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKQEAgLTQwMzIsNiArNDE2Miw3IEBACiAgICAgICAgIHNpemUgPSBuZXdzaXplOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXdyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUElucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUElucHV0U3RyZWFtLmphdmEKaW5kZXggOGY3OTM0OC4uYWQxZjY3YSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQSW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ0LDcgKzQ0LDggQEAKIGltcG9ydCBqYXZheC5tYWlsLio7CiBpbXBvcnQgY29tLnN1bi5tYWlsLmltYXAucHJvdG9jb2wuKjsKIGltcG9ydCBjb20uc3VuLm1haWwuaWFwLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Gb2xkZXJDbG9zZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NZXNzYWdlUmVtb3ZlZElPRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBJTUFQIGRhdGEgc3RyZWFtLgpAQCAtMTY0LDcgKzE2NSwxMSBAQAogCiAJICAgIGlmIChiID09IG51bGwgfHwgKChiYSA9IGIuZ2V0Qnl0ZUFycmF5KCkpID09IG51bGwpKSB7CiAJCWZvcmNlQ2hlY2tFeHB1bmdlZCgpOwotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIGNvbnRlbnQiKTsKKwkJLy8gbm9wZSwgdGhlIHNlcnZlciBkb2Vzbid0IHRoaW5rIGl0J3MgZXhwdW5nZWQuCisJCS8vIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2VydmVyIHJldHVybmluZyBOSUwKKwkJLy8gYW5kIHNvbWUgb3RoZXIgZXJyb3IgdGhhdCBjYXVzZWQgbnVsbCB0byBiZSByZXR1cm5lZCBhYm92ZSwKKwkJLy8gc28gd2UnbGwganVzdCBhc3N1bWUgaXQgd2FzIGVtcHR5IGNvbnRlbnQuCisJCWJhID0gbmV3IEJ5dGVBcnJheSgwKTsKIAkgICAgfQogCX0KIApAQCAtMTg3LDYgKzE5Miw3IEBACiAgICAgICogUmVhZHMgdGhlIG5leHQgYnl0ZSBvZiBkYXRhIGZyb20gdGhpcyBidWZmZXJlZCBpbnB1dCBzdHJlYW0uCiAgICAgICogSWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUsIHRoZSB2YWx1ZSA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKGJ1ZnBvcyA+PSBidWZjb3VudCkgewogCSAgICBmaWxsKCk7CkBAIC0yMTAsNiArMjE2LDcgQEAKICAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIHRvIGluc3VyZSB0aGF0IHRoZXkgaGF2ZSBvYnRhaW5lZCB0aGUKICAgICAgKiByZXF1aXNpdGUgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIAogCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCkBAIC0yNDAsNiArMjQ3LDcgQEAKICAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIHRvIGluc3VyZSB0aGF0IHRoZXkgaGF2ZSBvYnRhaW5lZCB0aGUKICAgICAgKiByZXF1aXNpdGUgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlyZXR1cm4gcmVhZChiLCAwLCBiLmxlbmd0aCk7CiAgICAgfQpAQCAtMjQ4LDYgKzI1Niw3IEBACiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGlucHV0CiAgICAgICogc3RyZWFtIHdpdGhvdXQgYmxvY2tpbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlyZXR1cm4gKGJ1ZmNvdW50IC0gYnVmcG9zKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUE1lc3NhZ2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQTWVzc2FnZS5qYXZhCmluZGV4IDc2N2VmMjkuLmYzMjM3YWQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQTWVzc2FnZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQTWVzc2FnZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDgsNyArNDgsNyBAQAogaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuKjsKIGltcG9ydCBqYXZheC5hY3RpdmF0aW9uLio7CiAKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlJlYWRhYmxlTWltZTsKIGltcG9ydCBjb20uc3VuLm1haWwuaWFwLio7CiBpbXBvcnQgY29tLnN1bi5tYWlsLmltYXAucHJvdG9jb2wuKjsKIApAQCAtOTEsNyArOTEsNyBAQAogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGl0ZW1zOwkJLy8gTWFwPFN0cmluZyxPYmplY3Q+CiAKICAgICBwcml2YXRlIERhdGUgcmVjZWl2ZWREYXRlOwkJLy8gSU5URVJOQUxEQVRFCi0gICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IC0xOwkJLy8gUkZDODIyLlNJWkUKKyAgICBwcml2YXRlIGxvbmcgc2l6ZSA9IC0xOwkJLy8gUkZDODIyLlNJWkUKIAogICAgIHByaXZhdGUgQm9vbGVhbiBwZWVrOwkJLy8gdXNlIEJPRFkuUEVFSyB3aGVuIGZldGNoaW5nIGNvbnRlbnQ/CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAqIENvdWxkIHRoaXMgc29tZWhvdyBiZSBpbmNsdWRlZCBpbiB0aGUgSW50ZXJuZXRIZWFkZXJzIG9iamVjdCA/PwogICAgICAqLwogICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBsb2FkZWRIZWFkZXJzCi0JICAgID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oMSk7CisJICAgID0gbmV3IEhhc2h0YWJsZTw+KDEpOwogCiAgICAgLy8gVGhpcyBpcyBvdXIgRW52ZWxvcGUKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVudmVsb3BlQ21kID0gIkVOVkVMT1BFIElOVEVSTkFMREFURSBSRkM4MjIuU0laRSI7CkBAIC0yMTAsNiArMjEwLDcgQEAKICAgICAgKiBXcmFwcGVyIGFyb3VuZCB0aGUgcHJvdGVjdGVkIG1ldGhvZCBNZXNzYWdlLnNldE1lc3NhZ2VOdW1iZXIoKSB0byAKICAgICAgKiBtYWtlIHRoYXQgbWV0aG9kIGFjY2Vzc2libGUgdG8gSU1BUEZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRNZXNzYWdlTnVtYmVyKGludCBtc2dudW0pIHsKIAlzdXBlci5zZXRNZXNzYWdlTnVtYmVyKG1zZ251bSk7CiAgICAgfQpAQCAtMjY4LDYgKzI2OSw3IEBACiAgICAgfQogCiAgICAgLy8gZXhwb3NlIHRvIE1lc3NhZ2VDYWNoZQorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldEV4cHVuZ2VkKGJvb2xlYW4gc2V0KSB7CiAJc3VwZXIuc2V0RXhwdW5nZWQoc2V0KTsKICAgICB9CkBAIC0zMTUsNiArMzE3LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlICJGcm9tIiBhdHRyaWJ1dGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFkZHJlc3NbXSBnZXRGcm9tKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtMzM0LDEwICszMzcsMTIgQEAKIAlyZXR1cm4gYWFjbG9uZShhKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKEFkZHJlc3MgYWRkcmVzcykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRnJvbShBZGRyZXNzW10gYWRkcmVzc2VzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9CkBAIC0zNDUsNiArMzUwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlICJTZW5kZXIiIGF0dHJpYnV0ZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWRkcmVzcyBnZXRTZW5kZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CiAJaWYgKGJvZHlMb2FkZWQpCkBAIC0zNTcsNiArMzYzLDcgQEAKICAgICB9CiAJCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoQWRkcmVzcyBhZGRyZXNzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9ICAgIApAQCAtMzY0LDYgKzM3MSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBkZXNpcmVkIFJlY2lwaWVudCB0eXBlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBBZGRyZXNzW10gZ2V0UmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUgdHlwZSkKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CkBAIC0zODEsMTEgKzM4OSwxMyBAQAogCSAgICByZXR1cm4gc3VwZXIuZ2V0UmVjaXBpZW50cyh0eXBlKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZSB0eXBlLCBBZGRyZXNzW10gYWRkcmVzc2VzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkUmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUgdHlwZSwgQWRkcmVzc1tdIGFkZHJlc3NlcykKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBNZXNzYWdlIGlzIHJlYWQtb25seSIpOwpAQCAtMzk0LDYgKzQwNCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBSZXBseVRvIGFkZHJlc3Nlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWRkcmVzc1tdIGdldFJlcGx5VG8oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CiAJaWYgKGJvZHlMb2FkZWQpCkBAIC00MTAsNiArNDIxLDcgQEAKIAlyZXR1cm4gYWFjbG9uZShlbnZlbG9wZS5yZXBseVRvKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKEFkZHJlc3NbXSBhZGRyZXNzZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBNZXNzYWdlIGlzIHJlYWQtb25seSIpOwogICAgIH0KQEAgLTQxNyw2ICs0MjksNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgZGVjb2RlZCBzdWJqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKIAlpZiAoYm9keUxvYWRlZCkKQEAgLTQ0Miw2ICs0NTUsNyBAQAogCXJldHVybiBzdWJqZWN0OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmplY3QsIFN0cmluZyBjaGFyc2V0KSAKIAkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CkBAIC00NTAsNiArNDY0LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIFNlbnREYXRlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEYXRlIGdldFNlbnREYXRlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtNDYxLDYgKzQ3Niw3IEBACiAJICAgIHJldHVybiBuZXcgRGF0ZShlbnZlbG9wZS5kYXRlLmdldFRpbWUoKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U2VudERhdGUoRGF0ZSBkKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9CkBAIC00NjgsNiArNDg0LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJlY2VpdmVkIGRhdGUgKElOVEVSTkFMREFURSkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERhdGUgZ2V0UmVjZWl2ZWREYXRlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChyZWNlaXZlZERhdGUgPT0gbnVsbCkKQEAgLTQ4MywxMiArNTAwLDM0IEBACiAgICAgICoKICAgICAgKiBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIFJGQzgyMi5TSVpFLiAgVGhhdCBpcywgaXQncyB0aGUKICAgICAgKiBzaXplIG9mIHRoZSB3aG9sZSBtZXNzYWdlLCBoZWFkZXIgYW5kIGJvZHkgaW5jbHVkZWQuCisgICAgICogTm90ZSBhbHNvIHRoYXQgaWYgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaXMgZ3JlYXRlciB0aGFuCisgICAgICogSW50ZWdlci5NQVhfVkFMVUUgKDJHQiksIHRoaXMgbWV0aG9kIHJldHVybnMgSW50ZWdlci5NQVhfVkFMVUUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCS8vIGlmIGJvZHlMb2FkZWQsIHNpemUgaXMgYWxyZWFkeSBzZXQKIAlpZiAoc2l6ZSA9PSAtMSkKIAkgICAgbG9hZEVudmVsb3BlKCk7CS8vIFhYWCAtIGNvdWxkIGp1c3QgZmV0Y2ggdGhlIHNpemUKKwlpZiAoc2l6ZSA+IEludGVnZXIuTUFYX1ZBTFVFKQorCSAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CS8vIHRoZSBiZXN0IHdlIGNhbiBkby4uLgorCWVsc2UKKwkgICAgcmV0dXJuIChpbnQpc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lc3NhZ2Ugc2l6ZSBhcyBhIGxvbmcuIDxwPgorICAgICAqCisgICAgICogU3VpdGFibGUgZm9yIG1lc3NhZ2VzIHRoYXQgbWlnaHQgYmUgbGFyZ2VyIHRoYW4gMkdCLgorICAgICAqIEByZXR1cm4JdGhlIG1lc3NhZ2Ugc2l6ZSBhcyBhIGxvbmcgaW50ZWdlcgorICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcworICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplTG9uZygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworCWNoZWNrRXhwdW5nZWQoKTsKKwkvLyBpZiBib2R5TG9hZGVkLCBzaXplIGlzIGFscmVhZHkgc2V0CisJaWYgKHNpemUgPT0gLTEpCisJICAgIGxvYWRFbnZlbG9wZSgpOwkvLyBYWFggLSBjb3VsZCBqdXN0IGZldGNoIHRoZSBzaXplCiAJcmV0dXJuIHNpemU7CiAgICAgfQogCkBAIC00OTksNiArNTM4LDcgQEAKICAgICAgKiBCT0RZU1RSVUNUVVJFLiBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBhdmFpbGFibGUKICAgICAgKiBvbmx5IGZvciB0ZXh0L3BsYWluIGFuZCBtZXNzYWdlL3JmYzgyMiB0eXBlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCS8vIFhYWCAtIHN1cGVyY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQgdGhpcwpAQCAtNTA5LDYgKzU0OSw3IEBACiAgICAgLyoqIAogICAgICAqIEdldCB0aGUgY29udGVudCBsYW5ndWFnZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudExhbmd1YWdlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAgICAgCWNoZWNrRXhwdW5nZWQoKTsKIAlpZiAoYm9keUxvYWRlZCkKQEAgLTUyMCw2ICs1NjEsNyBAQAogCSAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExhbmd1YWdlKFN0cmluZ1tdIGxhbmd1YWdlcykKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKICAgICAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CkBAIC01NDYsNiArNTg4LDcgQEAKICAgICAgKiBHZW5lcmF0ZSB0aGlzIGhlYWRlciBmcm9tIHRoZSBCT0RZU1RSVUNUVVJFLiBBcHBlbmQgcGFyYW1ldGVycwogICAgICAqIGFzIHdlbGwuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CiAJaWYgKGJvZHlMb2FkZWQpCkBAIC01NjQsNiArNjA3LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXREaXNwb3NpdGlvbigpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKIAlpZiAoYm9keUxvYWRlZCkKQEAgLTU3Miw2ICs2MTYsNyBAQAogCXJldHVybiBicy5kaXNwb3NpdGlvbjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREaXNwb3NpdGlvbihTdHJpbmcgZGlzcG9zaXRpb24pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBNZXNzYWdlIGlzIHJlYWQtb25seSIpOwogICAgIH0KQEAgLTU3OSw2ICs2MjQsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtNTkwLDYgKzYzNiw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBDb250ZW50LUlELgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudElEKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtNTk4LDYgKzY0NSw3IEBACiAJcmV0dXJuIGJzLmlkOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRJRChTdHJpbmcgY2lkKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9CkBAIC02MDUsNiArNjUzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIENvbnRlbnQtTUQ1LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE1ENSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKIAlpZiAoYm9keUxvYWRlZCkKQEAgLTYxMyw2ICs2NjIsNyBAQAogCXJldHVybiBicy5tZDU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudE1ENShTdHJpbmcgbWQ1KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9CkBAIC02MjAsNiArNjcwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGRlY29kZWQgQ29udGVudC1EZXNjcmlwdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtNjQxLDYgKzY5Miw3IEBACiAJcmV0dXJuIGRlc2NyaXB0aW9uOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGNoYXJzZXQpIAogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CkBAIC02NDksNiArNzAxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIE1lc3NhZ2UtSUQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSUQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CiAJaWYgKGJvZHlMb2FkZWQpCkBAIC02NjIsNiArNzE1LDcgQEAKICAgICAgKiBJTUFQNHJldjEpLiBJZiB0aGF0cyBub3QgYXZhaWxhYmxlLCBnZXQgdGhlICJuYW1lIiBDb250ZW50VHlwZQogICAgICAqIHBhcmFtZXRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWlmIChib2R5TG9hZGVkKQpAQCAtNjc3LDYgKzczMSw3IEBACiAJcmV0dXJuIGZpbGVuYW1lOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQpAQCAtNjg4LDYgKzc0Myw3IEBACiAgICAgICoKICAgICAgKiBAc2VlIGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2UjZ2V0Q29udGVudFN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGJvZHlMb2FkZWQpCiAJICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50U3RyZWFtKCk7CkBAIC03MjksMTUgKzc4NSwyMSBAQAogCSAgICB9CiAJfQogCi0JaWYgKGlzID09IG51bGwpCi0JICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIk5vIGNvbnRlbnQiKTsKLQllbHNlCi0JICAgIHJldHVybiBpczsKKwlpZiAoaXMgPT0gbnVsbCkgeworCSAgICBmb3JjZUNoZWNrRXhwdW5nZWQoKTsJLy8gbWF5IHRocm93IE1lc3NhZ2VSZW1vdmVkRXhjZXB0aW9uCisJICAgIC8vIG5vcGUsIHRoZSBzZXJ2ZXIgZG9lc24ndCB0aGluayBpdCdzIGV4cHVuZ2VkLgorCSAgICAvLyBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlcnZlciByZXR1cm5pbmcgTklMCisJICAgIC8vIGFuZCBzb21lIG90aGVyIGVycm9yIHRoYXQgY2F1c2VkIG51bGwgdG8gYmUgcmV0dXJuZWQgYWJvdmUsCisJICAgIC8vIHNvIHdlJ2xsIGp1c3QgYXNzdW1lIGl0IHdhcyBlbXB0eSBjb250ZW50LgorCSAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisJfQorCXJldHVybiBpczsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIERhdGFIYW5kbGVyIG9iamVjdCBmb3IgdGhpcyBtZXNzYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0YUhhbmRsZXIgZ2V0RGF0YUhhbmRsZXIoKQogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CkBAIC03NzYsNiArODM4LDcgQEAKIAlyZXR1cm4gc3VwZXIuZ2V0RGF0YUhhbmRsZXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBjb250ZW50KSAKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBNZXNzYWdlIGlzIHJlYWQtb25seSIpOwpAQCAtNzg3LDYgKzg1MCw3IEBACiAgICAgICogQHJldHVybgl0aGUgTUlNRSBmb3JtYXQgc3RyZWFtCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNC41CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldE1pbWVTdHJlYW0oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAkvLyBYWFggLSBuZWVkIGFuICJpZiAoYm9keUxvYWRlZCkiIHZlcnNpb24KIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CkBAIC04MjUsOSArODg5LDExIEBACiAKIAlpZiAoaXMgPT0gbnVsbCkgewogCSAgICBmb3JjZUNoZWNrRXhwdW5nZWQoKTsJLy8gbWF5IHRocm93IE1lc3NhZ2VSZW1vdmVkRXhjZXB0aW9uCi0JICAgIC8vIG5vcGUsIHRoZSBzZXJ2ZXIgZG9lc24ndCB0aGluayBpdCdzIGV4cHVuZ2VkLAotCSAgICAvLyBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZwotCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJObyBjb250ZW50Iik7CisJICAgIC8vIG5vcGUsIHRoZSBzZXJ2ZXIgZG9lc24ndCB0aGluayBpdCdzIGV4cHVuZ2VkLgorCSAgICAvLyBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlcnZlciByZXR1cm5pbmcgTklMCisJICAgIC8vIGFuZCBzb21lIG90aGVyIGVycm9yIHRoYXQgY2F1c2VkIG51bGwgdG8gYmUgcmV0dXJuZWQgYWJvdmUsCisJICAgIC8vIHNvIHdlJ2xsIGp1c3QgYXNzdW1lIGl0IHdhcyBlbXB0eSBjb250ZW50LgorCSAgICBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CiAJfQogCXJldHVybiBpczsKICAgICB9CkBAIC04MzUsNiArOTAxLDcgQEAKICAgICAvKioKICAgICAgKiBXcml0ZSBvdXQgdGhlIGJ5dGVzIGludG8gdGhlIGdpdmVuIE91dHB1dFN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGJvZHlMb2FkZWQpIHsKQEAgLTg1Niw2ICs5MjMsNyBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgbmFtZWQgaGVhZGVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKIApAQCAtOTEwLDYgKzk3OCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBuYW1lZCBoZWFkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWxpbWl0ZXIpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CkBAIC05MjAsMTYgKzk4OSwxOSBAQAogCXJldHVybiBoZWFkZXJzLmdldEhlYWRlcihuYW1lLCBkZWxpbWl0ZXIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSWxsZWdhbFdyaXRlRXhjZXB0aW9uKCJJTUFQTWVzc2FnZSBpcyByZWFkLW9ubHkiKTsKICAgICB9CiAJICAgIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcihTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIklNQVBNZXNzYWdlIGlzIHJlYWQtb25seSIpOwpAQCAtOTM4LDcgKzEwMTAsNyBAQAogICAgIC8qKgogICAgICAqIEdldCBhbGwgaGVhZGVycy4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRBbGxIZWFkZXJzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWxvYWRIZWFkZXJzKCk7CkBAIC05NDgsNyArMTAyMCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IG1hdGNoaW5nIGhlYWRlcnMuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0TWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwpAQCAtOTU5LDcgKzEwMzEsNyBAQAogICAgIC8qKgogICAgICAqIEdldCBub24tbWF0Y2hpbmcgaGVhZGVycy4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXROb25NYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CkBAIC05NjcsNiArMTAzOSw3IEBACiAJcmV0dXJuIHN1cGVyLmdldE5vbk1hdGNoaW5nSGVhZGVycyhuYW1lcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyTGluZShTdHJpbmcgbGluZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IElsbGVnYWxXcml0ZUV4Y2VwdGlvbigiSU1BUE1lc3NhZ2UgaXMgcmVhZC1vbmx5Iik7CiAgICAgfQpAQCAtOTc0LDcgKzEwNDcsNyBAQAogICAgIC8qKgogICAgICAqIEdldCBhbGwgaGVhZGVyLWxpbmVzLgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEFsbEhlYWRlckxpbmVzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwogCWxvYWRIZWFkZXJzKCk7CkBAIC05ODQsNyArMTA1Nyw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IGFsbCBtYXRjaGluZyBoZWFkZXItbGluZXMuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKQEAgLTk5NSw3ICsxMDY4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgYWxsIG5vbi1tYXRjaGluZyBoZWFkZXJsaW5lcy4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tFeHB1bmdlZCgpOwpAQCAtMTAwNiw2ICsxMDc5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIEZsYWdzIGZvciB0aGlzIG1lc3NhZ2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBGbGFncyBnZXRGbGFncygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrRXhwdW5nZWQoKTsKIAlsb2FkRmxhZ3MoKTsKQEAgLTEwMTUsNiArMTA4OSw3IEBACiAgICAgLyoqCiAgICAgICogVGVzdCBpZiB0aGUgZ2l2ZW4gRmxhZ3MgYXJlIHNldCBpbiB0aGlzIG1lc3NhZ2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2V0KEZsYWdzLkZsYWcgZmxhZykKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0V4cHVuZ2VkKCk7CkBAIC0xMDI1LDYgKzExMDAsNyBAQAogICAgIC8qKgogICAgICAqIFNldC9VbnNldCB0aGUgZ2l2ZW4gZmxhZ3MgaW4gdGhpcyBtZXNzYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGbGFncyhGbGFncyBmbGFnLCBib29sZWFuIHNldCkKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogICAgICAgICAvLyBBY3F1aXJlIE1lc3NhZ2VDYWNoZUxvY2ssIHRvIGZyZWV6ZSBzZXFudW0uCkBAIC0xMTA4LDcgKzExODQsNyBAQAogCXByaXZhdGUgYm9vbGVhbiBuZWVkTWVzc2FnZSA9IGZhbHNlOwogCXByaXZhdGUgYm9vbGVhbiBuZWVkUkRhdGUgPSBmYWxzZTsKIAlwcml2YXRlIFN0cmluZ1tdIGhkcnMgPSBudWxsOwotCXByaXZhdGUgU2V0PEZldGNoSXRlbT4gbmVlZCA9IG5ldyBIYXNoU2V0PEZldGNoSXRlbT4oKTsKKwlwcml2YXRlIFNldDxGZXRjaEl0ZW0+IG5lZWQgPSBuZXcgSGFzaFNldDw+KCk7CiAKIAkvKioKIAkgKiBDcmVhdGUgYSBGZXRjaFByb2ZpbGVDb25kaXRpb24gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZmV0Y2gKQEAgLTExNDgsNiArMTIyNCw3IEBACiAJICogUmV0dXJuIHRydWUgaWYgd2UgTkVFRCB0byBmZXRjaCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uCiAJICogZm9yIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB0ZXN0KElNQVBNZXNzYWdlIG0pIHsKIAkgICAgaWYgKG5lZWRFbnZlbG9wZSAmJiBtLl9nZXRFbnZlbG9wZSgpID09IG51bGwgJiYgIW0uYm9keUxvYWRlZCkKIAkJcmV0dXJuIHRydWU7IC8vIG5vIGVudmVsb3BlCkBAIC0xMjIxLDcgKzEyOTgsNyBAQAogCSAgICAvLyBhZGQgZW50cnkgaW50byB1aWQgdGFibGUKIAkgICAgaWYgKCgoSU1BUEZvbGRlcilmb2xkZXIpLnVpZFRhYmxlID09IG51bGwpCiAJCSgoSU1BUEZvbGRlcikgZm9sZGVyKS51aWRUYWJsZQotCQkJPSBuZXcgSGFzaHRhYmxlPExvbmcsIElNQVBNZXNzYWdlPigpOworCQkJPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAkgICAgKChJTUFQRm9sZGVyKWZvbGRlcikudWlkVGFibGUucHV0KExvbmcudmFsdWVPZih1LnVpZCksIHRoaXMpOwogCX0KIApAQCAtMTI3Nyw3ICsxMzU0LDYgQEAKIAkJICAgICAqIG9iamVjdCwgYmVjYXVzZSBJbnRlcm5ldEhlYWRlcnMgaXMgbm90IHRocmVhZAogCQkgICAgICogc2FmZS4KIAkJICAgICAqLwotCQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJCSAgICBFbnVtZXJhdGlvbjxIZWFkZXI+IGUgPSBoLmdldEFsbEhlYWRlcnMoKTsKIAkJICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CiAJCQlIZWFkZXIgaGUgPSBlLm5leHRFbGVtZW50KCk7CkBAIC0xMzE3LDcgKzEzOTMsNyBAQAogCWlmIChleHRlbnNpb25JdGVtcyA9PSBudWxsIHx8IGV4dGVuc2lvbkl0ZW1zLmlzRW1wdHkoKSkKIAkgICAgcmV0dXJuOwogCWlmIChpdGVtcyA9PSBudWxsKQotCSAgICBpdGVtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCSAgICBpdGVtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAlpdGVtcy5wdXRBbGwoZXh0ZW5zaW9uSXRlbXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBNdWx0aXBhcnREYXRhU291cmNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUE11bHRpcGFydERhdGFTb3VyY2UuamF2YQppbmRleCAzMDY2NjZhLi5kOTVjNjBjIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUE11bHRpcGFydERhdGFTb3VyY2UuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUE11bHRpcGFydERhdGFTb3VyY2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTYyLDcgKzYyLDcgQEAKIAkJCQkgICAgICBTdHJpbmcgc2VjdGlvbklkLCBJTUFQTWVzc2FnZSBtc2cpIHsKIAlzdXBlcihwYXJ0KTsKIAotCXBhcnRzID0gbmV3IEFycmF5TGlzdDxJTUFQQm9keVBhcnQ+KGJzLmxlbmd0aCk7CisJcGFydHMgPSBuZXcgQXJyYXlMaXN0PD4oYnMubGVuZ3RoKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IGJzLmxlbmd0aDsgaSsrKQogCSAgICBwYXJ0cy5hZGQoCiAJCW5ldyBJTUFQQm9keVBhcnQoYnNbaV0sIApAQCAtNzMsMTAgKzczLDEyIEBACiAJICAgICk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKIAlyZXR1cm4gcGFydHMuc2l6ZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCb2R5UGFydCBnZXRCb2R5UGFydChpbnQgaW5kZXgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBwYXJ0cy5nZXQoaW5kZXgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQTmVzdGVkTWVzc2FnZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBOZXN0ZWRNZXNzYWdlLmphdmEKaW5kZXggNWQwNThhMi4uMmUyNzgyZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBOZXN0ZWRNZXNzYWdlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBOZXN0ZWRNZXNzYWdlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03Myw2ICs3Myw3IEBACiAgICAgICogR2V0IHRoZSBlbmNsb3NpbmcgbWVzc2FnZSdzIFByb3RvY29sIG9iamVjdC4gT3ZlcnJpZGVzCiAgICAgICogSU1BUE1lc3NhZ2UuZ2V0UHJvdG9jb2woKS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgSU1BUFByb3RvY29sIGdldFByb3RvY29sKCkKIAkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwgRm9sZGVyQ2xvc2VkRXhjZXB0aW9uIHsKIAlyZXR1cm4gbXNnLmdldFByb3RvY29sKCk7CkBAIC04MSw2ICs4Miw3IEBACiAgICAgLyoKICAgICAgKiBJcyB0aGlzIGFuIElNQVA0IFJFVjEgc2VydmVyPwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzUkVWMSgpIHRocm93cyBGb2xkZXJDbG9zZWRFeGNlcHRpb24gewogCXJldHVybiBtc2cuaXNSRVYxKCk7CiAgICAgfQpAQCAtODksNiArOTEsNyBAQAogICAgICAqIEdldCB0aGUgZW5jbG9zaW5nIG1lc3NhZ2UncyBtZXNzYWdlQ2FjaGVMb2NrLiBPdmVycmlkZXMKICAgICAgKiBJTUFQTWVzc2FnZS5nZXRNZXNzYWdlQ2FjaGVMb2NrKCkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRNZXNzYWdlQ2FjaGVMb2NrKCkgewogCXJldHVybiBtc2cuZ2V0TWVzc2FnZUNhY2hlTG9jaygpOwogICAgIH0KQEAgLTk3LDYgKzEwMCw3IEBACiAgICAgICogR2V0IHRoZSBlbmNsb3NpbmcgbWVzc2FnZSdzIHNlcXVlbmNlIG51bWJlci4gT3ZlcnJpZGVzCiAgICAgICogSU1BUE1lc3NhZ2UuZ2V0U2VxdWVuY2VOdW1iZXIoKS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGdldFNlcXVlbmNlTnVtYmVyKCkgewogCXJldHVybiBtc2cuZ2V0U2VxdWVuY2VOdW1iZXIoKTsKICAgICB9CkBAIC0xMDUsNiArMTA5LDcgQEAKICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBlbmNsb3NpbmcgbWVzc2FnZSBpcyBleHB1bmdlZC4gT3ZlcnJpZGVzIAogICAgICAqIElNQVBNZXNzYWdlLmNoZWNrRXhwdW5nZWQoKS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0V4cHVuZ2VkKCkgdGhyb3dzIE1lc3NhZ2VSZW1vdmVkRXhjZXB0aW9uIHsKIAltc2cuY2hlY2tFeHB1bmdlZCgpOwogICAgIH0KQEAgLTExMyw2ICsxMTgsNyBAQAogICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGVuY2xvc2luZyBtZXNzYWdlIGlzIGV4cHVuZ2VkLiBPdmVycmlkZXMKICAgICAgKiBNZXNzYWdlLmlzRXhwdW5nZWQoKS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cHVuZ2VkKCkgewogCXJldHVybiBtc2cuaXNFeHB1bmdlZCgpOwogICAgIH0KQEAgLTEyMCw2ICsxMjYsNyBAQAogICAgIC8qCiAgICAgICogR2V0IHRoZSBlbmNsb3NpbmcgbWVzc2FnZSdzIGZldGNoQmxvY2tTaXplLiAKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGdldEZldGNoQmxvY2tTaXplKCkgewogCXJldHVybiBtc2cuZ2V0RmV0Y2hCbG9ja1NpemUoKTsKICAgICB9CkBAIC0xMjcsNiArMTM0LDcgQEAKICAgICAvKgogICAgICAqIEdldCB0aGUgZW5jbG9zaW5nIG1lc3NhZ2UncyBpZ25vcmVCb2R5U3RydWN0dXJlU2l6ZS4gCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlQm9keVN0cnVjdHVyZVNpemUoKSB7CiAJcmV0dXJuIG1zZy5pZ25vcmVCb2R5U3RydWN0dXJlU2l6ZSgpOwogICAgIH0KQEAgLTEzNSw2ICsxNDMsNyBAQAogICAgICAqIElNQVBNZXNzYWdlIHVzZXMgUkZDODIyLlNJWkUuIFdlIHVzZSB0aGUgInNpemUiIGZpZWxkIGZyb20KICAgICAgKiBvdXIgQk9EWVNUUlVDVFVSRS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gYnMuc2l6ZTsKICAgICB9CkBAIC0xNDIsNiArMTUxLDcgQEAKICAgICAvKgogICAgICAqIERpc2FsbG93IHNldHRpbmcgZmxhZ3Mgb24gbmVzdGVkIG1lc3NhZ2VzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZsYWdzKEZsYWdzIGZsYWcsIGJvb2xlYW4gc2V0KSAKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIENhbm5vdCBzZXQgRkxBR1Mgb24gYSBuZXN0ZWQgSU1BUCBtZXNzYWdlCQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBQcm92aWRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzUzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKKyAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CisgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KKyAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCisgKgorICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CisgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgorICogZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlCisgKiBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcworICogZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246CisgKiAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgorICoKKyAqIENvbnRyaWJ1dG9yKHMpOgorICogSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yCisgKiBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZyAiW0NvbnRyaWJ1dG9yXQorICogZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCisgKiBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhCisgKiByZWNpcGllbnQgaGFzIHRoZSBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCisgKiBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KKyAqIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQorICogYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZSBvcHRpb24gYXBwbGllcworICogb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKKyAqIGhvbGRlci4KKyAqLworCitwYWNrYWdlIGNvbS5zdW4ubWFpbC5pbWFwOworCitpbXBvcnQgamF2YXgubWFpbC5Qcm92aWRlcjsKKworLyoqCisgKiBUaGUgSU1BUCBwcm90b2NvbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIElNQVBQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyIHsKKyAgICBwdWJsaWMgSU1BUFByb3ZpZGVyKCkgeworCXN1cGVyKFByb3ZpZGVyLlR5cGUuU1RPUkUsICJpbWFwIiwgSU1BUFN0b3JlLmNsYXNzLmdldE5hbWUoKSwKKwkgICAgIk9yYWNsZSIsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQU1NMUHJvdmlkZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQU1NMUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQwMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBTU0xQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CisgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQorICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCisgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgorICoKKyAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgorICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKKyAqIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQorICogZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMKKyAqIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgorICogIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgorICogb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0KKyAqIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcyBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTAorICogVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQorICogcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogZWl0aGVyIHRoZSBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvCisgKiBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKKyAqIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMKKyAqIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0CisgKiBob2xkZXIuCisgKi8KKworcGFja2FnZSBjb20uc3VuLm1haWwuaW1hcDsKKworaW1wb3J0IGphdmF4Lm1haWwuUHJvdmlkZXI7CisKKy8qKgorICogVGhlIElNQVAgU1NMIHByb3RvY29sIHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgSU1BUFNTTFByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIgeworICAgIHB1YmxpYyBJTUFQU1NMUHJvdmlkZXIoKSB7CisJc3VwZXIoUHJvdmlkZXIuVHlwZS5TVE9SRSwgImltYXBzIiwgSU1BUFNTTFN0b3JlLmNsYXNzLmdldE5hbWUoKSwKKwkgICAgIk9yYWNsZSIsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQU1NMU3RvcmUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQU1NMU3RvcmUuamF2YQppbmRleCBhNDkxNDgxLi5jOGRjMTg1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUFNTTFN0b3JlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBTU0xTdG9yZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBTdG9yZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL0lNQVBTdG9yZS5qYXZhCmluZGV4IGUyZDViYjUuLmZjYWFiNzUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JTUFQU3RvcmUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSU1BUFN0b3JlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00NCw2ICs0NCw3IEBACiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKQEAgLTI1Niw3ICsyNTcsNyBAQAogCiAgICAgICAgIC8vIGNvbnRhaW5lciBmb3IgdGhlIHBvb2wncyBJTUFQIHByb3RvY29sIG9iamVjdHMKICAgICAgICAgcHJpdmF0ZSBWZWN0b3I8SU1BUFByb3RvY29sPiBhdXRoZW50aWNhdGVkQ29ubmVjdGlvbnMKLQkJPSBuZXcgVmVjdG9yPElNQVBQcm90b2NvbD4oKTsKKwkJPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgICAgICAvLyB2ZWN0b3JlIG9mIG9wZW4gZm9sZGVycwogICAgICAgICBwcml2YXRlIFZlY3RvcjxJTUFQRm9sZGVyPiBmb2xkZXJzOwpAQCAtMzM2LDE0ICszMzcsMTUgQEAKIAogCUNvbm5lY3Rpb25Qb29sKFN0cmluZyBuYW1lLCBNYWlsTG9nZ2VyIHBsb2dnZXIsIFNlc3Npb24gc2Vzc2lvbikgewogCSAgICBsYXN0VGltZVBydW5lZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCSAgICBQcm9wZXJ0aWVzIHByb3BzID0gc2Vzc2lvbi5nZXRQcm9wZXJ0aWVzKCk7CiAKLQkgICAgYm9vbGVhbiBkZWJ1ZyA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwkgICAgYm9vbGVhbiBkZWJ1ZyA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJIm1haWwuIiArIG5hbWUgKyAiLmNvbm5lY3Rpb25wb29sLmRlYnVnIiwgZmFsc2UpOwogCSAgICBsb2dnZXIgPSBwbG9nZ2VyLmdldFN1YkxvZ2dlcigiY29ubmVjdGlvbnBvb2wiLAogCQkJCQkgICAgIkRFQlVHIElNQVAgQ1AiLCBkZWJ1Zyk7CiAKIAkgICAgLy8gY2hlY2sgaWYgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBwb29sIHNpemUgaXMgb3ZlcnJpZGRlbgotCSAgICBpbnQgc2l6ZSA9IFByb3BVdGlsLmdldEludFNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBpbnQgc2l6ZSA9IFByb3BVdGlsLmdldEludFByb3BlcnR5KHByb3BzLAogCQkibWFpbC4iICsgbmFtZSArICIuY29ubmVjdGlvbnBvb2xzaXplIiwgLTEpOwogCSAgICBpZiAoc2l6ZSA+IDApIHsKIAkJcG9vbFNpemUgPSBzaXplOwpAQCAtMzUzLDcgKzM1NSw3IEBACiAJCXBvb2xTaXplID0gMTsKIAogCSAgICAvLyBjaGVjayBpZiB0aGUgZGVmYXVsdCBjbGllbnQtc2lkZSB0aW1lb3V0IHZhbHVlIGlzIG92ZXJyaWRkZW4KLQkgICAgaW50IGNvbm5lY3Rpb25Qb29sVGltZW91dCA9IFByb3BVdGlsLmdldEludFNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBpbnQgY29ubmVjdGlvblBvb2xUaW1lb3V0ID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkocHJvcHMsCiAJCSJtYWlsLiIgKyBuYW1lICsgIi5jb25uZWN0aW9ucG9vbHRpbWVvdXQiLCAtMSk7CiAJICAgIGlmIChjb25uZWN0aW9uUG9vbFRpbWVvdXQgPiAwKSB7CiAJCWNsaWVudFRpbWVvdXRJbnRlcnZhbCA9IGNvbm5lY3Rpb25Qb29sVGltZW91dDsKQEAgLTM2NCw3ICszNjYsNyBAQAogCQljbGllbnRUaW1lb3V0SW50ZXJ2YWwgPSA0NSAqIDEwMDA7CS8vIDQ1IHNlY29uZHMKIAogCSAgICAvLyBjaGVjayBpZiB0aGUgZGVmYXVsdCBzZXJ2ZXItc2lkZSB0aW1lb3V0IHZhbHVlIGlzIG92ZXJyaWRkZW4KLQkgICAgaW50IHNlcnZlclRpbWVvdXQgPSBQcm9wVXRpbC5nZXRJbnRTZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwkgICAgaW50IHNlcnZlclRpbWVvdXQgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKIAkJIm1haWwuIiArIG5hbWUgKyAiLnNlcnZlcnRpbWVvdXQiLCAtMSk7CiAJICAgIGlmIChzZXJ2ZXJUaW1lb3V0ID4gMCkgewogCQlzZXJ2ZXJUaW1lb3V0SW50ZXJ2YWwgPSBzZXJ2ZXJUaW1lb3V0OwpAQCAtMzc1LDcgKzM3Nyw3IEBACiAJCXNlcnZlclRpbWVvdXRJbnRlcnZhbCA9IDMwICogNjAgKiAxMDAwOwkvLyAzMCBtaW51dGVzCiAKIAkgICAgLy8gY2hlY2sgaWYgdGhlIGRlZmF1bHQgc2VydmVyLXNpZGUgdGltZW91dCB2YWx1ZSBpcyBvdmVycmlkZGVuCi0JICAgIGludCBwcnVuaW5nID0gUHJvcFV0aWwuZ2V0SW50U2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJICAgIGludCBwcnVuaW5nID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkocHJvcHMsCiAJCSJtYWlsLiIgKyBuYW1lICsgIi5wcnVuaW5naW50ZXJ2YWwiLCAtMSk7CiAJICAgIGlmIChwcnVuaW5nID4gMCkgewogCQlwcnVuaW5nSW50ZXJ2YWwgPSBwcnVuaW5nOwpAQCAtMzg4LDcgKzM5MCw3IEBACiAJICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgdXNlIGEgc2VwYXJhdGUgKGkuZS4gZGVkaWNhdGVkKQogCSAgICAvLyBzdG9yZSBjb25uZWN0aW9uCiAJICAgIHNlcGFyYXRlU3RvcmVDb25uZWN0aW9uID0KLQkJUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCQlQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCSAgICAibWFpbC4iICsgbmFtZSArICIuc2VwYXJhdGVzdG9yZWNvbm5lY3Rpb24iLCBmYWxzZSk7CiAJICAgIGlmIChzZXBhcmF0ZVN0b3JlQ29ubmVjdGlvbikKIAkJbG9nZ2VyLmNvbmZpZygiZGVkaWNhdGUgYSBzdG9yZSBjb25uZWN0aW9uIik7CkBAIC00MDYsNiArNDA4LDcgQEAKICAgICAgKiB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGRlYWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBSZXNwb25zZUhhbmRsZXIgbm9uU3RvcmVSZXNwb25zZUhhbmRsZXIgPSBuZXcgUmVzcG9uc2VIYW5kbGVyKCkgeworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHIpIHsKIAkgICAgLy8gQW55IG9mIHRoZXNlIHJlc3BvbnNlcyBtYXkgaGF2ZSBhIHJlc3BvbnNlIGNvZGUuCiAJICAgIGlmIChyLmlzT0soKSB8fCByLmlzTk8oKSB8fCByLmlzQkFEKCkgfHwgci5pc0JZRSgpKQpAQCAtNDM3LDExICs0NDAsMTMgQEAKICAgICBwcm90ZWN0ZWQgSU1BUFN0b3JlKFNlc3Npb24gc2Vzc2lvbiwgVVJMTmFtZSB1cmwsCiAJCQkJU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNTU0wpIHsKIAlzdXBlcihzZXNzaW9uLCB1cmwpOyAvLyBjYWxsIHN1cGVyIGNvbnN0cnVjdG9yCisJUHJvcGVydGllcyBwcm9wcyA9IHNlc3Npb24uZ2V0UHJvcGVydGllcygpOworCiAJaWYgKHVybCAhPSBudWxsKQogCSAgICBuYW1lID0gdXJsLmdldFByb3RvY29sKCk7CiAJdGhpcy5uYW1lID0gbmFtZTsKIAlpZiAoIWlzU1NMKQotCSAgICBpc1NTTCA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwkgICAgaXNTU0wgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJIm1haWwuIiArIG5hbWUgKyAiLnNzbC5lbmFibGUiLCBmYWxzZSk7CiAJaWYgKGlzU1NMKQogCSAgICB0aGlzLmRlZmF1bHRQb3J0ID0gOTkzOwpAQCAtNDUwLDQyICs0NTUsNDMgQEAKIAl0aGlzLmlzU1NMID0gaXNTU0w7CiAKICAgICAgICAgZGVidWcgPSBzZXNzaW9uLmdldERlYnVnKCk7Ci0JZGVidWd1c2VybmFtZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlkZWJ1Z3VzZXJuYW1lID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCQkJIm1haWwuZGVidWcuYXV0aC51c2VybmFtZSIsIHRydWUpOwotCWRlYnVncGFzc3dvcmQgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJZGVidWdwYXNzd29yZCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJCSJtYWlsLmRlYnVnLmF1dGgucGFzc3dvcmQiLCBmYWxzZSk7CiAJbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLAotCQkJIkRFQlVHICIgKyBuYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSwgc2Vzc2lvbik7CisJCQkiREVCVUcgIiArIG5hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpLAorCQkJc2Vzc2lvbi5nZXREZWJ1ZygpLCBzZXNzaW9uLmdldERlYnVnT3V0KCkpOwogCi0JYm9vbGVhbiBwYXJ0aWFsRmV0Y2ggPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJYm9vbGVhbiBwYXJ0aWFsRmV0Y2ggPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5wYXJ0aWFsZmV0Y2giLCB0cnVlKTsKIAlpZiAoIXBhcnRpYWxGZXRjaCkgewogCSAgICBibGtzaXplID0gLTE7CiAJICAgIGxvZ2dlci5jb25maWcoIm1haWwuaW1hcC5wYXJ0aWFsZmV0Y2g6IGZhbHNlIik7CiAJfSBlbHNlIHsKLQkgICAgYmxrc2l6ZSA9IFByb3BVdGlsLmdldEludFNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBibGtzaXplID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkocHJvcHMsCiAJCSJtYWlsLiIgKyBuYW1lICsiLmZldGNoc2l6ZSIsIDEwMjQgKiAxNik7CiAJICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5DT05GSUcpKQogCQlsb2dnZXIuY29uZmlnKCJtYWlsLmltYXAuZmV0Y2hzaXplOiAiICsgYmxrc2l6ZSk7CiAJfQogCi0JaWdub3JlU2l6ZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlpZ25vcmVTaXplID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArIi5pZ25vcmVib2R5c3RydWN0dXJlc2l6ZSIsIGZhbHNlKTsKIAlpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkKIAkgICAgbG9nZ2VyLmNvbmZpZygibWFpbC5pbWFwLmlnbm9yZWJvZHlzdHJ1Y3R1cmVzaXplOiAiICsgaWdub3JlU2l6ZSk7CiAKLQlzdGF0dXNDYWNoZVRpbWVvdXQgPSBQcm9wVXRpbC5nZXRJbnRTZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlzdGF0dXNDYWNoZVRpbWVvdXQgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLnN0YXR1c2NhY2hldGltZW91dCIsIDEwMDApOwogCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5DT05GSUcpKQogCSAgICBsb2dnZXIuY29uZmlnKCJtYWlsLmltYXAuc3RhdHVzY2FjaGV0aW1lb3V0OiAiICsKIAkJCQkJCXN0YXR1c0NhY2hlVGltZW91dCk7CiAKLQlhcHBlbmRCdWZmZXJTaXplID0gUHJvcFV0aWwuZ2V0SW50U2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJYXBwZW5kQnVmZmVyU2l6ZSA9IFByb3BVdGlsLmdldEludFByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuYXBwZW5kYnVmZmVyc2l6ZSIsIC0xKTsKIAlpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkKIAkgICAgbG9nZ2VyLmNvbmZpZygibWFpbC5pbWFwLmFwcGVuZGJ1ZmZlcnNpemU6ICIgKyBhcHBlbmRCdWZmZXJTaXplKTsKIAotCW1pbklkbGVUaW1lID0gUHJvcFV0aWwuZ2V0SW50U2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJbWluSWRsZVRpbWUgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLm1pbmlkbGV0aW1lIiwgMTApOwogCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5DT05GSUcpKQogCSAgICBsb2dnZXIuY29uZmlnKCJtYWlsLmltYXAubWluaWRsZXRpbWU6ICIgKyBtaW5JZGxlVGltZSk7CkBAIC00OTksMTkgKzUwNSwxOSBAQAogCX0KIAogCS8vIGNoZWNrIGlmIFNUQVJUVExTIGlzIGVuYWJsZWQKLQllbmFibGVTdGFydFRMUyA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwllbmFibGVTdGFydFRMUyA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLnN0YXJ0dGxzLmVuYWJsZSIsIGZhbHNlKTsKIAlpZiAoZW5hYmxlU3RhcnRUTFMpCiAJICAgIGxvZ2dlci5jb25maWcoImVuYWJsZSBTVEFSVFRMUyIpOwogCiAJLy8gY2hlY2sgaWYgU1RBUlRUTFMgaXMgcmVxdWlyZWQKLQlyZXF1aXJlU3RhcnRUTFMgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJcmVxdWlyZVN0YXJ0VExTID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuc3RhcnR0bHMucmVxdWlyZWQiLCBmYWxzZSk7CiAJaWYgKHJlcXVpcmVTdGFydFRMUykKIAkgICAgbG9nZ2VyLmNvbmZpZygicmVxdWlyZSBTVEFSVFRMUyIpOwogCiAJLy8gY2hlY2sgaWYgU0FTTCBpcyBlbmFibGVkCi0JZW5hYmxlU0FTTCA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwllbmFibGVTQVNMID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuc2FzbC5lbmFibGUiLCBmYWxzZSk7CiAJaWYgKGVuYWJsZVNBU0wpCiAJICAgIGxvZ2dlci5jb25maWcoImVuYWJsZSBTQVNMIik7CkBAIC01MjIsNyArNTI4LDcgQEAKIAkgICAgaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewogCQlpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkKIAkJICAgIGxvZ2dlci5jb25maWcoIlNBU0wgbWVjaGFuaXNtcyBhbGxvd2VkOiAiICsgcyk7Ci0JCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDUpOworCQlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8Pig1KTsKIAkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiICwiKTsKIAkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewogCQkgICAgU3RyaW5nIG0gPSBzdC5uZXh0VG9rZW4oKTsKQEAgLTU1MCwyNSArNTU2LDI1IEBACiAJfQogCiAJLy8gY2hlY2sgaWYgZm9yY2VQYXNzd29yZFJlZnJlc2ggaXMgZW5hYmxlZAotCWZvcmNlUGFzc3dvcmRSZWZyZXNoID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWZvcmNlUGFzc3dvcmRSZWZyZXNoID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuZm9yY2VwYXNzd29yZHJlZnJlc2giLCBmYWxzZSk7CiAJaWYgKGZvcmNlUGFzc3dvcmRSZWZyZXNoKQogCSAgICBsb2dnZXIuY29uZmlnKCJlbmFibGUgZm9yY2VQYXNzd29yZFJlZnJlc2giKTsKIAogCS8vIGNoZWNrIGlmIGVuYWJsZWltYXBldmVudHMgaXMgZW5hYmxlZAotCWVuYWJsZVJlc3BvbnNlRXZlbnRzID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWVuYWJsZVJlc3BvbnNlRXZlbnRzID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuZW5hYmxlcmVzcG9uc2VldmVudHMiLCBmYWxzZSk7CiAJaWYgKGVuYWJsZVJlc3BvbnNlRXZlbnRzKQogCSAgICBsb2dnZXIuY29uZmlnKCJlbmFibGUgSU1BUCByZXNwb25zZSBldmVudHMiKTsKIAogCS8vIGNoZWNrIGlmIGVuYWJsZXJlc3BvbnNlZXZlbnRzIGlzIGVuYWJsZWQKLQllbmFibGVJbWFwRXZlbnRzID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWVuYWJsZUltYXBFdmVudHMgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5lbmFibGVpbWFwZXZlbnRzIiwgZmFsc2UpOwogCWlmIChlbmFibGVJbWFwRXZlbnRzKQogCSAgICBsb2dnZXIuY29uZmlnKCJlbmFibGUgSU1BUCBJRExFIGV2ZW50cyIpOwogCiAJLy8gY2hlY2sgaWYgbWVzc2FnZSBjYWNoZSBkZWJ1Z2dpbmcgc2V0Ci0JbWVzc2FnZUNhY2hlRGVidWcgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJbWVzc2FnZUNhY2hlRGVidWcgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5tZXNzYWdlY2FjaGUuZGVidWciLCBmYWxzZSk7CiAKIAlndWlkID0gc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC4iICsgbmFtZSArICIueWFob28uZ3VpZCIpOwpAQCAtNTc2LDMxICs1ODIsMzEgQEAKIAkgICAgbG9nZ2VyLmxvZyhMZXZlbC5DT05GSUcsICJtYWlsLmltYXAueWFob28uZ3VpZDogezB9IiwgZ3VpZCk7CiAKIAkvLyBjaGVjayBpZiB0aHJvd3NlYXJjaGV4Y2VwdGlvbiBpcyBlbmFibGVkCi0JdGhyb3dTZWFyY2hFeGNlcHRpb24gPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJdGhyb3dTZWFyY2hFeGNlcHRpb24gPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi50aHJvd3NlYXJjaGV4Y2VwdGlvbiIsIGZhbHNlKTsKIAlpZiAodGhyb3dTZWFyY2hFeGNlcHRpb24pCiAJICAgIGxvZ2dlci5jb25maWcoInRocm93IFNlYXJjaEV4Y2VwdGlvbiIpOwogCiAJLy8gY2hlY2sgaWYgcGVlayBpcyBzZXQKLQlwZWVrID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCXBlZWsgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5wZWVrIiwgZmFsc2UpOwogCWlmIChwZWVrKQogCSAgICBsb2dnZXIuY29uZmlnKCJwZWVrIik7CiAKIAkvLyBjaGVjayBpZiBjbG9zZUZvbGRlcnNPblN0b3JlRmFpbHVyZSBpcyBzZXQKLQljbG9zZUZvbGRlcnNPblN0b3JlRmFpbHVyZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwljbG9zZUZvbGRlcnNPblN0b3JlRmFpbHVyZSA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLmNsb3NlZm9sZGVyc29uc3RvcmVmYWlsdXJlIiwgdHJ1ZSk7CiAJaWYgKGNsb3NlRm9sZGVyc09uU3RvcmVGYWlsdXJlKQogCSAgICBsb2dnZXIuY29uZmlnKCJjbG9zZUZvbGRlcnNPblN0b3JlRmFpbHVyZSIpOwogCiAJLy8gY2hlY2sgaWYgQ09NUFJFU1MgaXMgZW5hYmxlZAotCWVuYWJsZUNvbXByZXNzID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWVuYWJsZUNvbXByZXNzID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCSAgICAibWFpbC4iICsgbmFtZSArICIuY29tcHJlc3MuZW5hYmxlIiwgZmFsc2UpOwogCWlmIChlbmFibGVDb21wcmVzcykKIAkgICAgbG9nZ2VyLmNvbmZpZygiZW5hYmxlIENPTVBSRVNTIik7CiAKIAkvLyBjaGVjayBpZiBmaW5hbGl6ZUNsZWFuQ2xvc2UgaXMgZW5hYmxlZAotCWZpbmFsaXplQ2xlYW5DbG9zZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlmaW5hbGl6ZUNsZWFuQ2xvc2UgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5maW5hbGl6ZWNsZWFuY2xvc2UiLCBmYWxzZSk7CiAJaWYgKGZpbmFsaXplQ2xlYW5DbG9zZSkKIAkgICAgbG9nZ2VyLmNvbmZpZygiY2xvc2UgY29ubmVjdGlvbiBjbGVhbmx5IGluIGZpbmFsaXplIik7CkBAIC02NDksNiArNjU1LDcgQEAKICAgICAgKiBiZWluZyB1c2VkIGRvZXMgbm90IHJlcXVpcmUgYSBwYXNzd29yZCwgYW4gZW1wdHkgc3RyaW5nIG9yIG90aGVyCiAgICAgICogc3VpdGFibGUgZHVtbXkgcGFzc3dvcmQgc2hvdWxkIGJlIHVzZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIAogICAgIHByb3RvY29sQ29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBwb3J0LCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKQogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKQEAgLTY2OSw3ICs2NzYsNyBAQAogCWlmIChwcG9ydCAhPSAtMSkgewogCSAgICBwb3J0ID0gcHBvcnQ7CiAJfSBlbHNlIHsKLQkgICAgcG9ydCA9IFByb3BVdGlsLmdldEludFNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBwb3J0ID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkoc2Vzc2lvbi5nZXRQcm9wZXJ0aWVzKCksCiAJCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5wb3J0IiwgcG9ydCk7CiAJfSAKIAkKQEAgLTc4Myw3ICs3OTAsNyBAQAogCS8vIGlzc3VlIHNwZWNpYWwgSUQgY29tbWFuZCB0byBZYWhvbyEgTWFpbCBJTUFQIHNlcnZlcgogCS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWWFob28lMjFfTWFpbCNGcmVlX0lNQVBfYW5kX1NNVFBzX2FjY2VzcwogCWlmIChndWlkICE9IG51bGwpIHsKLQkgICAgTWFwPFN0cmluZyxTdHJpbmc+IGdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOworCSAgICBNYXA8U3RyaW5nLFN0cmluZz4gZ21hcCA9IG5ldyBIYXNoTWFwPD4oKTsKIAkgICAgZ21hcC5wdXQoIkdVSUQiLCBndWlkKTsKIAkgICAgcC5pZChnbWFwKTsKIAl9CkBAIC04MzksNiArODQ2LDExIEBACiAJCXAuY29tcHJlc3MoKTsKIAkgICAgfQogCX0KKworCS8vIGlmIHNlcnZlciBzdXBwb3J0cyBVVEYtOCwgZW5hYmxlIGl0IGZvciBjbGllbnQgdXNlCisJLy8gbm90ZSB0aGF0IHRoaXMgaXMgc2FmZSB0byBlbmFibGUgZXZlbiBpZiBtYWlsLm1pbWUuYWxsb3d1dGY4PWZhbHNlCisJaWYgKHAuaGFzQ2FwYWJpbGl0eSgiVVRGOD1BQ0NFUFQiKSB8fCBwLmhhc0NhcGFiaWxpdHkoIlVURjg9T05MWSIpKQorCSAgICBwLmVuYWJsZSgiVVRGOD1BQ0NFUFQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4MSw4ICs4OTMsOSBAQAogCSAgICBpZiAobWVjaHMgPT0gZGVmYXVsdEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcykgewogCQlTdHJpbmcgZHByb3AgPSAibWFpbC4iICsgbmFtZSArICIuYXV0aC4iICsKIAkJCQkgICAgbS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyAiLmRpc2FibGUiOwotCQlib29sZWFuIGRpc2FibGVkID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eSgKLQkJCQkJc2Vzc2lvbiwgZHByb3AsIG0uZXF1YWxzKCJYT0FVVEgyIikpOworCQlib29sZWFuIGRpc2FibGVkID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KAorCQkJCQlzZXNzaW9uLmdldFByb3BlcnRpZXMoKSwKKwkJCQkJZHByb3AsIG0uZXF1YWxzKCJYT0FVVEgyIikpOwogCQlpZiAoZGlzYWJsZWQpIHsKIAkJICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkKIAkJCWxvZ2dlci5maW5lKCJtZWNoYW5pc20gIiArIG0gKwpAQCAtMTA1NiwxMSArMTA2OSwxMSBAQAogCQkJdHJ5IHsKIAkJCSAgICBwLnJlbW92ZVJlc3BvbnNlSGFuZGxlcihub25TdG9yZVJlc3BvbnNlSGFuZGxlcik7CiAJCQkgICAgcC5kaXNjb25uZWN0KCk7Ci0JCQl9IGZpbmFsbHkgeworCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAJCQkgICAgLy8gZG9uJ3QgbGV0IGFueSBleGNlcHRpb24gc3RvcCB1cwotCQkJICAgIHAgPSBudWxsOwotCQkJICAgIGNvbnRpbnVlOwkvLyB0cnkgYWdhaW4sIGZyb20gdGhlIHRvcAogCQkJfQorCQkJcCA9IG51bGw7CisJCQljb250aW51ZTsgICAvLyB0cnkgYWdhaW4sIGZyb20gdGhlIHRvcAogCQkgICAgfQogCQl9CiAKQEAgLTEwODQsMTEgKzEwOTcsMTEgQEAKIAkJCXRyeSB7CiAJCQkgICAgcC5yZW1vdmVSZXNwb25zZUhhbmRsZXIobm9uU3RvcmVSZXNwb25zZUhhbmRsZXIpOwogCQkJICAgIHAuZGlzY29ubmVjdCgpOwotCQkJfSBmaW5hbGx5IHsKKwkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlZCkgewogCQkJICAgIC8vIGRvbid0IGxldCBhbnkgZXhjZXB0aW9uIHN0b3AgdXMKLQkJCSAgICBwID0gbnVsbDsKLQkJCSAgICBjb250aW51ZTsJLy8gdHJ5IGFnYWluLCBmcm9tIHRoZSB0b3AKIAkJCX0KKwkJCXAgPSBudWxsOworCQkJY29udGludWU7ICAgLy8gdHJ5IGFnYWluLCBmcm9tIHRoZSB0b3AKIAkJICAgIH0KIAkJfQogCkBAIC0xMTAyLDcgKzExMTUsNyBAQAogCSAgICAvLyBBZGQgZm9sZGVyIHRvIGZvbGRlci1saXN0CiAJICAgIGlmIChmb2xkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChwb29sLmZvbGRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcG9vbC5mb2xkZXJzID0gbmV3IFZlY3RvcjxJTUFQRm9sZGVyPigpOworICAgICAgICAgICAgICAgICAgICBwb29sLmZvbGRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAkJcG9vbC5mb2xkZXJzLmFkZEVsZW1lbnQoZm9sZGVyKTsKIAkgICAgfQogICAgICAgICB9CkBAIC0xMjUwLDcgKzEyNjMsNyBAQAogICAgICAqIGRvIHdlIGFsbG93IHRoZSBvcGVuIHRvIHN1Y2NlZWQ/CiAgICAgICovCiAgICAgYm9vbGVhbiBhbGxvd1JlYWRPbmx5U2VsZWN0KCkgewotCXJldHVybiBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJcmV0dXJuIFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShzZXNzaW9uLmdldFByb3BlcnRpZXMoKSwKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLmFsbG93cmVhZG9ubHlzZWxlY3QiLCBmYWxzZSk7CiAgICAgfQogCkBAIC0xNTY3LDYgKzE1ODAsNyBAQAogICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyBzdG9yZSBpcyBjb25uZWN0ZWQuIE92ZXJyaWRlIHN1cGVyY2xhc3MKICAgICAgKiBtZXRob2QsIHRvIGFjdHVhbGx5IHBpbmcgb3VyIHNlcnZlciBjb25uZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKIAlpZiAoIXN1cGVyLmlzQ29ubmVjdGVkKCkpIHsKIAkgICAgLy8gaWYgd2UgaGF2ZW4ndCBiZWVuIGNvbm5lY3RlZCBhdCBhbGwsIGRvbid0IGJvdGhlciB3aXRoCkBAIC0xNjA3LDY4ICsxNjIxLDE2IEBACiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhpcyBTdG9yZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLQlpZiAoIXN1cGVyLmlzQ29ubmVjdGVkKCkpIC8vIEFscmVhZHkgY2xvc2VkLgotCSAgICByZXR1cm47Ci0KLSAgICAgICAgSU1BUFByb3RvY29sIHByb3RvY29sID0gbnVsbDsKLQl0cnkgewotCSAgICBib29sZWFuIGlzRW1wdHk7Ci0JICAgIHN5bmNocm9uaXplZCAocG9vbCkgewotCQkvLyBJZiB0aGVyZSdzIG5vIGF1dGhlbnRpY2F0ZWQgY29ubmVjdGlvbnMgYXZhaWxhYmxlCi0JCS8vIGRvbid0IGNyZWF0ZSBhIG5ldyBvbmUKLQkJaXNFbXB0eSA9IHBvb2wuYXV0aGVudGljYXRlZENvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkgICAgfQotCSAgICAvKgotCSAgICAgKiBIYXZlIHRvIGRyb3AgdGhlIGxvY2sgYmVmb3JlIGNhbGxpbmcgY2xlYW51cC4KLQkgICAgICogWWVzLCB0aGVyZSdzIGEgcG90ZW50aWFsIHJhY2UgaGVyZS4gIFRoZSBwb29sIGNvdWxkCi0JICAgICAqIGJlY29tZSBlbXB0eSBhZnRlciB3ZSBjaGVjaywgaW4gd2hpY2ggY2FzZSB3ZSdsbCBqdXN0Ci0JICAgICAqIHdhc3RlIHRpbWUgZ2V0dGluZyBhIG5ldyBjb25uZWN0aW9uIGFuZCBjbG9zaW5nIGl0LgotCSAgICAgKiBPciwgdGhlIHBvb2wgY291bGQgYmUgZW1wdHkgbm93IGFuZCBub3QgZW1wdHkgYnkgdGhlCi0JICAgICAqIHRpbWUgd2UgZ2V0IGludG8gY2xlYW51cCwgYnV0IHRoYXQncyBvayBiZWNhdXNlIGNsZWFudXAKLQkgICAgICogd2lsbCBqdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uLgotCSAgICAgKi8KLQkgICAgaWYgKGlzRW1wdHkpIHsKLQkJcG9vbC5sb2dnZXIuZmluZSgiY2xvc2UoKSAtIG5vIGNvbm5lY3Rpb25zICIpOwotCQljbGVhbnVwKCk7Ci0JCXJldHVybjsKLQkgICAgfQotCi0gICAgICAgICAgICBwcm90b2NvbCA9IGdldFN0b3JlUHJvdG9jb2woKTsKLQkgICAgLyoKLQkgICAgICogV2UgaGF2ZSB0byByZW1vdmUgdGhlIHByb3RvY29sIGZyb20gdGhlIHBvb2wgc28gdGhhdCwKLQkgICAgICogd2hlbiBvdXIgcmVzcG9uc2UgaGFuZGxlciBwcm9jZXNzZXMgdGhlIEJZRSByZXNwb25zZQotCSAgICAgKiBhbmQgY2FsbHMgY2xlYW51cCwgd2hpY2ggY2FsbHMgZW1wdHlDb25uZWN0aW9uLCB0aGF0Ci0JICAgICAqIHdlIGRvbid0IHRyeSB0byBsb2cgb3V0IHRoaXMgY29ubmVjdGlvbiB0d2ljZS4KLQkgICAgICovCi0JICAgIHN5bmNocm9uaXplZCAocG9vbCkgewotICAgICAgICAgICAgICAgIHBvb2wuYXV0aGVudGljYXRlZENvbm5lY3Rpb25zLnJlbW92ZUVsZW1lbnQocHJvdG9jb2wpOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogTE9HT1VULiAKLQkgICAgICoKLQkgICAgICogTm90ZSB0aGF0IHByb3RvY29sLmxvZ291dCgpIGNsb3NlcyB0aGUgc2VydmVyIHNvY2tldAotCSAgICAgKiBjb25uZWN0aW9uLCByZWdhcmRsZXNzIG9mIHdoYXQgaGFwcGVucyAuLgotCSAgICAgKgotCSAgICAgKiBBbHNvIG5vdGUgdGhhdCBwcm90b2NvbC5sb2dvdXQoKSByZXN1bHRzIGluIGEgQllFCi0JICAgICAqIHJlc3BvbnNlIChBcyBwZXIgUkZDIDM1MDEsIEJZRSBpcyBhICpyZXF1aXJlZCogcmVzcG9uc2UKLQkgICAgICogdG8gTE9HT1VUKS4gSW4gZmFjdCwgZXZlbiBpZiBwcm90b2NvbC5sb2dvdXQoKSBmYWlscwotCSAgICAgKiB3aXRoIGFuIElPRXhjZXB0aW9uIChpZiB0aGUgc2VydmVyIGNvbm5lY3Rpb24gaXMgZGVhZCksCi0JICAgICAqIGlhcC5Qcm90b2NvbC5jb21tYW5kKCkgY29udmVydHMgdGhhdCBleGNlcHRpb24gaW50byBhIAotCSAgICAgKiBCWUUgcmVzcG9uc2UuIFNvLCBJIGRlcGVuZCBvbiBteSBCWUUgaGFuZGxlciB0byBzZXQgdGhlCi0JICAgICAqIGZsYWcgdGhhdCBjYXVzZXMgcmVsZWFzZVN0b3JlUHJvdG9jb2wgdG8gZG8gdGhlCi0JICAgICAqIFN0b3JlIGNsZWFudXAuCi0JICAgICAqLwotCSAgICBwcm90b2NvbC5sb2dvdXQoKTsKLQl9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZXgpIHsgCi0JICAgIC8vIEhtbSAuLiB3aWxsIHRoaXMgZXZlciBoYXBwZW4gPwotCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKHBleC5nZXRNZXNzYWdlKCksIHBleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlU3RvcmVQcm90b2NvbChwcm90b2NvbCk7Ci0gICAgICAgIH0KKwljbGVhbnVwKCk7CisJLy8gZG8gdGhlc2UgYWdhaW4gaW4gY2FzZSBjbGVhbnVwIHJldHVybmVkIGVhcmx5CisJLy8gYmVjYXVzZSB3ZSB3ZXJlIGFscmVhZHkgY2xvc2VkIGR1ZSB0byBhIGZhaWx1cmUKKwljbG9zZUFsbEZvbGRlcnMoZmFsc2UpOworCWVtcHR5Q29ubmVjdGlvblBvb2woZmFsc2UpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAJaWYgKCFmaW5hbGl6ZUNsZWFuQ2xvc2UpIHsKIAkgICAgLy8gd2hlbiBmaW5hbGl6aW5nLCBjbG9zZSBjb25uZWN0aW9ucyBhYnJ1cHRseQpAQCAtMTcxMSw2ICsxNjczLDI0IEBACiAJICAgIGxvZ2dlci5maW5lKCJJTUFQU3RvcmUgY2xlYW51cCwgZm9yY2UgIiArIGZvcmNlKTsKIAogCWlmICghZm9yY2UgfHwgY2xvc2VGb2xkZXJzT25TdG9yZUZhaWx1cmUpIHsKKwkgICAgY2xvc2VBbGxGb2xkZXJzKGZvcmNlKTsKKwl9CisKKwllbXB0eUNvbm5lY3Rpb25Qb29sKGZvcmNlKTsKKworCS8vIHRvIHNldCB0aGUgc3RhdGUgYW5kIHNlbmQgdGhlIGNsb3NlZCBjb25uZWN0aW9uIGV2ZW50CisJdHJ5IHsKKwkgICAgc3VwZXIuY2xvc2UoKTsKKwl9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gbWV4KSB7CisJICAgIC8vIGlnbm9yZSBpdAorCX0KKwlsb2dnZXIuZmluZSgiSU1BUFN0b3JlIGNsZWFudXAgZG9uZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGFsbCBvcGVuIEZvbGRlcnMuICBJZiBmb3JjZSBpcyB0cnVlLCBjbG9zZSB0aGVtIGZvcmNpYmx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZUFsbEZvbGRlcnMoYm9vbGVhbiBmb3JjZSkgewogICAgICAgICBMaXN0PElNQVBGb2xkZXI+IGZvbGRlcnNDb3B5ID0gbnVsbDsKICAgICAgICAgYm9vbGVhbiBkb25lID0gdHJ1ZTsKIApAQCAtMTc1OSwyNSArMTczOSwxMyBAQAogCSAgICB9CiAKIAl9Ci0JfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAocG9vbCkgewotCSAgICBlbXB0eUNvbm5lY3Rpb25Qb29sKGZvcmNlKTsKLQl9Ci0KLQkvLyB0byBzZXQgdGhlIHN0YXRlIGFuZCBzZW5kIHRoZSBjbG9zZWQgY29ubmVjdGlvbiBldmVudAotCXRyeSB7Ci0JICAgIHN1cGVyLmNsb3NlKCk7Ci0JfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIG1leCkgewotCSAgICAvLyBpZ25vcmUgaXQKLQl9Ci0JbG9nZ2VyLmZpbmUoIklNQVBTdG9yZSBjbGVhbnVwIGRvbmUiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGRlZmF1bHQgZm9sZGVyLCByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgdGhpcyB1c2VyJ3MgCiAgICAgICogbmFtZXNwYWNlLiBSZXR1cm5zIGEgY2xvc2VkIERlZmF1bHRGb2xkZXIgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRm9sZGVyIGdldERlZmF1bHRGb2xkZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0Nvbm5lY3RlZCgpOwogCXJldHVybiBuZXcgRGVmYXVsdEZvbGRlcih0aGlzKTsKQEAgLTE3ODYsNiArMTc1NCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IG5hbWVkIGZvbGRlci4gUmV0dXJucyBhIG5ldywgY2xvc2VkIElNQVBGb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBuYW1lKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrQ29ubmVjdGVkKCk7CkBAIC0xNzk1LDYgKzE3NjQsNyBAQAogICAgIC8qKgogICAgICAqIEdldCBuYW1lZCBmb2xkZXIuIFJldHVybnMgYSBuZXcsIGNsb3NlZCBJTUFQRm9sZGVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRm9sZGVyIGdldEZvbGRlcihVUkxOYW1lIHVybCkKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0Nvbm5lY3RlZCgpOwpAQCAtMTg2Nyw2ICsxODM3LDcgQEAKICAgICAgKiBVc2luZyB0aGUgSU1BUCBOQU1FU1BBQ0UgY29tbWFuZCAoUkZDIDIzNDIpLCByZXR1cm4gYSBzZXQKICAgICAgKiBvZiBmb2xkZXJzIHJlcHJlc2VudGluZyB0aGUgUGVyc29uYWwgbmFtZXNwYWNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyW10gZ2V0UGVyc29uYWxOYW1lc3BhY2VzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJTmFtZXNwYWNlcyBucyA9IGdldE5hbWVzcGFjZXMoKTsKIAlpZiAobnMgPT0gbnVsbCB8fCBucy5wZXJzb25hbCA9PSBudWxsKQpAQCAtMTg3OCw2ICsxODQ5LDcgQEAKICAgICAgKiBVc2luZyB0aGUgSU1BUCBOQU1FU1BBQ0UgY29tbWFuZCAoUkZDIDIzNDIpLCByZXR1cm4gYSBzZXQKICAgICAgKiBvZiBmb2xkZXJzIHJlcHJlc2VudGluZyB0aGUgVXNlcidzIG5hbWVzcGFjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlcltdIGdldFVzZXJOYW1lc3BhY2VzKFN0cmluZyB1c2VyKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU5hbWVzcGFjZXMgbnMgPSBnZXROYW1lc3BhY2VzKCk7CkBAIC0xODkwLDYgKzE4NjIsNyBAQAogICAgICAqIFVzaW5nIHRoZSBJTUFQIE5BTUVTUEFDRSBjb21tYW5kIChSRkMgMjM0MiksIHJldHVybiBhIHNldAogICAgICAqIG9mIGZvbGRlcnMgcmVwcmVzZW50aW5nIHRoZSBTaGFyZWQgbmFtZXNwYWNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyW10gZ2V0U2hhcmVkTmFtZXNwYWNlcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU5hbWVzcGFjZXMgbnMgPSBnZXROYW1lc3BhY2VzKCk7CiAJaWYgKG5zID09IG51bGwgfHwgbnMuc2hhcmVkID09IG51bGwpCkBAIC0xOTU1LDYgKzE5MjgsNyBAQAogICAgICAqIEBleGNlcHRpb24gTWVzc2FnaW5nRXhjZXB0aW9uCWlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZQogICAgICAqCQkJCQlRVU9UQSBleHRlbnNpb24KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFF1b3RhW10gZ2V0UXVvdGEoU3RyaW5nIHJvb3QpCiAJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tDb25uZWN0ZWQoKTsKQEAgLTE5ODUsNiArMTk1OSw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBNZXNzYWdpbmdFeGNlcHRpb24JaWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlCiAgICAgICoJCQkJCVFVT1RBIGV4dGVuc2lvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRRdW90YShRdW90YSBxdW90YSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tDb25uZWN0ZWQoKTsKICAgICAgICAgSU1BUFByb3RvY29sIHAgPSBudWxsOwpAQCAtMjAxMSw2ICsxOTg2LDcgQEAKICAgICAvKioKICAgICAgKiBSZXNwb25zZSBoYW5kbGVyIG1ldGhvZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZSByKSB7CiAJLy8gQW55IG9mIHRoZXNlIHJlc3BvbnNlcyBtYXkgaGF2ZSBhIHJlc3BvbnNlIGNvZGUuCiAJaWYgKHIuaXNPSygpIHx8IHIuaXNOTygpIHx8IHIuaXNCQUQoKSB8fCByLmlzQllFKCkpCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvSWRsZU1hbmFnZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JZGxlTWFuYWdlci5qYXZhCmluZGV4IGY0NWRkNWQuLjAzNzNiNDkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JZGxlTWFuYWdlci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9JZGxlTWFuYWdlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTQwLDggKzE0MCw4IEBACiAgICAgcHJpdmF0ZSBNYWlsTG9nZ2VyIGxvZ2dlcjsKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGllID0gZmFsc2U7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHJ1bm5pbmc7Ci0gICAgcHJpdmF0ZSBRdWV1ZTxJTUFQRm9sZGVyPiB0b1dhdGNoID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxJTUFQRm9sZGVyPigpOwotICAgIHByaXZhdGUgUXVldWU8SU1BUEZvbGRlcj4gdG9BYm9ydCA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8SU1BUEZvbGRlcj4oKTsKKyAgICBwcml2YXRlIFF1ZXVlPElNQVBGb2xkZXI+IHRvV2F0Y2ggPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKyAgICBwcml2YXRlIFF1ZXVlPElNQVBGb2xkZXI+IHRvQWJvcnQgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBJZGxlTWFuYWdlci4gIFRoZSBTZXNzaW9uIGlzIHVzZWQgb25seSB0byBjb25maWd1cmUKQEAgLTE1NCw5ICsxNTQsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSWRsZU1hbmFnZXIoU2Vzc2lvbiBzZXNzaW9uLCBFeGVjdXRvciBlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl0aGlzLmVzID0gZXM7Ci0JbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLCAiREVCVUcgSU1BUCIsIHNlc3Npb24pOworCWxvZ2dlciA9IG5ldyBNYWlsTG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKSwgIkRFQlVHIElNQVAiLAorCQkJCXNlc3Npb24uZ2V0RGVidWcoKSwgc2Vzc2lvbi5nZXREZWJ1Z091dCgpKTsKIAlzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKIAllcy5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJbG9nZ2VyLmZpbmUoIklkbGVNYW5hZ2VyIHNlbGVjdCBzdGFydGluZyIpOwogCQl0cnkgewpAQCAtMTk5LDggKzIwMSwxMyBAQAogCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJDYW4gb25seSB3YXRjaCBJTUFQIGZvbGRlcnMiKTsKIAlJTUFQRm9sZGVyIGlmb2xkZXIgPSAoSU1BUEZvbGRlcilmb2xkZXI7CiAJU29ja2V0Q2hhbm5lbCBzYyA9IGlmb2xkZXIuZ2V0Q2hhbm5lbCgpOwotCWlmIChzYyA9PSBudWxsKQotCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJGb2xkZXIgaXMgbm90IHVzaW5nIFNvY2tldENoYW5uZWxzIik7CisJaWYgKHNjID09IG51bGwpIHsKKwkgICAgaWYgKGZvbGRlci5pc09wZW4oKSkKKwkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigKKwkJCQkJIkZvbGRlciBpcyBub3QgdXNpbmcgU29ja2V0Q2hhbm5lbHMiKTsKKwkgICAgZWxzZQorCQl0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJGb2xkZXIgaXMgbm90IG9wZW4iKTsKKwl9CiAJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkVTVCkpCiAJICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAiSWRsZU1hbmFnZXIgd2F0Y2hpbmcgezB9IiwKIAkJCQkJCQlmb2xkZXJOYW1lKGlmb2xkZXIpKTsKQEAgLTM0Niw3ICszNTMsNyBAQAogCVNldDxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpOwogCS8qCiAJICogWFhYIC0gdGhpcyBpcyBzaW1wbGVyLCBidXQgaXQgY2FuIGZhaWwgd2l0aAotCSAqCSBDb25uY3VyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCisJICoJIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KIAkgKgogCWZvciAoU2VsZWN0aW9uS2V5IHNrIDogc2VsZWN0ZWRLZXlzKSB7CiAJICAgIHNlbGVjdGVkS2V5cy5yZW1vdmUoc2spOwkvLyBvbmx5IHByb2Nlc3MgZWFjaCBrZXkgb25jZQpAQCAtNDE0LDcgKzQyMSw3IEBACiAJCXRvV2F0Y2gucmVtb3ZlKGZvbGRlcik7CiAJCWZpbmFsIElNQVBGb2xkZXIgZm9sZGVyMCA9IGZvbGRlcjsKIAkJZXMuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7Ci0JCSAgICAvL0BPdmVycmlkZQorCQkgICAgQE92ZXJyaWRlCiAJCSAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkvLyBzZW5kIHRoZSBET05FIGFuZCB3YWl0IGZvciB0aGUgcmVzcG9uc2UKIAkJCWZvbGRlcjAuaWRsZUFib3J0V2FpdCgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01lc3NhZ2VDYWNoZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01lc3NhZ2VDYWNoZS5qYXZhCmluZGV4IDAwYmY2MTAuLmJhYjZkOGMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9NZXNzYWdlQ2FjaGUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvTWVzc2FnZUNhY2hlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICBwdWJsaWMgSU1BUE1lc3NhZ2VbXSByZW1vdmVFeHB1bmdlZE1lc3NhZ2VzKCkgewogCWxvZ2dlci5maW5lKCJyZW1vdmUgZXhwdW5nZWQgbWVzc2FnZXMiKTsKIAkvLyBsaXN0IG9mIGV4cHVuZ2VkIG1lc3NhZ2VzCi0JTGlzdDxJTUFQTWVzc2FnZT4gbWxpc3QgPSBuZXcgQXJyYXlMaXN0PElNQVBNZXNzYWdlPigpOworCUxpc3Q8SU1BUE1lc3NhZ2U+IG1saXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkvKgogCSAqIFdhbGsgdGhyb3VnaCB0aGUgYXJyYXkgY29tcHJlc3NpbmcgaXQgYnkgY29weWluZwpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgcHVibGljIElNQVBNZXNzYWdlW10gcmVtb3ZlRXhwdW5nZWRNZXNzYWdlcyhNZXNzYWdlW10gbXNncykgewogCWxvZ2dlci5maW5lKCJyZW1vdmUgZXhwdW5nZWQgbWVzc2FnZXMiKTsKIAkvLyBsaXN0IG9mIGV4cHVuZ2VkIG1lc3NhZ2VzCi0JTGlzdDxJTUFQTWVzc2FnZT4gbWxpc3QgPSBuZXcgQXJyYXlMaXN0PElNQVBNZXNzYWdlPigpOworCUxpc3Q8SU1BUE1lc3NhZ2U+IG1saXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkvKgogCSAqIENvcHkgdGhlIG1lc3NhZ2UgbnVtYmVycyBvZiB0aGUgZXhwdW5nZWQgbWVzc2FnZXMgaW50bwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01lc3NhZ2VWYW5pc2hlZEV2ZW50LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvTWVzc2FnZVZhbmlzaGVkRXZlbnQuamF2YQppbmRleCBiYWI4YzVlLi45Mjc5YTNmIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvTWVzc2FnZVZhbmlzaGVkRXZlbnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvTWVzc2FnZVZhbmlzaGVkRXZlbnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9Nb2RpZmllZFNpbmNlVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01vZGlmaWVkU2luY2VUZXJtLmphdmEKaW5kZXggMGRjNmFmMC4uNTdhZDQyMSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01vZGlmaWVkU2luY2VUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL01vZGlmaWVkU2luY2VUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC04Miw2ICs4Miw3IEBACiAgICAgICoJCQlNT0RTRVEKICAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBjb21wYXJpc29uIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCWxvbmcgbTsKIApAQCAtMTAwLDYgKzEwMSw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIE1vZGlmaWVkU2luY2VUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA5LDYgKzExMSw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2hDb2RlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCXJldHVybiAoaW50KW1vZHNlcTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvT2xkZXJUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvT2xkZXJUZXJtLmphdmEKaW5kZXggNGM4M2JjOC4uYjgxZGJjMCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL09sZGVyVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9PbGRlclRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTQgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTgzLDYgKzgzLDcgQEAKICAgICAgKgkJCXJlY2VpdmVkIGRhdGUKICAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBjb21wYXJpc29uIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCURhdGUgZDsKIApAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIE9sZGVyVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTExMSw2ICsxMTMsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gaW50ZXJ2YWw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1JlZmVycmFsRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvUmVmZXJyYWxFeGNlcHRpb24uamF2YQppbmRleCBjYmVhM2IxLi5kOTliOWFiIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvUmVmZXJyYWxFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvUmVmZXJyYWxFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9SZXN5bmNEYXRhLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvUmVzeW5jRGF0YS5qYXZhCmluZGV4IGVkMjdiYTguLjI3MTlmZmMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9SZXN5bmNEYXRhLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1Jlc3luY0RhdGEuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9SaWdodHMuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9SaWdodHMuamF2YQppbmRleCBhOTQ5OWFkLi4xMWYyNzg5IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvUmlnaHRzLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1JpZ2h0cy5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTU5LDYgKzE1OSw3IEBACiAJICAgIHJldHVybiBjYWNoZVsoaW50KXJpZ2h0XTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YocmlnaHQpOwogCX0KQEAgLTI3Miw2ICsyNzMsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybgl0cnVlIGlmIHRoZXkncmUgZXF1YWwKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIFJpZ2h0cykpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTI5MCw2ICsyOTIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybgl0aGUgaGFzaCBjb2RlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlpbnQgaGFzaCA9IDA7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnJpZ2h0cy5sZW5ndGg7IGkrKykKQEAgLTMwNSw3ICszMDgsNyBAQAogICAgICAqIEByZXR1cm4JYXJyYXkgb2YgUmlnaHRzLlJpZ2h0IG9iamVjdHMgcmVwcmVzZW50aW5nIHJpZ2h0cwogICAgICAqLwogICAgIHB1YmxpYyBSaWdodFtdIGdldFJpZ2h0cygpIHsKLQlMaXN0PFJpZ2h0PiB2ID0gbmV3IEFycmF5TGlzdDxSaWdodD4oKTsKKwlMaXN0PFJpZ2h0PiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnJpZ2h0cy5sZW5ndGg7IGkrKykKIAkgICAgaWYgKHRoaXMucmlnaHRzW2ldKQogCQl2LmFkZChSaWdodC5nZXRJbnN0YW5jZSgoY2hhcilpKSk7CkBAIC0zMTUsNiArMzE4LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBSaWdodHMgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAJUmlnaHRzIHIgPSBudWxsOwogCXRyeSB7CkBAIC0zMjcsOCArMzMxLDkgQEAKIAlyZXR1cm4gcjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucmlnaHRzLmxlbmd0aDsgaSsrKQogCSAgICBpZiAodGhpcy5yaWdodHNbaV0pCiAJCXNiLmFwcGVuZCgoY2hhcilpKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9Tb3J0VGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1NvcnRUZXJtLmphdmEKaW5kZXggOGQ5Mzk1NC4uNmZmMzBjYiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1NvcnRUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1NvcnRUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC05OCw2ICs5OCw3IEBACiAJdGhpcy50ZXJtID0gdGVybTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCXJldHVybiB0ZXJtOwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9VdGlsaXR5LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvVXRpbGl0eS5qYXZhCmluZGV4IGM5MTQ1MjAuLjA0OTBhMjkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9VdGlsaXR5LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1V0aWxpdHkuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgKiBAcmV0dXJuCQl0aGUgTWVzc2FnZVNldCBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZVNldFtdIHRvTWVzc2FnZVNldChNZXNzYWdlW10gbXNncywgQ29uZGl0aW9uIGNvbmQpIHsKLQlMaXN0PE1lc3NhZ2VTZXQ+IHYgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VTZXQ+KDEpOworCUxpc3Q8TWVzc2FnZVNldD4gdiA9IG5ldyBBcnJheUxpc3Q8PigxKTsKIAlpbnQgY3VycmVudCwgbmV4dDsKIAogCUlNQVBNZXNzYWdlIG1zZzsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCW1zZ3MgPSBtc2dzLmNsb25lKCk7CiAJQXJyYXlzLnNvcnQobXNncywKIAkgICAgbmV3IENvbXBhcmF0b3I8TWVzc2FnZT4oKSB7Ci0JCS8vQE92ZXJyaWRlCisJCUBPdmVycmlkZQogCQlwdWJsaWMgaW50IGNvbXBhcmUoTWVzc2FnZSBtc2cxLCBNZXNzYWdlIG1zZzIpIHsKIAkJICAgIHJldHVybiBtc2cxLmdldE1lc3NhZ2VOdW1iZXIoKSAtIG1zZzIuZ2V0TWVzc2FnZU51bWJlcigpOwogCQl9CkBAIC0xNzAsNyArMTcwLDcgQEAKICAgICAgKiBAcmV0dXJuCQl0aGUgVUlEU2V0IGFycmF5CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBVSURTZXRbXSB0b1VJRFNldChNZXNzYWdlW10gbXNncykgewotCUxpc3Q8VUlEU2V0PiB2ID0gbmV3IEFycmF5TGlzdDxVSURTZXQ+KDEpOworCUxpc3Q8VUlEU2V0PiB2ID0gbmV3IEFycmF5TGlzdDw+KDEpOwogCWxvbmcgY3VycmVudCwgbmV4dDsKIAogCUlNQVBNZXNzYWdlIG1zZzsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9Zb3VuZ2VyVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1lvdW5nZXJUZXJtLmphdmEKaW5kZXggMzQ4NDMyOC4uNTM1YTU3ZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1lvdW5nZXJUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL1lvdW5nZXJUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC04Myw2ICs4Myw3IEBACiAgICAgICoJCQlyZWNlaXZlZCBkYXRlCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlEYXRlIGQ7CiAKQEAgLTEwMiw2ICsxMDMsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBZb3VuZ2VyVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTExMSw2ICsxMTMsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gaW50ZXJ2YWw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3BhY2thZ2UuaHRtbCBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTc3YmYuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0KLQotICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKLSAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAotICAgIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gICAgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCi0gICAgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAgICBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCi0gICAgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gICAgZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgotCi0gICAgR1BMIENsYXNzcGF0aCBFeGNlcHRpb246Ci0gICAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKLSAgICBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAgICBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotCi0gICAgTW9kaWZpY2F0aW9uczoKLSAgICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcwotICAgIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICBDb250cmlidXRvcihzKToKLSAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAgICBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZyAiW0NvbnRyaWJ1dG9yXQotICAgIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcyBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTAotICAgIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAgICByZWNpcGllbnQgaGFzIHRoZSBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi0gICAgZWl0aGVyIHRoZSBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvCi0gICAgaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gICAgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZSBvcHRpb24gYXBwbGllcwotICAgIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0Ci0gICAgaG9sZGVyLgotCi0tLT4KLQotPC9IRUFEPgotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi1BbiBJTUFQIHByb3RvY29sIHByb3ZpZGVyIGZvciB0aGUgSmF2YU1haWwgQVBJCi10aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhbiBJTUFQIG1lc3NhZ2Ugc3RvcmUuCi1Cb3RoIHRoZSBJTUFQNCBhbmQgSU1BUDRyZXYxIHByb3RvY29scyBhcmUgc3VwcG9ydGVkLgotUmVmZXIgdG8gPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzUwMS50eHQiIFRBUkdFVD0iX3RvcCI+Ci1SRkMgMzUwMTwvQT4KLWZvciBtb3JlIGluZm9ybWF0aW9uLgotVGhlIElNQVAgcHJvdG9jb2wgcHJvdmlkZXIgYWxzbyBzdXBwb3J0cyBtYW55IElNQVAgZXh0ZW5zaW9ucyAoZGVzY3JpYmVkIGJlbG93KS4KLU5vdGUgdGhhdCB0aGUgc2VydmVyIG5lZWRzIHRvIHN1cHBvcnQgdGhlc2UgZXh0ZW5zaW9ucyAoYW5kIG5vdCBhbGwgc2VydmVycyBkbykKLWluIG9yZGVyIHRvIHVzZSB0aGUgc3VwcG9ydCBpbiB0aGUgSU1BUCBwcm92aWRlci4KLVlvdSBjYW4gcXVlcnkgdGhlIHNlcnZlciBmb3Igc3VwcG9ydCBvZiB0aGVzZSBleHRlbnNpb25zIHVzaW5nIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBTdG9yZSNoYXNDYXBhYmlsaXR5IElNQVBTdG9yZSBoYXNDYXBhYmlsaXR5fQotbWV0aG9kIHVzaW5nIHRoZSBjYXBhYmlsaXR5IG5hbWUgZGVmaW5lZCBieSB0aGUgZXh0ZW5zaW9uCi0oc2VlIHRoZSBhcHByb3ByaWF0ZSBSRkMpIGFmdGVyIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci4KLTxIND5VSURQTFVTIFN1cHBvcnQ8L0g0PgotPFA+Ci1UaGUgSU1BUCBVSURQTFVTIGV4dGVuc2lvbgotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQzMTUudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyA0MzE1PC9BPikKLWlzIHN1cHBvcnRlZCB2aWEgdGhlIElNQVBGb2xkZXIgbWV0aG9kcwote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjYWRkTWVzc2FnZXMgYWRkTWVzc2FnZXN9LAote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjYXBwZW5kVUlETWVzc2FnZXMgYXBwZW5kVUlETWVzc2FnZXN9LCBhbmQKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyI2NvcHlVSURNZXNzYWdlcyBjb3B5VUlETWVzc2FnZXN9LgotPEg0Pk1PVkUgU3VwcG9ydDwvSDQ+Ci08UD4KLVRoZSBJTUFQIE1PVkUgZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNjg1MS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDY4NTE8L0E+KQotaXMgc3VwcG9ydGVkIHZpYSB0aGUgSU1BUEZvbGRlciBtZXRob2RzCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlciNtb3ZlTWVzc2FnZXMgbW92ZU1lc3NhZ2VzfSBhbmQKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyI21vdmVVSURNZXNzYWdlcyBtb3ZlVUlETWVzc2FnZXN9LgotPEg0PlNBU0wgU3VwcG9ydDwvSDQ+Ci08UD4KLVRoZSBJTUFQIHByb3RvY29sIHByb3ZpZGVyIGNhbiB1c2UgU0FTTAotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ0MjIudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyA0NDIyPC9BPikKLWF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlCi08Q09ERT5qYXZheC5zZWN1cml0eS5zYXNsPC9DT0RFPiBBUElzLgotVGhlIFNBU0wtSVIKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0OTU5LnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgNDk1OTwvQT4pCi1jYXBhYmlsaXR5IGlzIGFsc28gc3VwcG9ydGVkLgotSW4gYWRkaXRpb24gdG8gdGhlIFNBU0wgbWVjaGFuaXNtcyB0aGF0IGFyZSBidWlsdCBpbnRvIAotdGhlIFNBU0wgaW1wbGVtZW50YXRpb24sIHVzZXJzIGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbAotU0FTTCBtZWNoYW5pc21zIG9mIHRoZWlyIG93biBkZXNpZ24gdG8gc3VwcG9ydCBjdXN0b20gYXV0aGVudGljYXRpb24KLXNjaGVtZXMuICBTZWUgdGhlCi08QSBIUkVGPSJodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvc2FzbC9zYXNsLXJlZmd1aWRlLmh0bWwiIFRBUkdFVD0iX3RvcCI+Ci1KYXZhIFNBU0wgQVBJIFByb2dyYW1taW5nIGFuZCBEZXBsb3ltZW50IEd1aWRlPC9BPiBmb3IgZGV0YWlscy4KLU5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgU0FTTCBtZWNoYW5pc21zCi10aGF0IHByb3ZpZGUgdGhlaXIgb3duIGludGVncml0eSBvciBjb25maWRlbnRpYWxpdHkgbGF5ZXIuCi08SDQ+T0F1dGggMi4wIFN1cHBvcnQ8L0g0PgotU3VwcG9ydCBmb3IgT0F1dGggMi4wIGF1dGhlbnRpY2F0aW9uIHZpYSB0aGUKLTxBIEhSRUY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2dtYWlsL3hvYXV0aDJfcHJvdG9jb2wiIFRBUkdFVD0iX3RvcCI+Ci1YT0FVVEgyIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbTwvQT4gaXMgcHJvdmlkZWQgZWl0aGVyIHRocm91Z2ggdGhlIFNBU0wKLXN1cHBvcnQgZGVzY3JpYmVkIGFib3ZlIG9yIGFzIGEgYnVpbHQtaW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGluIHRoZQotSU1BUCBwcm92aWRlci4KLVRoZSBPQXV0aCAyLjAgQWNjZXNzIFRva2VuIHNob3VsZCBiZSBwYXNzZWQgYXMgdGhlIHBhc3N3b3JkIGZvciB0aGlzIG1lY2hhbmlzbS4KLVNlZSA8QSBIUkVGPSJodHRwczovL2phdmEubmV0L3Byb2plY3RzL2phdmFtYWlsL3BhZ2VzL09BdXRoMiIgVEFSR0VUPSJfdG9wIj4KLU9BdXRoMiBTdXBwb3J0PC9BPiBmb3IgZGV0YWlscy4KLTxIND5Db25uZWN0aW9uIFBvb2w8L0g0PgotPFA+Ci1BIGNvbm5lY3RlZCBJTUFQU3RvcmUgbWFpbnRhaW5zIGEgcG9vbCBvZiBJTUFQIHByb3RvY29sIG9iamVjdHMgZm9yCi11c2UgaW4gY29tbXVuaWNhdGluZyB3aXRoIHRoZSBJTUFQIHNlcnZlci4gVGhlIElNQVBTdG9yZSB3aWxsIGNyZWF0ZQotdGhlIGluaXRpYWwgQVVUSEVOVElDQVRFRCBjb25uZWN0aW9uIGFuZCBzZWVkIHRoZSBwb29sIHdpdGggdGhpcwotY29ubmVjdGlvbi4gQXMgZm9sZGVycyBhcmUgb3BlbmVkIGFuZCBuZXcgSU1BUCBwcm90b2NvbCBvYmplY3RzIGFyZQotbmVlZGVkLCB0aGUgSU1BUFN0b3JlIHdpbGwgcHJvdmlkZSB0aGVtIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCwKLW9yIGNyZWF0ZSB0aGVtIGlmIG5vbmUgYXJlIGF2YWlsYWJsZS4gV2hlbiBhIGZvbGRlciBpcyBjbG9zZWQsCi1pdHMgSU1BUCBwcm90b2NvbCBvYmplY3QgaXMgcmV0dXJuZWQgdG8gdGhlIGNvbm5lY3Rpb24gcG9vbCBpZiB0aGUKLXBvb2wgaXMgbm90IG92ZXIgY2FwYWNpdHkuCi08UD4KLUEgbWVjaGFuaXNtIGlzIHByb3ZpZGVkIGZvciB0aW1pbmcgb3V0IGlkbGUgY29ubmVjdGlvbiBwb29sIElNQVAKLXByb3RvY29sIG9iamVjdHMuIFRpbWVkIG91dCBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCByZW1vdmVkIChwcnVuZWQpCi1mcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wuCi08UD4KLVRoZSBjb25uZWN0ZWQgSU1BUFN0b3JlIG9iamVjdCBtYXkgb3IgbWF5IG5vdCBtYWludGFpbiBhIHNlcGFyYXRlIElNQVAKLXByb3RvY29sIG9iamVjdCB0aGF0IHByb3ZpZGVzIHRoZSBzdG9yZSBhIGRlZGljYXRlZCBjb25uZWN0aW9uIHRvIHRoZQotSU1BUCBzZXJ2ZXIuIFRoaXMgaXMgcHJvdmlkZWQgbWFpbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKLWltcGxlbWVudGF0aW9ucyBvZiB0aGUgSU1BUCBwcm90b2NvbCBwcm92aWRlci4KLTxIND5RVU9UQSBTdXBwb3J0PC9IND4KLTxQPgotVGhlIElNQVAgUVVPVEEgZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA4Ny50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDIwODc8L0E+KQotaXMgc3VwcG9ydGVkIHZpYSB0aGUKLXtAbGluayBqYXZheC5tYWlsLlF1b3RhQXdhcmVTdG9yZSBRdW90YUF3YXJlU3RvcmV9IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBTdG9yZSBJTUFQU3RvcmV9LCBhbmQgdGhlCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlciNnZXRRdW90YSBJTUFQRm9sZGVyIGdldFF1b3RhfSBhbmQKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyI3NldFF1b3RhIElNQVBGb2xkZXIgc2V0UXVvdGF9IG1ldGhvZHMuCi08SDQ+QUNMIFN1cHBvcnQ8L0g0PgotPFA+Ci1UaGUgSU1BUCBBQ0wgZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA4Ni50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDIwODY8L0E+KQotaXMgc3VwcG9ydGVkIHZpYSB0aGUKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5SaWdodHMgUmlnaHRzfSBjbGFzcyBhbmQgdGhlIElNQVBGb2xkZXIgbWV0aG9kcwote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjZ2V0QUNMIGdldEFDTH0sCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlciNhZGRBQ0wgYWRkQUNMfSwKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyI3JlbW92ZUFDTCByZW1vdmVBQ0x9LAote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjYWRkUmlnaHRzIGFkZFJpZ2h0c30sCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlciNyZW1vdmVSaWdodHMgcmVtb3ZlUmlnaHRzfSwKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyI2xpc3RSaWdodHMgbGlzdFJpZ2h0c30sIGFuZAote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjbXlSaWdodHMgbXlSaWdodHN9LgotPEg0PlNPUlQgU3VwcG9ydDwvSDQ+Ci08UD4KLVRoZSBJTUFQIFNPUlQgZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNTI1Ni50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDUyNTY8L0E+KQotaXMgc3VwcG9ydGVkIHZpYSB0aGUKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5Tb3J0VGVybSBTb3J0VGVybX0gY2xhc3MgYW5kIHRoZSBJTUFQRm9sZGVyCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlciNnZXRTb3J0ZWRNZXNzYWdlcyBnZXRTb3J0ZWRNZXNzYWdlc30KLW1ldGhvZHMuCi08SDQ+Q09ORFNUT1JFIGFuZCBRUkVTWU5DIFN1cHBvcnQ8L0g0PgotPFA+Ci1CYXNpYyBzdXBwb3J0IGlzIHByb3ZpZGVkIGZvciB0aGUgSU1BUCBDT05EU1RPUkUKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0NTUxLnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgNDU1MTwvQT4pCi1hbmQgUVJFU1lOQwotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzUxNjIudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyA1MTYyPC9BPikKLWV4dGVuc2lvbnMgZm9yIHRoZSBwdXJwb3NlIG9mIHJlc3luY2hyb25pemluZyBhIGZvbGRlciBhZnRlciBvZmZsaW5lIG9wZXJhdGlvbi4KLU9mIGNvdXJzZSwgdGhlIHNlcnZlciBtdXN0IHN1cHBvcnQgdGhlc2UgZXh0ZW5zaW9ucy4KLVVzZSBvZiB0aGVzZSBleHRlbnNpb25zIGlzIGVuYWJsZWQgYnkgdXNpbmcgdGhlIG5ldwote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjb3BlbihpbnQsY29tLnN1bi5tYWlsLmltYXAuUmVzeW5jRGF0YSkKLUlNQVBGb2xkZXIgb3Blbn0gbWV0aG9kIGFuZCBzdXBwbHlpbmcgYW4gYXBwcm9wcmlhdGUKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5SZXN5bmNEYXRhIFJlc3luY0RhdGF9IGluc3RhbmNlLgotVXNpbmcKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5SZXN5bmNEYXRhI0NPTkRTVE9SRSBSZXN5bmNEYXRhLkNPTkRTVE9SRX0KLWVuYWJsZXMgdGhlIENPTkRTVE9SRSBleHRlbnNpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gZGlzY292ZXIgdGhlCi1tb2RpZmljYXRpb24gc2VxdWVuY2UgbnVtYmVyIChtb2RzZXEpIG9mIG1lc3NhZ2VzIHVzaW5nIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBNZXNzYWdlI2dldE1vZFNlcSBJTUFQTWVzc2FnZSBnZXRNb2RTZXF9Ci1tZXRob2QgYW5kIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXIjZ2V0SGlnaGVzdE1vZFNlcQotSU1BUEZvbGRlciBnZXRIaWdoZXN0TW9kU2VxfSBtZXRob2QuCi1Vc2luZyBhCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuUmVzeW5jRGF0YSBSZXN5bmNEYXRhfSBpbnN0YW5jZSB3aXRoIGFwcHJvcHJpYXRlCi12YWx1ZXMgYWxzbyBhbGxvd3MgdGhlIHNlcnZlciB0byByZXBvcnQgYW55IGNoYW5nZXMgaW4gbWVzc2FnZXMgc2luY2UgdGhlIGxhc3QKLXJlc3luY2hyb25pemF0aW9uLgotVGhlIGNoYW5nZXMgYXJlIHJlcG9ydGVkIGFzIGEgbGlzdCBvZgote0BsaW5rIGphdmF4Lm1haWwuZXZlbnQuTWFpbEV2ZW50IE1haWxFdmVudH0gaW5zdGFuY2VzLgotVGhlIHNwZWNpYWwKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5NZXNzYWdlVmFuaXNoZWRFdmVudCBNZXNzYWdlVmFuaXNoZWRFdmVudH0gcmVwb3J0cyBvbgotVUlEcyBvZiBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIHRoZSBsYXN0IHJlc3luY2hyb25pemF0aW9uLgotQQote0BsaW5rIGphdmF4Lm1haWwuZXZlbnQuTWVzc2FnZUNoYW5nZWRFdmVudCBNZXNzYWdlQ2hhbmdlZEV2ZW50fSByZXBvcnRzIG9uCi1jaGFuZ2VzIHRvIGZsYWdzIG9mIG1lc3NhZ2VzLgotRm9yIGV4YW1wbGU6Ci08UFJFPgotCUZvbGRlciBmb2xkZXIgPSBzdG9yZS5nZXRGb2xkZXIoIndoYXRldmVyIik7Ci0JSU1BUEZvbGRlciBpZm9sZGVyID0gKElNQVBGb2xkZXIpZm9sZGVyOwotCUxpc3QmbHQ7TWFpbEV2ZW50Jmd0OyBldmVudHMgPSBpZm9sZGVyLm9wZW4oRm9sZGVyLlJFQURfV1JJVEUsCi0JCSAgICBuZXcgUmVzeW5jRGF0YShwcmV2VWlkVmFsaWRpdHksIHByZXZNb2RTZXEpKTsKLQlmb3IgKE1haWxFdmVudCBldiA6IGV2ZW50cykgewotCSAgICBpZiAoZXYgaW5zdGFuY2VPZiBNZXNzYWdlQ2hhbmdlZEV2ZW50KSB7Ci0JCS8vIHByb2Nlc3MgZmxhZyBjaGFuZ2VzCi0JICAgIH0gZWxzZSBpZiAoZXYgaW5zdGFuY2VvZiBNZXNzYWdlVmFuaXNoZWRFdmVudCkgewotCQkvLyBwcm9jZXNzIG1lc3NhZ2VzIHRoYXQgd2VyZSByZW1vdmVkCi0JICAgIH0KLQl9Ci08L1BSRT4KLVNlZSB0aGUgcmVmZXJlbmNlZCBSRkNzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlc2UgSU1BUCBleHRlbnNpb25zLgotPEg0PldJVEhJTiBTZWFyY2ggU3VwcG9ydDwvSDQ+Ci08UD4KLVRoZSBJTUFQIFdJVEhJTiBzZWFyY2ggZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNTAzMi50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDUwMzI8L0E+KQotaXMgc3VwcG9ydGVkIHZpYSB0aGUKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5Zb3VuZ2VyVGVybSBZb3VuZ2VyVGVybX0gYW5kCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAuT2xkZXJUZXJtIE9sZGVyVGVybX0gCi17QGxpbmsgamF2YXgubWFpbC5zZWFyY2guU2VhcmNoVGVybSBTZWFyY2hUZXJtc30sIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6Ci08UFJFPgotCS8vIHNlYXJjaCBmb3IgbWVzc2FnZXMgZGVsaXZlcmVkIGluIHRoZSBsYXN0IGRheQotCU1lc3NhZ2VbXSBtc2dzID0gZm9sZGVyLnNlYXJjaChuZXcgWW91bmdlclRlcm0oMjQgKiA2MCAqIDYwKSk7Ci08L1BSRT4KLTxIND5MT0dJTi1SRUZFUlJBTCBTdXBwb3J0PC9IND4KLTxQPgotVGhlIElNQVAgTE9HSU4tUkVGRVJSQUwgZXh0ZW5zaW9uCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjIyMS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDIyMjE8L0E+KQotaXMgc3VwcG9ydGVkLgotSWYgYSBsb2dpbiByZWZlcnJhbCBpcyByZWNlaXZlZCB3aGVuIGNvbm5lY3Rpbmcgb3Igd2hlbiBhdXRoZW50aWNhdGlvbiBmYWlscywgYQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLlJlZmVycmFsRXhjZXB0aW9uIFJlZmVycmFsRXhjZXB0aW9ufSBpcyB0aHJvd24uCi1BIHJlZmVycmFsIGNhbiBhbHNvIG9jY3VyIHdoZW4gbG9naW4gc3VjY2VlZHMuICBCeSBkZWZhdWx0LCBubyBleGNlcHRpb24gaXMKLXRocm93biBpbiB0aGlzIGNhc2UuICBUbyBmb3JjZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIGFuZCB0aGUgYXV0aGVudGljYXRpb24KLXRvIGZhaWwsIHNldCB0aGUgPGNvZGU+bWFpbC5pbWFwLnJlZmVycmFsZXhjZXB0aW9uPC9jb2RlPiBwcm9wZXJ0eSB0byAidHJ1ZSIuCi08SDQ+Q09NUFJFU1MgU3VwcG9ydDwvSDQ+Ci08UD4KLVRoZSBJTUFQIENPTVBSRVNTIGV4dGVuc2lvbgotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ5NzgudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyA0OTc4PC9BPikKLWlzIHN1cHBvcnRlZC4KLUlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhlIGV4dGVuc2lvbiBhbmQgdGhlCi08Y29kZT5tYWlsLmltYXAuY29tcHJlc3MuZW5hYmxlPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gInRydWUiLAotY29tcHJlc3Npb24gd2lsbCBiZSBlbmFibGVkLgotPEEgTkFNRT0icHJvcGVydGllcyI+Ci08SDQ+UHJvcGVydGllczwvSDQ+Ci08L0E+Ci08UD4KLVRoZSBJTUFQIHByb3RvY29sIHByb3ZpZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcywKLXdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIEphdmFNYWlsIDxjb2RlPlNlc3Npb248L2NvZGU+IG9iamVjdC4KLVRoZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgc2V0IGFzIHN0cmluZ3M7IHRoZSBUeXBlIGNvbHVtbiBkZXNjcmliZXMKLWhvdyB0aGUgc3RyaW5nIGlzIGludGVycHJldGVkLiAgRm9yIGV4YW1wbGUsIHVzZQotPFBSRT4KLQlwcm9wcy5wdXQoIm1haWwuaW1hcC5wb3J0IiwgIjg4OCIpOwotPC9QUkU+Ci10byBzZXQgdGhlIDxDT0RFPm1haWwuaW1hcC5wb3J0PC9DT0RFPiBwcm9wZXJ0eSwgd2hpY2ggaXMgb2YgdHlwZSBpbnQuCi08UD4KLU5vdGUgdGhhdCBpZiB5b3UncmUgdXNpbmcgdGhlICJpbWFwcyIgcHJvdG9jb2wgdG8gYWNjZXNzIElNQVAgb3ZlciBTU0wsCi1hbGwgdGhlIHByb3BlcnRpZXMgd291bGQgYmUgbmFtZWQgIm1haWwuaW1hcHMuKiIuCi08UD4KLTxUQUJMRSBCT1JERVI+Ci08VFI+Ci08VEg+TmFtZTwvVEg+Ci08VEg+VHlwZTwvVEg+Ci08VEg+RGVzY3JpcHRpb248L1RIPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnVzZXIiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnVzZXIiPgotPFREPm1haWwuaW1hcC51c2VyPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPkRlZmF1bHQgdXNlciBuYW1lIGZvciBJTUFQLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuaG9zdCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuaG9zdCI+Ci08VEQ+bWFpbC5pbWFwLmhvc3Q8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+VGhlIElNQVAgc2VydmVyIHRvIGNvbm5lY3QgdG8uPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5wb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5wb3J0Ij4KLTxURD5tYWlsLmltYXAucG9ydDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5UaGUgSU1BUCBzZXJ2ZXIgcG9ydCB0byBjb25uZWN0IHRvLCBpZiB0aGUgY29ubmVjdCgpIG1ldGhvZCBkb2Vzbid0Ci1leHBsaWNpdGx5IHNwZWNpZnkgb25lLiBEZWZhdWx0cyB0byAxNDMuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5wYXJ0aWFsZmV0Y2giPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnBhcnRpYWxmZXRjaCI+Ci08VEQ+bWFpbC5pbWFwLnBhcnRpYWxmZXRjaDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Q29udHJvbHMgd2hldGhlciB0aGUgSU1BUCBwYXJ0aWFsLWZldGNoIGNhcGFiaWxpdHkgc2hvdWxkIGJlIHVzZWQuCi1EZWZhdWx0cyB0byB0cnVlLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuZmV0Y2hzaXplIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5mZXRjaHNpemUiPgotPFREPm1haWwuaW1hcC5mZXRjaHNpemU8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+UGFydGlhbCBmZXRjaCBzaXplIGluIGJ5dGVzLiBEZWZhdWx0cyB0byAxNksuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5wZWVrIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5wZWVrIj4KLTxURD5tYWlsLmltYXAucGVlazwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdXNlIHRoZSBJTUFQIFBFRUsgb3B0aW9uIHdoZW4gZmV0Y2hpbmcgYm9keSBwYXJ0cywKLXRvIGF2b2lkIHNldHRpbmcgdGhlIFNFRU4gZmxhZyBvbiBtZXNzYWdlcy4KLURlZmF1bHRzIHRvIGZhbHNlLgotQ2FuIGJlIG92ZXJyaWRkZW4gb24gYSBwZXItbWVzc2FnZSBiYXNpcyBieSB0aGUKLXtAbGluayBjb20uc3VuLm1haWwuaW1hcC5JTUFQTWVzc2FnZSNzZXRQZWVrIHNldFBlZWt9Ci1tZXRob2Qgb24gSU1BUE1lc3NhZ2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmlnbm9yZWJvZHlzdHJ1Y3R1cmVzaXplIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5pZ25vcmVib2R5c3RydWN0dXJlc2l6ZSI+Ci08VEQ+bWFpbC5pbWFwLmlnbm9yZWJvZHlzdHJ1Y3R1cmVzaXplPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5UaGUgSU1BUCBCT0RZU1RSVUNUVVJFIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBleGFjdCBzaXplIG9mIGVhY2ggYm9keSBwYXJ0LgotTm9ybWFsbHksIHRoaXMgc2l6ZSBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgbXVjaCBkYXRhIHRvIGZldGNoIGZvciBlYWNoCi1ib2R5IHBhcnQuCi1Tb21lIHNlcnZlcnMgcmVwb3J0IHRoaXMgc2l6ZSBpbmNvcnJlY3RseSBpbiBzb21lIGNhc2VzOyB0aGlzIHByb3BlcnR5IGNhbgotYmUgc2V0IHRvIHdvcmsgYXJvdW5kIHN1Y2ggc2VydmVyIGJ1Z3MuCi1JZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLCB0aGlzIHNpemUgaXMgaWdub3JlZCBhbmQgZGF0YSBpcyBmZXRjaGVkCi11bnRpbCB0aGUgc2VydmVyIHJlcG9ydHMgdGhlIGVuZCBvZiBkYXRhLgotVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBleHRyYSBmZXRjaCBpZiB0aGUgZGF0YSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlCi1ibG9jayBzaXplLgotRGVmYXVsdHMgdG8gZmFsc2UuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5jb25uZWN0aW9udGltZW91dCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuY29ubmVjdGlvbnRpbWVvdXQiPgotPFREPm1haWwuaW1hcC5jb25uZWN0aW9udGltZW91dDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5Tb2NrZXQgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KLVRoaXMgdGltZW91dCBpcyBpbXBsZW1lbnRlZCBieSBqYXZhLm5ldC5Tb2NrZXQuCi1EZWZhdWx0IGlzIGluZmluaXRlIHRpbWVvdXQuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC50aW1lb3V0Ij48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC50aW1lb3V0Ij4KLTxURD5tYWlsLmltYXAudGltZW91dDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5Tb2NrZXQgcmVhZCB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KLVRoaXMgdGltZW91dCBpcyBpbXBsZW1lbnRlZCBieSBqYXZhLm5ldC5Tb2NrZXQuCi1EZWZhdWx0IGlzIGluZmluaXRlIHRpbWVvdXQuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC53cml0ZXRpbWVvdXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLndyaXRldGltZW91dCI+Ci08VEQ+bWFpbC5pbWFwLndyaXRldGltZW91dDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5Tb2NrZXQgd3JpdGUgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCi1UaGlzIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYQotamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHBlciBjb25uZWN0aW9uCi10aGF0IHNjaGVkdWxlcyBhIHRocmVhZCB0byBjbG9zZSB0aGUgc29ja2V0IGlmIHRoZSB0aW1lb3V0IGV4cGlyZXMuCi1UaHVzLCB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgdGhpcyB0aW1lb3V0IGlzIG9uZSB0aHJlYWQgcGVyIGNvbm5lY3Rpb24uCi1EZWZhdWx0IGlzIGluZmluaXRlIHRpbWVvdXQuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zdGF0dXNjYWNoZXRpbWVvdXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnN0YXR1c2NhY2hldGltZW91dCI+Ci08VEQ+bWFpbC5pbWFwLnN0YXR1c2NhY2hldGltZW91dDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5UaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcyBmb3IgY2FjaGUgb2YgU1RBVFVTIGNvbW1hbmQgcmVzcG9uc2UuCi1EZWZhdWx0IGlzIDEwMDAgKDEgc2Vjb25kKS4gIFplcm8gZGlzYWJsZXMgY2FjaGUuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5hcHBlbmRidWZmZXJzaXplIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5hcHBlbmRidWZmZXJzaXplIj4KLTxURD5tYWlsLmltYXAuYXBwZW5kYnVmZmVyc2l6ZTwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLU1heGltdW0gc2l6ZSBvZiBhIG1lc3NhZ2UgdG8gYnVmZmVyIGluIG1lbW9yeSB3aGVuIGFwcGVuZGluZyB0byBhbiBJTUFQCi1mb2xkZXIuICBJZiBub3Qgc2V0LCBvciBzZXQgdG8gLTEsIHRoZXJlIGlzIG5vIG1heGltdW0gYW5kIGFsbCBtZXNzYWdlcwotYXJlIGJ1ZmZlcmVkLiAgSWYgc2V0IHRvIDAsIG5vIG1lc3NhZ2VzIGFyZSBidWZmZXJlZC4gIElmIHNldCB0byAoZS5nLikKLTgxOTIsIG1lc3NhZ2VzIG9mIDhLIGJ5dGVzIG9yIGxlc3MgYXJlIGJ1ZmZlcmVkLCBsYXJnZXIgbWVzc2FnZXMgYXJlCi1ub3QgYnVmZmVyZWQuICBCdWZmZXJpbmcgc2F2ZXMgY3B1IHRpbWUgYXQgdGhlIGV4cGVuc2Ugb2Ygc2hvcnQgdGVybQotbWVtb3J5IHVzYWdlLiAgSWYgeW91IGNvbW1vbmx5IGFwcGVuZCB2ZXJ5IGxhcmdlIG1lc3NhZ2VzIHRvIElNQVAKLW1haWxib3hlcyB5b3UgbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0byBhIG1vZGVyYXRlIHZhbHVlICgxTSBvciBsZXNzKS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuY29ubmVjdGlvbnBvb2xzaXplIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5jb25uZWN0aW9ucG9vbHNpemUiPgotPFREPm1haWwuaW1hcC5jb25uZWN0aW9ucG9vbHNpemU8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+TWF4aW11bSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbm5lY3Rpb25zIGluIHRoZSBjb25uZWN0aW9uIHBvb2wuCi1EZWZhdWx0IGlzIDEuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5jb25uZWN0aW9ucG9vbHRpbWVvdXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmNvbm5lY3Rpb25wb29sdGltZW91dCI+Ci08VEQ+bWFpbC5pbWFwLmNvbm5lY3Rpb25wb29sdGltZW91dDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5UaW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcyBmb3IgY29ubmVjdGlvbiBwb29sIGNvbm5lY3Rpb25zLiAgRGVmYXVsdAotaXMgNDUwMDAgKDQ1IHNlY29uZHMpLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc2VwYXJhdGVzdG9yZWNvbm5lY3Rpb24iPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNlcGFyYXRlc3RvcmVjb25uZWN0aW9uIj4KLTxURD5tYWlsLmltYXAuc2VwYXJhdGVzdG9yZWNvbm5lY3Rpb248L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPkZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0byB1c2UgYSBkZWRpY2F0ZWQgc3RvcmUgY29ubmVjdGlvbiBmb3Igc3RvcmUKLWNvbW1hbmRzLiAgRGVmYXVsdCBpcyBmYWxzZS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmFsbG93cmVhZG9ubHlzZWxlY3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmFsbG93cmVhZG9ubHlzZWxlY3QiPgotPFREPm1haWwuaW1hcC5hbGxvd3JlYWRvbmx5c2VsZWN0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiBmYWxzZSwgYXR0ZW1wdHMgdG8gb3BlbiBhIGZvbGRlciByZWFkL3dyaXRlIHdpbGwgZmFpbAotaWYgdGhlIFNFTEVDVCBjb21tYW5kIHN1Y2NlZWRzIGJ1dCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9sZGVyIGlzIFJFQUQtT05MWS4KLVRoaXMgc29tZXRpbWVzIGluZGljYXRlcyB0aGF0IHRoZSBmb2xkZXIgY29udGVudHMgY2FuJ3RiZSBjaGFuZ2VkLCBidXQKLXRoZSBmbGFncyBhcmUgcGVyLXVzZXIgYW5kIGNhbiBiZSBjaGFuZ2VkLCBzdWNoIGFzIG1pZ2h0IGJlIHRoZSBjYXNlIGZvcgotcHVibGljIHNoYXJlZCBmb2xkZXJzLiAgSWYgdHJ1ZSwgc3VjaCBvcGVuIGF0dGVtcHRzIHdpbGwgc3VjY2VlZCwgYWxsb3dpbmcKLXRoZSBmbGFncyB0byBiZSBjaGFuZ2VkLiAgVGhlIDxjb2RlPmdldE1vZGU8L2NvZGU+IG1ldGhvZCBvbiB0aGUKLTxjb2RlPkZvbGRlcjwvY29kZT4gb2JqZWN0IHdpbGwgcmV0dXJuIDxjb2RlPkZvbGRlci5SRUFEX09OTFk8L2NvZGU+Ci1pbiB0aGlzIGNhc2UgZXZlbiB0aG91Z2ggdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZCBzcGVjaWZpZWQKLTxjb2RlPkZvbGRlci5SRUFEX1dSSVRFPC9jb2RlPi4gIERlZmF1bHQgaXMgZmFsc2UuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5hdXRoLm1lY2hhbmlzbXMiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmF1dGgubWVjaGFuaXNtcyI+Ci08VEQ+bWFpbC5pbWFwLmF1dGgubWVjaGFuaXNtczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgbGlzdHMgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgdG8gY29uc2lkZXIsIGFuZCB0aGUgb3JkZXIKLWluIHdoaWNoIHRvIGNvbnNpZGVyIHRoZW0uICBPbmx5IG1lY2hhbmlzbXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYW5kCi1zdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLgotVGhlIGRlZmF1bHQgaXMgPGNvZGU+IlBMQUlOIExPR0lOIE5UTE0iPC9jb2RlPiwgd2hpY2ggaW5jbHVkZXMgYWxsCi10aGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLWV4Y2VwdCBYT0FVVEgyLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5hdXRoLmxvZ2luLmRpc2FibGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmF1dGgubG9naW4uZGlzYWJsZSI+Ci08VEQ+bWFpbC5pbWFwLmF1dGgubG9naW4uZGlzYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+SWYgdHJ1ZSwgcHJldmVudHMgdXNlIG9mIHRoZSBub24tc3RhbmRhcmQgPGNvZGU+QVVUSEVOVElDQVRFIExPR0lOPC9jb2RlPgotY29tbWFuZCwgaW5zdGVhZCB1c2luZyB0aGUgcGxhaW4gPGNvZGU+TE9HSU48L2NvZGU+IGNvbW1hbmQuCi1EZWZhdWx0IGlzIGZhbHNlLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuYXV0aC5wbGFpbi5kaXNhYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5hdXRoLnBsYWluLmRpc2FibGUiPgotPFREPm1haWwuaW1hcC5hdXRoLnBsYWluLmRpc2FibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPklmIHRydWUsIHByZXZlbnRzIHVzZSBvZiB0aGUgPGNvZGU+QVVUSEVOVElDQVRFIFBMQUlOPC9jb2RlPiBjb21tYW5kLgotRGVmYXVsdCBpcyBmYWxzZS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmF1dGgubnRsbS5kaXNhYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5hdXRoLm50bG0uZGlzYWJsZSI+Ci08VEQ+bWFpbC5pbWFwLmF1dGgubnRsbS5kaXNhYmxlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiB0cnVlLCBwcmV2ZW50cyB1c2Ugb2YgdGhlIDxjb2RlPkFVVEhFTlRJQ0FURSBOVExNPC9jb2RlPiBjb21tYW5kLgotRGVmYXVsdCBpcyBmYWxzZS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmF1dGgubnRsbS5kb21haW4iPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmF1dGgubnRsbS5kb21haW4iPgotPFREPm1haWwuaW1hcC5hdXRoLm50bG0uZG9tYWluPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotVGhlIE5UTE0gYXV0aGVudGljYXRpb24gZG9tYWluLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5hdXRoLm50bG0uZmxhZ3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmF1dGgubnRsbS5mbGFncyI+Ci08VEQ+bWFpbC5pbWFwLmF1dGgubnRsbS5mbGFnczwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLU5UTE0gcHJvdG9jb2wtc3BlY2lmaWMgZmxhZ3MuCi1TZWUgPEEgSFJFRj0iaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sI3RoZU50bG1GbGFncyIgVEFSR0VUPSJfdG9wIj4KLWh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbCN0aGVOdGxtRmxhZ3M8L0E+IGZvciBkZXRhaWxzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5hdXRoLnhvYXV0aDIuZGlzYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuYXV0aC54b2F1dGgyLmRpc2FibGUiPgotPFREPm1haWwuaW1hcC5hdXRoLnhvYXV0aDIuZGlzYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+SWYgdHJ1ZSwgcHJldmVudHMgdXNlIG9mIHRoZSA8Y29kZT5BVVRIRU5USUNBVEUgWE9BVVRIMjwvY29kZT4gY29tbWFuZC4KLUJlY2F1c2UgdGhlIE9BdXRoIDIuMCBwcm90b2NvbCByZXF1aXJlcyBhIHNwZWNpYWwgYWNjZXNzIHRva2VuIGluc3RlYWQgb2YKLWEgcGFzc3dvcmQsIHRoaXMgbWVjaGFuaXNtIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBFbmFibGUgaXQgYnkgZXhwbGljaXRseQotc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvICJmYWxzZSIgb3IgYnkgc2V0dGluZyB0aGUgIm1haWwuaW1hcC5hdXRoLm1lY2hhbmlzbXMiCi1wcm9wZXJ0eSB0byAiWE9BVVRIMiIuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5wcm94eWF1dGgudXNlciI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAucHJveHlhdXRoLnVzZXIiPgotPFREPm1haWwuaW1hcC5wcm94eWF1dGgudXNlcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD5JZiB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZSBQUk9YWUFVVEggZXh0ZW5zaW9uLCB0aGlzIHByb3BlcnR5Ci1zcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gYWN0IGFzLiAgQXV0aGVudGljYXRlIHRvIHRoZQotc2VydmVyIHVzaW5nIHRoZSBhZG1pbmlzdHJhdG9yJ3MgY3JlZGVudGlhbHMuICBBZnRlciBhdXRoZW50aWNhdGlvbiwKLXRoZSBJTUFQIHByb3ZpZGVyIHdpbGwgaXNzdWUgdGhlIDxjb2RlPlBST1hZQVVUSDwvY29kZT4gY29tbWFuZCB3aXRoCi10aGUgdXNlciBuYW1lIHNwZWNpZmllZCBpbiB0aGlzIHByb3BlcnR5LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5sb2NhbGFkZHJlc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmxvY2FsYWRkcmVzcyI+Ci08VEQ+bWFpbC5pbWFwLmxvY2FsYWRkcmVzczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUxvY2FsIGFkZHJlc3MgKGhvc3QgbmFtZSkgdG8gYmluZCB0byB3aGVuIGNyZWF0aW5nIHRoZSBJTUFQIHNvY2tldC4KLURlZmF1bHRzIHRvIHRoZSBhZGRyZXNzIHBpY2tlZCBieSB0aGUgU29ja2V0IGNsYXNzLgotU2hvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvIGJlIHNldCwgYnV0IHVzZWZ1bCB3aXRoIG11bHRpLWhvbWVkIGhvc3RzCi13aGVyZSBpdCdzIGltcG9ydGFudCB0byBwaWNrIGEgcGFydGljdWxhciBsb2NhbCBhZGRyZXNzIHRvIGJpbmQgdG8uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmxvY2FscG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAubG9jYWxwb3J0Ij4KLTxURD5tYWlsLmltYXAubG9jYWxwb3J0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPgotTG9jYWwgcG9ydCBudW1iZXIgdG8gYmluZCB0byB3aGVuIGNyZWF0aW5nIHRoZSBJTUFQIHNvY2tldC4KLURlZmF1bHRzIHRvIHRoZSBwb3J0IG51bWJlciBwaWNrZWQgYnkgdGhlIFNvY2tldCBjbGFzcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc2FzbC5lbmFibGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNhc2wuZW5hYmxlIj4KLTxURD5tYWlsLmltYXAuc2FzbC5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIGF0dGVtcHQgdG8gdXNlIHRoZSBqYXZheC5zZWN1cml0eS5zYXNsIHBhY2thZ2UgdG8KLWNob29zZSBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yIGxvZ2luLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnNhc2wubWVjaGFuaXNtcyI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc2FzbC5tZWNoYW5pc21zIj4KLTxURD5tYWlsLmltYXAuc2FzbC5tZWNoYW5pc21zPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotQSBzcGFjZSBvciBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBTQVNMIG1lY2hhbmlzbSBuYW1lcyB0byB0cnkKLXRvIHVzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc2FzbC5hdXRob3JpemF0aW9uaWQiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNhc2wuYXV0aG9yaXphdGlvbmlkIj4KLTxURD5tYWlsLmltYXAuc2FzbC5hdXRob3JpemF0aW9uaWQ8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgYXV0aG9yaXphdGlvbiBJRCB0byB1c2UgaW4gdGhlIFNBU0wgYXV0aGVudGljYXRpb24uCi1JZiBub3Qgc2V0LCB0aGUgYXV0aGVudGljYXRpb24gSUQgKHVzZXIgbmFtZSkgaXMgdXNlZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc2FzbC5yZWFsbSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc2FzbC5yZWFsbSI+Ci08VEQ+bWFpbC5pbWFwLnNhc2wucmVhbG08L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+VGhlIHJlYWxtIHRvIHVzZSB3aXRoIFNBU0wgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0aGF0Ci1yZXF1aXJlIGEgcmVhbG0sIHN1Y2ggYXMgRElHRVNULU1ENS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnNhc2wudXNlY2Fub25pY2FsaG9zdG5hbWUiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNhc2wudXNlY2Fub25pY2FsaG9zdG5hbWUiPgotPFREPm1haWwuaW1hcC5zYXNsLnVzZWNhbm9uaWNhbGhvc3RuYW1lPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCB0aGUgY2Fub25pY2FsIGhvc3QgbmFtZSByZXR1cm5lZCBieQote0BsaW5rIGphdmEubmV0LkluZXRBZGRyZXNzI2dldENhbm9uaWNhbEhvc3ROYW1lIEluZXRBZGRyZXNzLmdldENhbm9uaWNhbEhvc3ROYW1lfQotaXMgcGFzc2VkIHRvIHRoZSBTQVNMIG1lY2hhbmlzbSwgaW5zdGVhZCBvZiB0aGUgaG9zdCBuYW1lIHVzZWQgdG8gY29ubmVjdC4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zYXNsLnhnd3RydXN0ZWRhcHBoYWNrLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc2FzbC54Z3d0cnVzdGVkYXBwaGFjay5lbmFibGUiPgotPFREPm1haWwuaW1hcC5zYXNsLiB4Z3d0cnVzdGVkYXBwaGFjay5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIGVuYWJsZXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB0aGUgTm92ZWxsIEdyb3Vwd2lzZQotWEdXVFJVU1RFREFQUCBTQVNMIG1lY2hhbmlzbSwgd2hlbiB0aGF0IG1lY2hhbmlzbSBpcyBiZWluZyB1c2VkLgotRGVmYXVsdHMgdG8gdHJ1ZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeSI+Ci08VEQ+bWFpbC5pbWFwLnNvY2tldEZhY3Rvcnk8L1REPgotPFREPlNvY2tldEZhY3Rvcnk8L1REPgotPFREPgotSWYgc2V0IHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQotPGNvZGU+amF2YXgubmV0LlNvY2tldEZhY3Rvcnk8L2NvZGU+IGludGVyZmFjZSwgdGhpcyBjbGFzcwotd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBJTUFQIHNvY2tldHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhbgotaW5zdGFuY2Ugb2YgYSBjbGFzcywgbm90IGEgbmFtZSwgYW5kIG11c3QgYmUgc2V0IHVzaW5nIHRoZQotPGNvZGU+cHV0PC9jb2RlPiBtZXRob2QsIG5vdCB0aGUgPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IG1ldGhvZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeS5jbGFzcyI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeS5jbGFzcyI+Ci08VEQ+bWFpbC5pbWFwLnNvY2tldEZhY3RvcnkuY2xhc3M8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1JZiBzZXQsIHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLTxjb2RlPmphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5PC9jb2RlPiBpbnRlcmZhY2UuICBUaGlzIGNsYXNzCi13aWxsIGJlIHVzZWQgdG8gY3JlYXRlIElNQVAgc29ja2V0cy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeS5mYWxsYmFjayI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeS5mYWxsYmFjayI+Ci08VEQ+bWFpbC5pbWFwLnNvY2tldEZhY3RvcnkuZmFsbGJhY2s8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIGZhaWx1cmUgdG8gY3JlYXRlIGEgc29ja2V0IHVzaW5nIHRoZSBzcGVjaWZpZWQKLXNvY2tldCBmYWN0b3J5IGNsYXNzIHdpbGwgY2F1c2UgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkIHVzaW5nCi10aGUgPGNvZGU+amF2YS5uZXQuU29ja2V0PC9jb2RlPiBjbGFzcy4KLURlZmF1bHRzIHRvIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnNvY2tldEZhY3RvcnkucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc29ja2V0RmFjdG9yeS5wb3J0Ij4KLTxURD5tYWlsLmltYXAuc29ja2V0RmFjdG9yeS5wb3J0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gd2hlbiB1c2luZyB0aGUgc3BlY2lmaWVkIHNvY2tldAotZmFjdG9yeS4KLUlmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IHBvcnQgd2lsbCBiZSB1c2VkLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC51c2Vzb2NrZXRjaGFubmVscyI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAudXNlc29ja2V0Y2hhbm5lbHMiPgotPFREPm1haWwuaW1hcC51c2Vzb2NrZXRjaGFubmVsczwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdXNlIFNvY2tldENoYW5uZWxzIGluc3RlYWQgb2YgU29ja2V0cyBmb3IgY29ubmVjdGluZwotdG8gdGhlIHNlcnZlci4gIFJlcXVpcmVkIGlmIHVzaW5nIHRoZSBJZGxlTWFuYWdlci4KLUlnbm9yZWQgaWYgYSBzb2NrZXQgZmFjdG9yeSBpcyBzZXQuCi1EZWZhdWx0cyB0byBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc3NsLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc3NsLmVuYWJsZSI+Ci08VEQ+bWFpbC5pbWFwLnNzbC5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIHVzZSBTU0wgdG8gY29ubmVjdCBhbmQgdXNlIHRoZSBTU0wgcG9ydCBieSBkZWZhdWx0LgotRGVmYXVsdHMgdG8gZmFsc2UgZm9yIHRoZSAiaW1hcCIgcHJvdG9jb2wgYW5kIHRydWUgZm9yIHRoZSAiaW1hcHMiIHByb3RvY29sLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zc2wuY2hlY2tzZXJ2ZXJpZGVudGl0eSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc3NsLmNoZWNrc2VydmVyaWRlbnRpdHkiPgotPFREPm1haWwuaW1hcC5zc2wuY2hlY2tzZXJ2ZXJpZGVudGl0eTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgY2hlY2sgdGhlIHNlcnZlciBpZGVudGl0eSBhcyBzcGVjaWZpZWQgYnkKLTxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI1OTUudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyNTk1PC9BPi4KLVRoZXNlIGFkZGl0aW9uYWwgY2hlY2tzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZQotYXJlIGludGVuZGVkIHRvIHByZXZlbnQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zc2wudHJ1c3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNzbC50cnVzdCI+Ci08VEQ+bWFpbC5pbWFwLnNzbC50cnVzdDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgYW5kIGEgc29ja2V0IGZhY3RvcnkgaGFzbid0IGJlZW4gc3BlY2lmaWVkLCBlbmFibGVzIHVzZSBvZiBhCi17QGxpbmsgY29tLnN1bi5tYWlsLnV0aWwuTWFpbFNTTFNvY2tldEZhY3RvcnkgTWFpbFNTTFNvY2tldEZhY3Rvcnl9LgotSWYgc2V0IHRvICIqIiwgYWxsIGhvc3RzIGFyZSB0cnVzdGVkLgotSWYgc2V0IHRvIGEgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0cywgdGhvc2UgaG9zdHMgYXJlIHRydXN0ZWQuCi1PdGhlcndpc2UsIHRydXN0IGRlcGVuZHMgb24gdGhlIGNlcnRpZmljYXRlIHRoZSBzZXJ2ZXIgcHJlc2VudHMuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnNzbC5zb2NrZXRGYWN0b3J5Ij48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5zc2wuc29ja2V0RmFjdG9yeSI+Ci08VEQ+bWFpbC5pbWFwLnNzbC5zb2NrZXRGYWN0b3J5PC9URD4KLTxURD5TU0xTb2NrZXRGYWN0b3J5PC9URD4KLTxURD4KLUlmIHNldCB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKLTxjb2RlPmphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTwvY29kZT4gY2xhc3MsIHRoaXMgY2xhc3MKLXdpbGwgYmUgdXNlZCB0byBjcmVhdGUgSU1BUCBTU0wgc29ja2V0cy4gIE5vdGUgdGhhdCB0aGlzIGlzIGFuCi1pbnN0YW5jZSBvZiBhIGNsYXNzLCBub3QgYSBuYW1lLCBhbmQgbXVzdCBiZSBzZXQgdXNpbmcgdGhlCi08Y29kZT5wdXQ8L2NvZGU+IG1ldGhvZCwgbm90IHRoZSA8Y29kZT5zZXRQcm9wZXJ0eTwvY29kZT4gbWV0aG9kLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zc2wuc29ja2V0RmFjdG9yeS5jbGFzcyI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc3NsLnNvY2tldEZhY3RvcnkuY2xhc3MiPgotPFREPm1haWwuaW1hcC5zc2wuc29ja2V0RmFjdG9yeS5jbGFzczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZQotPGNvZGU+amF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5PC9jb2RlPiBjbGFzcy4gIFRoaXMgY2xhc3MKLXdpbGwgYmUgdXNlZCB0byBjcmVhdGUgSU1BUCBTU0wgc29ja2V0cy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuc3NsLnNvY2tldEZhY3RvcnkucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc3NsLnNvY2tldEZhY3RvcnkucG9ydCI+Ci08VEQ+bWFpbC5pbWFwLnNzbC5zb2NrZXRGYWN0b3J5LnBvcnQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+Ci1TcGVjaWZpZXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0byB3aGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgc29ja2V0Ci1mYWN0b3J5LgotSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgcG9ydCB3aWxsIGJlIHVzZWQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnNzbC5wcm90b2NvbHMiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLnNzbC5wcm90b2NvbHMiPgotPFREPm1haWwuaW1hcC5zc2wucHJvdG9jb2xzPC9URD4KLTxURD5zdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBTU0wgcHJvdG9jb2xzIHRoYXQgd2lsbCBiZSBlbmFibGVkIGZvciBTU0wgY29ubmVjdGlvbnMuCi1UaGUgcHJvcGVydHkgdmFsdWUgaXMgYSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHRva2VucyBhY2NlcHRhYmxlCi10byB0aGUgPGNvZGU+amF2YXgubmV0LnNzbC5TU0xTb2NrZXQuc2V0RW5hYmxlZFByb3RvY29sczwvY29kZT4gbWV0aG9kLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zc2wuY2lwaGVyc3VpdGVzIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5zc2wuY2lwaGVyc3VpdGVzIj4KLTxURD5tYWlsLmltYXAuc3NsLmNpcGhlcnN1aXRlczwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgU1NMIGNpcGhlciBzdWl0ZXMgdGhhdCB3aWxsIGJlIGVuYWJsZWQgZm9yIFNTTCBjb25uZWN0aW9ucy4KLVRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zIGFjY2VwdGFibGUKLXRvIHRoZSA8Y29kZT5qYXZheC5uZXQuc3NsLlNTTFNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzPC9jb2RlPiBtZXRob2QuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnN0YXJ0dGxzLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuc3RhcnR0bHMuZW5hYmxlIj4KLTxURD5tYWlsLmltYXAuc3RhcnR0bHMuZW5hYmxlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiB0cnVlLCBlbmFibGVzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPlNUQVJUVExTPC9jb2RlPiBjb21tYW5kIChpZgotc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIpIHRvIHN3aXRjaCB0aGUgY29ubmVjdGlvbiB0byBhIFRMUy1wcm90ZWN0ZWQKLWNvbm5lY3Rpb24gYmVmb3JlIGlzc3VpbmcgYW55IGxvZ2luIGNvbW1hbmRzLiAgTm90ZSB0aGF0IGFuIGFwcHJvcHJpYXRlCi10cnVzdCBzdG9yZSBtdXN0IGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgY2xpZW50IHdpbGwgdHJ1c3QgdGhlIHNlcnZlcidzCi1jZXJ0aWZpY2F0ZS4gIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIG9uIEoyU0UgMS40IGFuZCBuZXdlciBzeXN0ZW1zLgotRGVmYXVsdCBpcyBmYWxzZS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLnN0YXJ0dGxzLnJlcXVpcmVkIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5zdGFydHRscy5yZXF1aXJlZCI+Ci08VEQ+bWFpbC5pbWFwLnN0YXJ0dGxzLnJlcXVpcmVkPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHRydWUsIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPlNUQVJUVExTPC9jb2RlPiBjb21tYW5kLgotSWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFNUQVJUVExTIGNvbW1hbmQsIG9yIHRoZSBjb21tYW5kCi1mYWlscywgdGhlIGNvbm5lY3QgbWV0aG9kIHdpbGwgZmFpbC4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zb2Nrcy5ob3N0Ij48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5zb2Nrcy5ob3N0Ij4KLTxURD5tYWlsLmltYXAuc29ja3MuaG9zdDwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIG9mIGEgU09DS1M1IHByb3h5IHNlcnZlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IKLWNvbm5lY3Rpb25zIHRvIHRoZSBtYWlsIHNlcnZlci4KLShOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIEpESyAxLjUgb3IgbmV3ZXIuKQotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5zb2Nrcy5wb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5zb2Nrcy5wb3J0Ij4KLTxURD5tYWlsLmltYXAuc29ja3MucG9ydDwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgcG9ydCBudW1iZXIgZm9yIHRoZSBTT0NLUzUgcHJveHkgc2VydmVyLgotVGhpcyBzaG91bGQgb25seSBuZWVkIHRvIGJlIHVzZWQgaWYgdGhlIHByb3h5IHNlcnZlciBpcyBub3QgdXNpbmcKLXRoZSBzdGFuZGFyZCBwb3J0IG51bWJlciBvZiAxMDgwLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5taW5pZGxldGltZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAubWluaWRsZXRpbWUiPgotPFREPm1haWwuaW1hcC5taW5pZGxldGltZTwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLUFwcGxpY2F0aW9ucyB0eXBpY2FsbHkgY2FsbCB0aGUgaWRsZSBtZXRob2QgaW4gYSBsb29wLiAgSWYgYW5vdGhlcgotdGhyZWFkIHRlcm1pYW50ZXMgdGhlIElETEUgY29tbWFuZCwgaXQgbmVlZHMgYSBjaGFuY2UgdG8gZG8gaXRzCi13b3JrIGJlZm9yZSBhbm90aGVyIElETEUgY29tbWFuZCBpcyBpc3N1ZWQuICBUaGUgaWRsZSBtZXRob2QgZW5mb3JjZXMKLWEgZGVsYXkgdG8gcHJldmVudCB0aHJhc2hpbmcgYmV0d2VlbiB0aGUgSURMRSBjb21tYW5kIGFuZCByZWd1bGFyCi1jb21tYW5kcy4gIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiAgSWYgbm90Ci1zZXQsIHRoZSBkZWZhdWx0IGlzIDEwIG1pbGxpc2Vjb25kcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuZW5hYmxlcmVzcG9uc2VldmVudHMiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmVuYWJsZXJlc3BvbnNlZXZlbnRzIj4KLTxURD5tYWlsLmltYXAuZW5hYmxlcmVzcG9uc2VldmVudHM8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotRW5hYmxlIHNwZWNpYWwgSU1BUC1zcGVjaWZpYyBldmVudHMgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBTdG9yZSdzCi08Y29kZT5Db25uZWN0aW9uTGlzdGVuZXI8L2NvZGU+LiAgSWYgdHJ1ZSwgSU1BUCBPSywgTk8sIEJBRCwgb3IgQllFIHJlc3BvbnNlcwotd2lsbCBiZSBzZW50IGFzIDxjb2RlPkNvbm5lY3Rpb25FdmVudDwvY29kZT5zIHdpdGggYSB0eXBlIG9mCi08Y29kZT5JTUFQU3RvcmUuUkVTUE9OU0U8L2NvZGU+LiAgVGhlIGV2ZW50J3MgbWVzc2FnZSB3aWxsIGJlIHRoZQotcmF3IElNQVAgcmVzcG9uc2Ugc3RyaW5nLgotQnkgZGVmYXVsdCwgdGhlc2UgZXZlbnRzIGFyZSBub3Qgc2VudC4KLU5PVEU6IFRoaXMgY2FwYWJpbGl0eSBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBsaWtlbHkgd2lsbCBjaGFuZ2UKLWluIGZ1dHVyZSByZWxlYXNlcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuZW5hYmxlaW1hcGV2ZW50cyI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuZW5hYmxlaW1hcGV2ZW50cyI+Ci08VEQ+bWFpbC5pbWFwLmVuYWJsZWltYXBldmVudHM8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotRW5hYmxlIHNwZWNpYWwgSU1BUC1zcGVjaWZpYyBldmVudHMgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBTdG9yZSdzCi08Y29kZT5Db25uZWN0aW9uTGlzdGVuZXI8L2NvZGU+LiAgSWYgdHJ1ZSwgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzCi1yZWNlaXZlZCBkdXJpbmcgdGhlIFN0b3JlJ3MgPGNvZGU+aWRsZTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgc2VudAotYXMgPGNvZGU+Q29ubmVjdGlvbkV2ZW50PC9jb2RlPnMgd2l0aCBhIHR5cGUgb2YKLTxjb2RlPklNQVBTdG9yZS5SRVNQT05TRTwvY29kZT4uICBUaGUgZXZlbnQncyBtZXNzYWdlIHdpbGwgYmUgdGhlCi1yYXcgSU1BUCByZXNwb25zZSBzdHJpbmcuCi1CeSBkZWZhdWx0LCB0aGVzZSBldmVudHMgYXJlIG5vdCBzZW50LgotTk9URTogVGhpcyBjYXBhYmlsaXR5IGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIGxpa2VseSB3aWxsIGNoYW5nZQotaW4gZnV0dXJlIHJlbGVhc2VzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC50aHJvd3NlYXJjaGV4Y2VwdGlvbiI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAudGhyb3dzZWFyY2hleGNlcHRpb24iPgotPFREPm1haWwuaW1hcC50aHJvd3NlYXJjaGV4Y2VwdGlvbjwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSBhbmQgYSB7QGxpbmsgamF2YXgubWFpbC5zZWFyY2guU2VhcmNoVGVybSBTZWFyY2hUZXJtfQotcGFzc2VkIHRvIHRoZQote0BsaW5rIGphdmF4Lm1haWwuRm9sZGVyI3NlYXJjaCBGb2xkZXIuc2VhcmNofQotbWV0aG9kIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgSU1BUCBwcm90b2NvbCwgdGhyb3cgYQote0BsaW5rIGphdmF4Lm1haWwuc2VhcmNoLlNlYXJjaEV4Y2VwdGlvbiBTZWFyY2hFeGNlcHRpb259LgotRm9yIGV4YW1wbGUsIHRoZSBJTUFQIHByb3RvY29sIG9ubHkgc3VwcG9ydHMgbGVzcy10aGFuIGFuZCBncmVhdGVyLXRoYW4KLWNvbXBhcmlzb25zIGZvciBhIHtAbGluayBqYXZheC5tYWlsLnNlYXJjaC5TaXplVGVybSBTaXplVGVybX0uCi1JZiBmYWxzZSwgdGhlIHNlYXJjaCB3aWxsIGJlIGRvbmUgbG9jYWxseSBieSBmZXRjaGluZyB0aGUgcmVxdWlyZWQKLW1lc3NhZ2UgZGF0YSBhbmQgY29tcGFyaW5nIGl0IGxvY2FsbHkuCi1EZWZhdWx0cyB0byBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuZm9sZGVyLmNsYXNzIj48L0E+Ci08VFIgaWQ9Im1haWwuaW1hcC5mb2xkZXIuY2xhc3MiPgotPFREPm1haWwuaW1hcC5mb2xkZXIuY2xhc3M8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1DbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgPGNvZGU+Y29tLnN1bi5tYWlsLmltYXAuSU1BUEZvbGRlcjwvY29kZT4uCi1UaGUgc3ViY2xhc3MgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIElNQVAgY29tbWFuZHMuCi1UaGUgc3ViY2xhc3MgbXVzdCBoYXZlIHB1YmxpYyBjb25zdHJ1Y3RvcnMgb2YgdGhlIGZvcm0KLTxjb2RlPnB1YmxpYyBNeUlNQVBGb2xkZXIoU3RyaW5nIGZ1bGxOYW1lLCBjaGFyIHNlcGFyYXRvciwgSU1BUFN0b3JlIHN0b3JlLAotQm9vbGVhbiBpc05hbWVzcGFjZSk8L2NvZGU+IGFuZAotPGNvZGU+cHVibGljIE15SU1BUEZvbGRlcihMaXN0SW5mbyBsaSwgSU1BUFN0b3JlIHN0b3JlKTwvY29kZT4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmltYXAuY2xvc2Vmb2xkZXJzb25zdG9yZWZhaWx1cmUiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmNsb3NlZm9sZGVyc29uc3RvcmVmYWlsdXJlIj4KLTxURD5tYWlsLmltYXAuY2xvc2Vmb2xkZXJzb25zdG9yZWZhaWx1cmU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSW4gc29tZSBjYXNlcywgYSBmYWlsdXJlIG9mIHRoZSBTdG9yZSBjb25uZWN0aW9uIGluZGljYXRlcyBhIGZhaWx1cmUgb2YgdGhlCi1zZXJ2ZXIsIGFuZCBhbGwgRm9sZGVycyBhc3NvY2lhdGVkIHdpdGggdGhhdCBTdG9yZSBzaG91bGQgYWxzbyBiZSBjbG9zZWQuCi1JbiBvdGhlciBjYXNlcywgYSBTdG9yZSBjb25uZWN0aW9uIGZhaWx1cmUgbWF5IGJlIGEgdHJhbnNpZW50IGZhaWx1cmUsIGFuZAotRm9sZGVycyBtYXkgY29udGludWUgdG8gb3BlcmF0ZSBub3JtYWxseS4KLUlmIHRoaXMgcHJvcGVydHkgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCBmYWlsdXJlcyBpbiB0aGUgU3RvcmUgY29ubmVjdGlvbiBjYXVzZQotYWxsIGFzc29jaWF0ZWQgRm9sZGVycyB0byBiZSBjbG9zZWQuCi1TZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBiZXR0ZXIgaGFuZGxlIHRyYW5zaWVudCBmYWlsdXJlcyBpbiB0aGUgU3RvcmUKLWNvbm5lY3Rpb24uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5pbWFwLmZpbmFsaXplY2xlYW5jbG9zZSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuZmluYWxpemVjbGVhbmNsb3NlIj4KLTxURD5tYWlsLmltYXAuZmluYWxpemVjbGVhbmNsb3NlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVdoZW4gdGhlIGZpbmFsaXplciBmb3IgSU1BUFN0b3JlIGlzIGNhbGxlZCwKLXNob3VsZCB0aGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGJlIGNsb3NlZCBjbGVhbmx5LCBhcyBpZiB0aGUKLWFwcGxpY2F0aW9uIGNhbGxlZCB0aGUgY2xvc2UgbWV0aG9kPwotT3Igc2hvdWxkIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgYmUgY2xvc2VkIHdpdGhvdXQgc2VuZGluZwotYW55IGNvbW1hbmRzIHRvIHRoZSBzZXJ2ZXI/Ci1EZWZhdWx0cyB0byBmYWxzZSwgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGNsb3NlZCBjbGVhbmx5LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5yZWZlcnJhbGV4Y2VwdGlvbiI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAucmVmZXJyYWxleGNlcHRpb24iPgotPFREPm1haWwuaW1hcC5yZWZlcnJhbGV4Y2VwdGlvbjwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSBhbmQgYW4gSU1BUCBsb2dpbiByZWZlcnJhbCBpcyByZXR1cm5lZCB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbgotc3VjY2VlZHMsIGZhaWwgdGhlIGNvbm5lY3QgcmVxdWVzdCBhbmQgdGhyb3cgYQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwLlJlZmVycmFsRXhjZXB0aW9uIFJlZmVycmFsRXhjZXB0aW9ufS4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5jb21wcmVzcy5lbmFibGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5pbWFwLmNvbXByZXNzLmVuYWJsZSI+Ci08VEQ+bWFpbC5pbWFwLmNvbXByZXNzLmVuYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSBhbmQgdGhlIElNQVAgc2VydmVyIHN1cHBvcnRzIHRoZSBDT01QUkVTUz1ERUZMQVRFIGV4dGVuc2lvbiwKLWNvbXByZXNzaW9uIHdpbGwgYmUgZW5hYmxlZC4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5jb21wcmVzcy5sZXZlbCI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuY29tcHJlc3MubGV2ZWwiPgotPFREPm1haWwuaW1hcC5jb21wcmVzcy5sZXZlbDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLVRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkLCBpbiB0aGUgcmFuZ2UgLTEgdG8gOS4KLVNlZSB0aGUge0BsaW5rIGphdmEudXRpbC56aXAuRGVmbGF0ZXIgRGVmbGF0ZXJ9IGNsYXNzIGZvciBkZXRhaWxzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaW1hcC5jb21wcmVzcy5zdHJhdGVneSI+PC9BPgotPFRSIGlkPSJtYWlsLmltYXAuY29tcHJlc3Muc3RyYXRlZ3kiPgotPFREPm1haWwuaW1hcC5jb21wcmVzcy5zdHJhdGVneTwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLVRoZSBjb21wcmVzc2lvbiBzdHJhdGVneSB0byBiZSB1c2VkLCBpbiB0aGUgcmFuZ2UgMCB0byAyLgotU2VlIHRoZSB7QGxpbmsgamF2YS51dGlsLnppcC5EZWZsYXRlciBEZWZsYXRlcn0gY2xhc3MgZm9yIGRldGFpbHMuCi08L1REPgotPC9UUj4KLQotPC9UQUJMRT4KLTxQPgotSW4gZ2VuZXJhbCwgYXBwbGljYXRpb25zIHNob3VsZCBub3QgbmVlZCB0byB1c2UgdGhlIGNsYXNzZXMgaW4gdGhpcwotcGFja2FnZSBkaXJlY3RseS4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIHVzZSB0aGUgQVBJcyBkZWZpbmVkIGJ5Ci08Y29kZT5qYXZheC5tYWlsPC9jb2RlPiBwYWNrYWdlIChhbmQgc3VicGFja2FnZXMpLiAgQXBwbGljYXRpb25zIHNob3VsZAotbmV2ZXIgY29uc3RydWN0IGluc3RhbmNlcyBvZiA8Y29kZT5JTUFQU3RvcmU8L2NvZGU+IG9yCi08Y29kZT5JTUFQRm9sZGVyPC9jb2RlPiBkaXJlY3RseS4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIHVzZSB0aGUKLTxjb2RlPlNlc3Npb248L2NvZGU+IG1ldGhvZCA8Y29kZT5nZXRTdG9yZTwvY29kZT4gdG8gYWNxdWlyZSBhbgotYXBwcm9wcmlhdGUgPGNvZGU+U3RvcmU8L2NvZGU+IG9iamVjdCwgYW5kIGZyb20gdGhhdCBhY3F1aXJlCi08Y29kZT5Gb2xkZXI8L2NvZGU+IG9iamVjdHMuCi08SDQ+TG9nZ2VyczwvSDQ+Ci08UD4KLUluIGFkZGl0aW9uIHRvIHByaW50aW5nIGRlYnVnZ2luZyBvdXRwdXQgYXMgY29udHJvbGxlZCBieSB0aGUKLXtAbGluayBqYXZheC5tYWlsLlNlc3Npb24gU2Vzc2lvbn0gY29uZmlndXJhdGlvbiwKLXRoZSBjb20uc3VuLm1haWwuaW1hcCBwcm92aWRlciBsb2dzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHVzaW5nCi17QGxpbmsgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyfSBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5Mb2dnZXIgTmFtZTwvVEg+Ci08VEg+TG9nZ2luZyBMZXZlbDwvVEg+Ci08VEg+UHVycG9zZTwvVEg+Ci08L1RSPgotCi08VFI+Ci08VEQ+Y29tLnN1bi5tYWlsLmltYXA8L1REPgotPFREPkNPTkZJRzwvVEQ+Ci08VEQ+Q29uZmlndXJhdGlvbiBvZiB0aGUgSU1BUFN0b3JlPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwuaW1hcDwvVEQ+Ci08VEQ+RklORTwvVEQ+Ci08VEQ+R2VuZXJhbCBkZWJ1Z2dpbmcgb3V0cHV0PC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwuaW1hcC5jb25uZWN0aW9ucG9vbDwvVEQ+Ci08VEQ+Q09ORklHPC9URD4KLTxURD5Db25maWd1cmF0aW9uIG9mIHRoZSBJTUFQIGNvbm5lY3Rpb24gcG9vbDwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQ+Y29tLnN1bi5tYWlsLmltYXAuY29ubmVjdGlvbnBvb2w8L1REPgotPFREPkZJTkU8L1REPgotPFREPkRlYnVnZ2luZyBvdXRwdXQgcmVsYXRlZCB0byB0aGUgSU1BUCBjb25uZWN0aW9uIHBvb2w8L1REPgotPC9UUj4KLQotPFRSPgotPFREPmNvbS5zdW4ubWFpbC5pbWFwLm1lc3NhZ2VjYWNoZTwvVEQ+Ci08VEQ+Q09ORklHPC9URD4KLTxURD5Db25maWd1cmF0aW9uIG9mIHRoZSBJTUFQIG1lc3NhZ2UgY2FjaGU8L1REPgotPC9UUj4KLQotPFRSPgotPFREPmNvbS5zdW4ubWFpbC5pbWFwLm1lc3NhZ2VjYWNoZTwvVEQ+Ci08VEQ+RklORTwvVEQ+Ci08VEQ+RGVidWdnaW5nIG91dHB1dCByZWxhdGVkIHRvIHRoZSBJTUFQIG1lc3NhZ2UgY2FjaGU8L1REPgotPC9UUj4KLQotPFRSPgotPFREPmNvbS5zdW4ubWFpbC5pbWFwLnByb3RvY29sPC9URD4KLTxURD5GSU5FU1Q8L1REPgotPFREPkNvbXBsZXRlIHByb3RvY29sIHRyYWNlPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxIND5XQVJOSU5HPC9IND4KLTxzdHJvbmc+V0FSTklORzo8L3N0cm9uZz4gVGhlIEFQSXMgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSBzaG91bGQgYmUKLWNvbnNpZGVyZWQgPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uICBUaGV5IG1heSBiZSBjaGFuZ2VkIGluIHRoZQotZnV0dXJlIGluIHdheXMgdGhhdCBhcmUgaW5jb21wYXRpYmxlIHdpdGggYXBwbGljYXRpb25zIHVzaW5nIHRoZQotY3VycmVudCBBUElzLgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQkFTRTY0TWFpbGJveERlY29kZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CQVNFNjRNYWlsYm94RGVjb2Rlci5qYXZhCmluZGV4IDlmMGE4ZGYuLjNjNWE1OGEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CQVNFNjRNYWlsYm94RGVjb2Rlci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CQVNFNjRNYWlsYm94RGVjb2Rlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0JBU0U2NE1haWxib3hFbmNvZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQkFTRTY0TWFpbGJveEVuY29kZXIuamF2YQppbmRleCA4MzMwNzEwLi5lMzFkMzIxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQkFTRTY0TWFpbGJveEVuY29kZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQkFTRTY0TWFpbGJveEVuY29kZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CT0RZLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQk9EWS5qYXZhCmluZGV4IGYyYjczMDkuLjQwNjg0NmUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CT0RZLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0JPRFkuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CT0RZU1RSVUNUVVJFLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvQk9EWVNUUlVDVFVSRS5qYXZhCmluZGV4IDc5ZTcwYjAuLjBjNGQ3ZmMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9CT0RZU1RSVUNUVVJFLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0JPRFlTVFJVQ1RVUkUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IHBhcnNpbmcgbXVsdGlwYXJ0Iik7CiAJICAgIHR5cGUgPSAibXVsdGlwYXJ0IjsKIAkgICAgcHJvY2Vzc2VkVHlwZSA9IE1VTFRJOwotCSAgICBMaXN0PEJPRFlTVFJVQ1RVUkU+IHYgPSBuZXcgQXJyYXlMaXN0PEJPRFlTVFJVQ1RVUkU+KDEpOworCSAgICBMaXN0PEJPRFlTVFJVQ1RVUkU+IHYgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CiAJICAgIGludCBpID0gMTsKIAkgICAgZG8gewogCQl2LmFkZChuZXcgQk9EWVNUUlVDVFVSRShyKSk7CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkgICAgaWYgKHBhcnNlRGVidWcpCiAJCVN5c3RlbS5vdXQucHJpbnRsbigiREVCVUcgSU1BUDogc3VidHlwZSAiICsgc3VidHlwZSk7CiAKLQkgICAgaWYgKHIucmVhZEJ5dGUoKSA9PSAnKScpIHsgLy8gZG9uZQorCSAgICBpZiAoci5pc05leHROb25TcGFjZSgnKScpKSB7IC8vIGRvbmUKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IHBhcnNlIERPTkUiKTsKIAkJcmV0dXJuOwpAQCAtMTM2LDIzICsxMzYsMjQgQEAKIAkJU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBwYXJzaW5nIGV4dGVuc2lvbiBkYXRhIik7CiAJICAgIC8vIEJvZHkgcGFyYW1ldGVycwogCSAgICBjUGFyYW1zID0gcGFyc2VQYXJhbWV0ZXJzKHIpOwotCSAgICBpZiAoci5yZWFkQnl0ZSgpID09ICcpJykgeyAvLyBkb25lCisJICAgIGlmIChyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsgLy8gZG9uZQogCQlpZiAocGFyc2VEZWJ1ZykKIAkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiREVCVUcgSU1BUDogYm9keSBwYXJhbWV0ZXJzIERPTkUiKTsKIAkJcmV0dXJuOwogCSAgICB9CiAJICAgIAogCSAgICAvLyBEaXNwb3NpdGlvbgotCSAgICBieXRlIGIgPSByLnJlYWRCeXRlKCk7CisJICAgIGJ5dGUgYiA9IHIucGVla0J5dGUoKTsKIAkgICAgaWYgKGIgPT0gJygnKSB7CiAJCWlmIChwYXJzZURlYnVnKQogCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBwYXJzZSBkaXNwb3NpdGlvbiIpOworCQlyLnJlYWRCeXRlKCk7CiAJCWRpc3Bvc2l0aW9uID0gci5yZWFkU3RyaW5nKCk7CiAJCWlmIChwYXJzZURlYnVnKQogCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBkaXNwb3NpdGlvbiAiICsKIAkJCQkJCQlkaXNwb3NpdGlvbik7CiAJCWRQYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnMocik7Ci0JCWlmIChyLnJlYWRCeXRlKCkgIT0gJyknKSAvLyBlYXQgdGhlIGVuZCAnKScKKwkJaWYgKCFyLmlzTmV4dE5vblNwYWNlKCcpJykpIC8vIGVhdCB0aGUgZW5kICcpJwogCQkgICAgdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oCiAJCQkiQk9EWVNUUlVDVFVSRSBwYXJzZSBlcnJvcjogIiArCiAJCQkibWlzc2luZyBgYCknJyBhdCBlbmQgb2YgZGlzcG9zaXRpb24gaW4gbXVsdGlwYXJ0Iik7CkBAIC0xNjEsMjcgKzE2MiwzNiBAQAogCSAgICB9IGVsc2UgaWYgKGIgPT0gJ04nIHx8IGIgPT0gJ24nKSB7CiAJCWlmIChwYXJzZURlYnVnKQogCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBkaXNwb3NpdGlvbiBOSUwiKTsKLQkJci5za2lwKDIpOyAvLyBza2lwICdOSUwnCisJCXIuc2tpcCgzKTsgLy8gc2tpcCAnTklMJwogCSAgICB9IGVsc2UgeworCQkvKgogCQl0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigKIAkJICAgICJCT0RZU1RSVUNUVVJFIHBhcnNlIGVycm9yOiAiICsKIAkJICAgIHR5cGUgKyAiLyIgKyBzdWJ0eXBlICsgIjogIiArCiAJCSAgICAiYmFkIG11bHRpcGFydCBkaXNwb3NpdGlvbiwgYiAiICsgYik7CisJCSovCisJCWlmIChwYXJzZURlYnVnKQorCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBiYWQgbXVsdGlwYXJ0IGRpc3Bvc2l0aW9uIiArCisJCQkJCSIsIGFwcGx5aW5nIEV4Y2hhbmdlIGJ1ZyB3b3JrYXJvdW5kIik7CisJCWRlc2NyaXB0aW9uID0gci5yZWFkU3RyaW5nKCk7CisJCWlmIChwYXJzZURlYnVnKQorCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBtdWx0aXBhcnQgZGVzY3JpcHRpb24gIiArCisJCQkJCWRlc2NyaXB0aW9uKTsKKwkJLy8gVGhyb3cgYXdheSB3aGF0ZXZlciBjb21lcyBhZnRlciBpdCwgc2luY2Ugd2UgaGF2ZSBubworCQkvLyBpZGVhIHdoYXQgaXQncyBzdXBwb3NlZCB0byBiZQorCQl3aGlsZSAoci5yZWFkQnl0ZSgpID09ICcgJykKKwkJICAgIHBhcnNlQm9keUV4dGVuc2lvbihyKTsKKwkJcmV0dXJuOwogCSAgICB9CiAKIAkgICAgLy8gUkZDMzUwMSBhbGxvd3Mgbm8gYm9keS1mbGQtbGFuZyBhZnRlciBib2R5LWZsZC1kaXNwLAogCSAgICAvLyBldmVuIHRob3VnaCBSRkMyMDYwIHJlcXVpcmVkIGl0Ci0JICAgIGlmICgoYiA9IHIucmVhZEJ5dGUoKSkgPT0gJyknKSB7CisJICAgIGlmIChyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IG5vIGJvZHktZmxkLWxhbmciKTsKIAkJcmV0dXJuOyAvLyBkb25lCiAJICAgIH0KIAotCSAgICBpZiAoYiAhPSAnICcpCi0JCXRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKAotCQkgICAgIkJPRFlTVFJVQ1RVUkUgcGFyc2UgZXJyb3I6ICIgKwotCQkgICAgIm1pc3Npbmcgc3BhY2UgYWZ0ZXIgZGlzcG9zaXRpb24iKTsKLQogCSAgICAvLyBMYW5ndWFnZQogCSAgICBpZiAoci5wZWVrQnl0ZSgpID09ICcoJykgeyAvLyBhIGxpc3QgZm9sbG93cwogCQlsYW5ndWFnZSA9IHIucmVhZFN0cmluZ0xpc3QoKTsKQEAgLTI1NSw4ICsyNjUsMTggQEAKIAkgICAgICogICAgICAgcmV0dXJucyB1bnF1b3RlZCBzdHJpbmcuCiAJICAgICAqLwogCSAgICBlbmNvZGluZyA9IHIucmVhZEF0b21TdHJpbmcoKTsKLQkgICAgaWYgKGVuY29kaW5nICE9IG51bGwgJiYgZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiTklMIikpCisJICAgIGlmIChlbmNvZGluZyAhPSBudWxsICYmIGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIk5JTCIpKSB7CisJCWlmIChwYXJzZURlYnVnKQorCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBOSUwgZW5jb2RpbmciICsKKwkJCQkJIiwgYXBwbHlpbmcgRXhjaGFuZ2UgYnVnIHdvcmthcm91bmQiKTsKIAkJZW5jb2RpbmcgPSBudWxsOworCSAgICB9CisJICAgIC8qCisJICAgICAqIFhYWCAtIFdvcmsgYXJvdW5kIGJ1ZyBpbiBvZmZpY2UzNjUuY29tIHRoYXQgcmV0dXJucworCSAgICAgKgkgICAgIGEgc3RyaW5nIHdpdGggYSB0cmFpbGluZyBzcGFjZSBpbiBzb21lIGNhc2VzLgorCSAgICAgKi8KKwkgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCisJCWVuY29kaW5nID0gZW5jb2RpbmcudHJpbSgpOwogCSAgICBpZiAocGFyc2VEZWJ1ZykKIAkJU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBlbmNvZGluZyAiICsgZW5jb2RpbmcpOwogCSAgICBzaXplID0gci5yZWFkTnVtYmVyKCk7CkBAIC0zMTIsOCArMzMyLDcgQEAKIAkJCQl0eXBlICsgIi8iICsgc3VidHlwZSk7CiAJICAgIH0KIAotCSAgICBpZiAoci5wZWVrQnl0ZSgpID09ICcpJykgewotCQlyLnJlYWRCeXRlKCk7CisJICAgIGlmIChyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IHBhcnNlIERPTkUiKTsKIAkJcmV0dXJuOyAvLyBkb25lCkBAIC0zMjMsNyArMzQyLDcgQEAKIAogCSAgICAvLyBNRDUKIAkgICAgbWQ1ID0gci5yZWFkU3RyaW5nKCk7Ci0JICAgIGlmIChyLnJlYWRCeXRlKCkgPT0gJyknKSB7CisJICAgIGlmIChyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IG5vIE1ENSBET05FIik7CiAJCXJldHVybjsgLy8gZG9uZQpAQCAtMzM5LDcgKzM1OCw3IEBACiAJCWRQYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnMocik7CiAJCWlmIChwYXJzZURlYnVnKQogCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRyBJTUFQOiBkUGFyYW1zICIgKyBkUGFyYW1zKTsKLQkJaWYgKHIucmVhZEJ5dGUoKSAhPSAnKScpIC8vIGVhdCB0aGUgZW5kICcpJworCQlpZiAoIXIuaXNOZXh0Tm9uU3BhY2UoJyknKSkgLy8gZWF0IHRoZSBlbmQgJyknCiAJCSAgICB0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigKIAkJCSJCT0RZU1RSVUNUVVJFIHBhcnNlIGVycm9yOiAiICsKIAkJCSJtaXNzaW5nIGBgKScnIGF0IGVuZCBvZiBkaXNwb3NpdGlvbiIpOwpAQCAtMzU0LDcgKzM3Myw3IEBACiAJCSAgICAiYmFkIHNpbmdsZSBwYXJ0IGRpc3Bvc2l0aW9uLCBiICIgKyBiKTsKIAkgICAgfQogCi0JICAgIGlmIChyLnJlYWRCeXRlKCkgPT0gJyknKSB7CisJICAgIGlmIChyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IGRpc3Bvc2l0aW9uIERPTkUiKTsKIAkJcmV0dXJuOyAvLyBkb25lCkBAIC00MTksMTAgKzQzOCwxNCBAQAogCQlTdHJpbmcgdmFsdWUgPSByLnJlYWRTdHJpbmcoKTsKIAkJaWYgKHBhcnNlRGVidWcpCiAJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHIElNQVA6IHBhcmFtZXRlciB2YWx1ZSAiICsgdmFsdWUpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkJLy8gd29yayBhcm91bmQgYnVnZ3kgc2VydmVycworCQlpZiAodmFsdWUgPT0gbnVsbCkgewkvLyB3b3JrIGFyb3VuZCBidWdneSBzZXJ2ZXJzCisJCSAgICBpZiAocGFyc2VEZWJ1ZykKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiREVCVUcgSU1BUDogTklMIHBhcmFtZXRlciB2YWx1ZSIgKworCQkJCQkiLCBhcHBseWluZyBFeGNoYW5nZSBidWcgd29ya2Fyb3VuZCIpOwogCQkgICAgdmFsdWUgPSAiIjsKKwkJfQogCQlsaXN0LnNldChuYW1lLCB2YWx1ZSk7Ci0JICAgIH0gd2hpbGUgKHIucmVhZEJ5dGUoKSAhPSAnKScpOworCSAgICB9IHdoaWxlICghci5pc05leHROb25TcGFjZSgnKScpKTsKIAkgICAgbGlzdC5jb21iaW5lU2VnbWVudHMoKTsKIAl9IGVsc2UgaWYgKGIgPT0gJ04nIHx8IGIgPT0gJ24nKSB7CiAJICAgIGlmIChwYXJzZURlYnVnKQpAQCAtNDQyLDcgKzQ2NSw3IEBACiAJICAgIHIuc2tpcCgxKTsgLy8gc2tpcCAnKCcKIAkgICAgZG8gewogCQlwYXJzZUJvZHlFeHRlbnNpb24ocik7Ci0JICAgIH0gd2hpbGUgKHIucmVhZEJ5dGUoKSAhPSAnKScpOworCSAgICB9IHdoaWxlICghci5pc05leHROb25TcGFjZSgnKScpKTsKIAl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWIpKSAvLyBudW1iZXIKIAkgICAgci5yZWFkTnVtYmVyKCk7CiAJZWxzZSAvLyBuc3RyaW5nCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvRU5WRUxPUEUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9FTlZFTE9QRS5qYXZhCmluZGV4IGUyY2VjNTguLjE1NDRhY2MgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9FTlZFTE9QRS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9FTlZFTE9QRS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTMzLDcgKzEzMyw3IEBACiAJaWYgKHBhcnNlRGVidWcpCiAJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBNZXNzYWdlLUlEOiAiICsgbWVzc2FnZUlkKTsKIAotCWlmIChyLnJlYWRCeXRlKCkgIT0gJyknKQorCWlmICghci5pc05leHROb25TcGFjZSgnKScpKQogCSAgICB0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigiRU5WRUxPUEUgcGFyc2UgZXJyb3IiKTsKICAgICB9CiAKQEAgLTE0OCwxMiArMTQ4LDEwIEBACiAJICAgICAqIGxpc3QgaW5zdGVhZCBvZiBOSUwuICBIYW5kbGUgdGhhdCBoZXJlIGV2ZW4gdGhvdWdoIGl0CiAJICAgICAqIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgSU1BUCBzcGVjLgogCSAgICAgKi8KLQkgICAgaWYgKHIucGVla0J5dGUoKSA9PSAnKScpIHsKLQkJci5za2lwKDEpOworCSAgICBpZiAoci5pc05leHROb25TcGFjZSgnKScpKQogCQlyZXR1cm4gbnVsbDsKLQkgICAgfQogCi0JICAgIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiB2ID0gbmV3IEFycmF5TGlzdDxJbnRlcm5ldEFkZHJlc3M+KCk7CisJICAgIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkgICAgZG8gewogCQlJTUFQQWRkcmVzcyBhID0gbmV3IElNQVBBZGRyZXNzKHIpOwpAQCAtMTYyLDEwICsxNjAsNyBAQAogCQkvLyBpZiB3ZSBzZWUgYW4gZW5kLW9mLWdyb3VwIGFkZHJlc3MgYXQgdGhlIHRvcCwgaWdub3JlIGl0CiAJCWlmICghYS5pc0VuZE9mR3JvdXAoKSkKIAkJICAgIHYuYWRkKGEpOwotCSAgICB9IHdoaWxlIChyLnBlZWtCeXRlKCkgIT0gJyknKTsKLQotCSAgICAvLyBza2lwIHRoZSB0ZXJtaW5hdGluZyAnKScgYXQgdGhlIGVuZCBvZiB0aGUgYWRkcmVzc2xpc3QKLQkgICAgci5za2lwKDEpOworCSAgICB9IHdoaWxlICghci5pc05leHROb25TcGFjZSgnKScpKTsKIAogCSAgICByZXR1cm4gdi50b0FycmF5KG5ldyBJbnRlcm5ldEFkZHJlc3Nbdi5zaXplKCldKTsKIAl9IGVsc2UgaWYgKGIgPT0gJ04nIHx8IGIgPT0gJ24nKSB7IC8vIE5JTApAQCAtMTk3LDcgKzE5Miw3IEBACiAJLy8gc2tpcCBib2d1cyBzcGFjZXMgaW5zZXJ0ZWQgYnkgWWFob28gSU1BUCBzZXJ2ZXIgaWYKIAkvLyAidW5kaXNjbG9zZWQtcmVjaXBpZW50cyIgaXMgYSByZWNpcGllbnQKIAlyLnNraXBTcGFjZXMoKTsKLSAgICAgICAgaWYgKHIucmVhZEJ5dGUoKSAhPSAnKScpIC8vIHNraXAgcGFzdCB0ZXJtaW5hdGluZyAnKScKKwlpZiAoIXIuaXNOZXh0Tm9uU3BhY2UoJyknKSkgLy8gc2tpcCBwYXN0IHRlcm1pbmF0aW5nICcpJwogICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oIkFERFJFU1MgcGFyc2UgZXJyb3IiKTsKIAogCWlmIChob3N0ID09IG51bGwpIHsKQEAgLTIwOCwxMCArMjAzLDEwIEBACiAJCXJldHVybjsKIAkgICAgLy8gQWNjdW11bGF0ZSBhIGdyb3VwIGxpc3QuICBUaGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAKIAkgICAgLy8gYXJlIGFjY3VtdWxhdGVkIGluIGEgTGlzdCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nCi0JICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncm91cCBpcyBhY2N1bXVsYXRlZCBpbiBhIFN0cmluZ0J1ZmZlci4KLQkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JvdXAgaXMgYWNjdW11bGF0ZWQgaW4gYSBTdHJpbmdCdWlsZGVyLgorCSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkgICAgc2IuYXBwZW5kKGdyb3VwbmFtZSkuYXBwZW5kKCc6Jyk7Ci0JICAgIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiB2ID0gbmV3IEFycmF5TGlzdDxJbnRlcm5ldEFkZHJlc3M+KCk7CisJICAgIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJICAgIHdoaWxlIChyLnBlZWtCeXRlKCkgIT0gJyknKSB7CiAJCUlNQVBBZGRyZXNzIGEgPSBuZXcgSU1BUEFkZHJlc3Mocik7CiAJCWlmIChhLmlzRW5kT2ZHcm91cCgpKQkvLyByZWFjaGVkIGVuZCBvZiBncm91cApAQCAtMjM5LDEwICsyMzQsMTIgQEAKIAlyZXR1cm4gZ3JvdXAgJiYgZ3JvdXBuYW1lID09IG51bGw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNHcm91cCgpIHsKIAlyZXR1cm4gZ3JvdXA7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEludGVybmV0QWRkcmVzc1tdIGdldEdyb3VwKGJvb2xlYW4gc3RyaWN0KSB0aHJvd3MgQWRkcmVzc0V4Y2VwdGlvbiB7CiAJaWYgKGdyb3VwbGlzdCA9PSBudWxsKQogCSAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9GTEFHUy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0ZMQUdTLmphdmEKaW5kZXggMzBhN2Y4OC4uZGM0YzI5OCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0ZMQUdTLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0ZMQUdTLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvRmV0Y2hJdGVtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvRmV0Y2hJdGVtLmphdmEKaW5kZXggZDI1MDI5Zi4uNjllMDkwMiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0ZldGNoSXRlbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9GZXRjaEl0ZW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9GZXRjaFJlc3BvbnNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvRmV0Y2hSZXNwb25zZS5qYXZhCmluZGV4IGZkMzkyODkuLmZlNDJlZDcgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9GZXRjaFJlc3BvbnNlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0ZldGNoUmVzcG9uc2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQyLDcgKzQyLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKIGltcG9ydCBjb20uc3VuLm1haWwuaWFwLio7CiAKIC8qKgpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEl0ZW0+IExpc3Q8VD4gZ2V0SXRlbXMoUmVzcG9uc2VbXSByLCBpbnQgbXNnbm8sCiAJCQkJQ2xhc3M8VD4gYykgewotCUxpc3Q8VD4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisJTGlzdDxUPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJaWYgKHIgPT0gbnVsbCkKIAkgICAgcmV0dXJuIGl0ZW1zOwpAQCAtMTk2LDE1ICsxOTYsMTQgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gVEVYVCA9IHsnLicsJ1QnLCdFJywnWCcsJ1QnfTsKIAogICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHRocm93cyBQYXJzaW5nRXhjZXB0aW9uIHsKLQlza2lwU3BhY2VzKCk7Ci0JaWYgKGJ1ZmZlcltpbmRleF0gIT0gJygnKQorCWlmICghaXNOZXh0Tm9uU3BhY2UoJygnKSkKIAkgICAgdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oCiAJCSJlcnJvciBpbiBGRVRDSCBwYXJzaW5nLCBtaXNzaW5nICcoJyBhdCBpbmRleCAiICsgaW5kZXgpOwogCi0JTGlzdDxJdGVtPiB2ID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOworCUxpc3Q8SXRlbT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCUl0ZW0gaSA9IG51bGw7CisJc2tpcFNwYWNlcygpOwogCWRvIHsKLQkgICAgaW5kZXgrKzsgLy8gc2tpcCAnKCcsIG9yIFNQQUNFCiAKIAkgICAgaWYgKGluZGV4ID49IHNpemUpCiAJCXRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKApAQCAtMjE3LDkgKzIxNiw4IEBACiAJCXRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKAogCQkgICAgImVycm9yIGluIEZFVENIIHBhcnNpbmcsIHVucmVjb2duaXplZCBpdGVtIGF0IGluZGV4ICIgKwogCQkgICAgaW5kZXggKyAiLCBzdGFydHMgd2l0aCBcIiIgKyBuZXh0MjAoKSArICJcIiIpOwotCX0gd2hpbGUgKGJ1ZmZlcltpbmRleF0gIT0gJyknKTsKKwl9IHdoaWxlICghaXNOZXh0Tm9uU3BhY2UoJyknKSk7CiAKLQlpbmRleCsrOyAvLyBza2lwICcpJwogCWl0ZW1zID0gdi50b0FycmF5KG5ldyBJdGVtW3Yuc2l6ZSgpXSk7CiAgICAgfQogCkBAIC0yMjgsNyArMjI2LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBuZXh0MjAoKSB7CiAJaWYgKGluZGV4ICsgMjAgPiBzaXplKQotCSAgICByZXR1cm4gQVNDSUlVdGlsaXR5LnRvU3RyaW5nKGJ1ZmZlciwgaW5kZXgsIGluZGV4ICsgc2l6ZSk7CisJICAgIHJldHVybiBBU0NJSVV0aWxpdHkudG9TdHJpbmcoYnVmZmVyLCBpbmRleCwgc2l6ZSk7CiAJZWxzZQogCSAgICByZXR1cm4gQVNDSUlVdGlsaXR5LnRvU3RyaW5nKGJ1ZmZlciwgaW5kZXgsIGluZGV4ICsgMjApICsgIi4uLiI7CiAgICAgfQpAQCAtMjk4LDcgKzI5Niw3IEBACiAJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXRlbXMubGVuZ3RoOyBpKyspIHsKIAkgICAgaWYgKG1hdGNoKGZpdGVtc1tpXS5nZXROYW1lKCkpKSB7CiAJCWlmIChleHRlbnNpb25JdGVtcyA9PSBudWxsKQotCQkgICAgZXh0ZW5zaW9uSXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJICAgIGV4dGVuc2lvbkl0ZW1zID0gbmV3IEhhc2hNYXA8PigpOwogCQlleHRlbnNpb25JdGVtcy5wdXQoZml0ZW1zW2ldLmdldE5hbWUoKSwKIAkJCQkgICAgZml0ZW1zW2ldLnBhcnNlSXRlbSh0aGlzKSk7CiAJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lELmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSUQuamF2YQppbmRleCA3YmJlMmQxLi5lNzViMGExIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSUQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSUQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc1LDcgKzc1LDcgQEAKIAlpZiAoYyAhPSAnKCcpCiAJICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyAnKCcgYXQgc3RhcnQgb2YgSUQiKTsKIAotCXNlcnZlclBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCXNlcnZlclBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogCVN0cmluZ1tdIHYgPSByLnJlYWRTdHJpbmdMaXN0KCk7CiAJaWYgKHYgIT0gbnVsbCkgewpAQCAtMTEyLDcgKzExMiw3IEBACiAJQXJndW1lbnQgbGlzdCA9IG5ldyBBcmd1bWVudCgpOwogCS8vIGFkZCBwYXJhbXMgdG8gbGlzdAogCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogY2xpZW50UGFyYW1zLmVudHJ5U2V0KCkpIHsKLQkgICAgbGlzdC53cml0ZU5TdHJpbmcoZS5nZXRLZXkoKSk7CisJICAgIGxpc3Qud3JpdGVOU3RyaW5nKGUuZ2V0S2V5KCkpOwkvLyBhc3N1bWUgdGhlc2UgYXJlIEFTQ0lJIG9ubHkKIAkgICAgbGlzdC53cml0ZU5TdHJpbmcoZS5nZXRWYWx1ZSgpKTsKIAl9CiAJYXJnLndyaXRlQXJndW1lbnQobGlzdCk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFByb3RvY29sLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFByb3RvY29sLmphdmEKaW5kZXggMjI1MmMyYS4uYWFjYjcwMyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBQcm90b2NvbC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JTUFQUHJvdG9jb2wuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ1LDEyICs0NSwxNiBAQAogaW1wb3J0IGphdmEudGV4dC4qOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQgamF2YXgubWFpbC4qOwogaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuKjsKIGltcG9ydCBqYXZheC5tYWlsLnNlYXJjaC4qOwogCi1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Qcm9wVXRpbDsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NYWlsTG9nZ2VyOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5CQVNFNjRFbmNvZGVyU3RyZWFtOwogaW1wb3J0IGNvbS5zdW4ubWFpbC5pYXAuKjsKIGltcG9ydCBjb20uc3VuLm1haWwuYXV0aC5OdGxtOwogCkBAIC05MSw2ICs5NSw3IEBACiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXV0aG1lY2hzOwogICAgIC8vIFdBUk5JTkc6IGF1dGhtZWNocyBtYXkgYmUgaW5pdGlhbGl6ZWQgYXMgYSByZXN1bHQgb2Ygc3VwZXJjbGFzcwogICAgIC8vCQljb25zdHJ1Y3RvciwgZG9uJ3QgaW5pdGlhbGl6ZSBpdCBoZXJlLgorICAgIHByaXZhdGUgYm9vbGVhbiB1dGY4OwkJLy8gVVRGLTggc3VwcG9ydCBlbmFibGVkPwogCiAgICAgcHJvdGVjdGVkIFNlYXJjaFNlcXVlbmNlIHNlYXJjaFNlcXVlbmNlOwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZWFyY2hDaGFyc2V0czsgCS8vIGFycmF5IG9mIHNlYXJjaCBjaGFyc2V0cwpAQCAtMTc4LDcgKzE4Myw3IEBACiAJICAgICFQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsICJtYWlsLmRlYnVnLmF1dGgiLCBmYWxzZSk7CiAKIAlpZiAoY2FwYWJpbGl0aWVzID09IG51bGwpCi0JICAgIGNhcGFiaWxpdGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCSAgICBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKIAlzZWFyY2hDaGFyc2V0cyA9IG5ldyBTdHJpbmdbMl07IC8vIDIsIGZvciBub3cuCiAJc2VhcmNoQ2hhcnNldHNbMF0gPSAiVVRGLTgiOwpAQCAtMjEzLDI0ICsyMTgsMzggQEAKIAlSZXNwb25zZVtdIHIgPSBjb21tYW5kKCJDQVBBQklMSVRZIiwgbnVsbCk7CiAJUmVzcG9uc2UgcmVzcG9uc2UgPSByW3IubGVuZ3RoLTFdOwogCi0JaWYgKHJlc3BvbnNlLmlzT0soKSkgewotCSAgICBjYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oMTApOwotCSAgICBhdXRobWVjaHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oNSk7Ci0JICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICghKHJbaV0gaW5zdGFuY2VvZiBJTUFQUmVzcG9uc2UpKQotCQkgICAgY29udGludWU7CisJaWYgKHJlc3BvbnNlLmlzT0soKSkKKwkgICAgaGFuZGxlQ2FwYWJpbGl0eVJlc3BvbnNlKHIpOworCWhhbmRsZVJlc3VsdChyZXNwb25zZSk7CisgICAgfQogCi0JCUlNQVBSZXNwb25zZSBpciA9IChJTUFQUmVzcG9uc2UpcltpXTsKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYW55IHVudGFnZ2VkIENBUEFCSUxJVFkgcmVzcG9uc2UgaW4gdGhlIFJlc3BvbnNlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtCXIJdGhlIHJlc3BvbnNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNhcGFiaWxpdHlSZXNwb25zZShSZXNwb25zZVtdIHIpIHsKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwlmb3IgKGludCBpID0gMCwgbGVuID0gci5sZW5ndGg7IGkgPCBsZW47IGkrKykgeworCSAgICBpZiAoIShyW2ldIGluc3RhbmNlb2YgSU1BUFJlc3BvbnNlKSkKKwkJY29udGludWU7CiAKLQkJLy8gSGFuZGxlICphbGwqIHVudGFnZ2VkIENBUEFCSUxJVFkgcmVzcG9uc2VzLgotCQkvLyAgIFRob3VnaCB0aGUgc3BlYyBzZWVtaW5nbHkgc3RhdGVzIHRoYXQgb25seQotCQkvLyBvbmUgQ0FQQUJJTElUWSByZXNwb25zZSBzdHJpbmcgaXMgYWxsb3dlZCAoNi4xLjEpLAotCQkvLyBzb21lIHNlcnZlciB2ZW5kb3JzIGNsYWltIG90aGVyd2lzZS4KLQkJaWYgKGlyLmtleUVxdWFscygiQ0FQQUJJTElUWSIpKQotCQkgICAgcGFyc2VDYXBhYmlsaXRpZXMoaXIpOworCSAgICBJTUFQUmVzcG9uc2UgaXIgPSAoSU1BUFJlc3BvbnNlKXJbaV07CisKKwkgICAgLy8gSGFuZGxlICphbGwqIHVudGFnZ2VkIENBUEFCSUxJVFkgcmVzcG9uc2VzLgorCSAgICAvLyBUaG91Z2ggdGhlIHNwZWMgc2VlbWluZ2x5IHN0YXRlcyB0aGF0IG9ubHkKKwkgICAgLy8gb25lIENBUEFCSUxJVFkgcmVzcG9uc2Ugc3RyaW5nIGlzIGFsbG93ZWQgKDYuMS4xKSwKKwkgICAgLy8gc29tZSBzZXJ2ZXIgdmVuZG9ycyBjbGFpbSBvdGhlcndpc2UuCisJICAgIGlmIChpci5rZXlFcXVhbHMoIkNBUEFCSUxJVFkiKSkgeworCQlpZiAoZmlyc3QpIHsKKwkJICAgIC8vIGNsZWFyIG91dCBjdXJyZW50IHdoZW4gZmlyc3QgcmVzcG9uc2Ugc2VlbgorCQkgICAgY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8PigxMCk7CisJCSAgICBhdXRobWVjaHMgPSBuZXcgQXJyYXlMaXN0PD4oNSk7CisJCSAgICBmaXJzdCA9IGZhbHNlOworCQl9CisJCXBhcnNlQ2FwYWJpbGl0aWVzKGlyKTsKIAkgICAgfQogCX0KLQloYW5kbGVSZXN1bHQocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQ5LDggKzI2OCw4IEBACiAJcyA9IHIucmVhZEF0b20oKTsKIAlpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZSgiQ0FQQUJJTElUWSIpKQogCSAgICByZXR1cm47Ci0JY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDEwKTsKLQlhdXRobWVjaHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oNSk7CisJY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8PigxMCk7CisJYXV0aG1lY2hzID0gbmV3IEFycmF5TGlzdDw+KDUpOwogCXBhcnNlQ2FwYWJpbGl0aWVzKHIpOwogICAgIH0KIApAQCAtMjk1LDYgKzMxNCw3IEBACiAgICAgICogQHBhcmFtCXIJdGhlIGdyZWV0aW5nIHJlc3BvbnNlCiAgICAgICogQGV4Y2VwdGlvbglQcm90b2NvbEV4Y2VwdGlvbglmb3IgcHJvdG9jb2wgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzR3JlZXRpbmcoUmVzcG9uc2UgcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAlpZiAoci5pc0JZRSgpKSB7CiAJICAgIGNoZWNrUmVmZXJyYWwocik7CS8vIG1heSB0aHJvdyBleGNlcHRpb24KQEAgLTM3Myw2ICszOTMsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybgl0cnVlIGlmIG5vbi1zeW5jaHJvbml6aW5nIGxpdGVyYWxzIGFyZSBzdXBwb3J0ZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vblN5bmNMaXRlcmFscygpIHsKIAlyZXR1cm4gaGFzQ2FwYWJpbGl0eSgiTElURVJBTCsiKTsKICAgICB9CkBAIC0zODQsNiArNDA1LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCWZvciBJL08gZXJyb3JzCiAgICAgICogQGV4Y2VwdGlvbglQcm90b2NvbEV4Y2VwdGlvbglmb3IgcHJvdG9jb2wgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUmVzcG9uc2UgcmVhZFJlc3BvbnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJLy8gYXNzZXJ0IFRocmVhZC5ob2xkc0xvY2sodGhpcyk7CiAJLy8gY2FuJ3QgYXNzZXJ0IGJlY2F1c2UgaXQncyBjYWxsZWQgZnJvbSBjb25zdHJ1Y3RvcgpAQCAtNDI1LDExICs0NDcsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBzZXJ2ZXIgc3VwcG9ydCBVVEYtOD8KKyAgICAgKgorICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjYuMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXRmOCgpIHsKKwlyZXR1cm4gdXRmODsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDbG9zZSBzb2NrZXQgY29ubmVjdGlvbi4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIGp1c3QgbWFrZXMgdGhlIFByb3RvY29sLmRpc2Nvbm5lY3QoKSBtZXRob2QKICAgICAgKiBwdWJsaWMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKIAlzdXBlci5kaXNjb25uZWN0KCk7CiAJYXV0aGVudGljYXRlZCA9IGZhbHNlOwkvLyBqdXN0IGluIGNhc2UKQEAgLTQ4OSw2ICs1MjEsOSBAQAogCSAgICByZXN1bWVUcmFjaW5nKCk7CiAJfQogCisJLy8gaGFuZGxlIGFuIGlsbGVnYWwgYnV0IG5vdCB1bmNvbW1vbiB1bnRhZ2dlZCBDQVBBQklMVFkgcmVzcG9uc2UKKwloYW5kbGVDYXBhYmlsaXR5UmVzcG9uc2Uocik7CisKIAkvLyBkaXNwYXRjaCB1bnRhZ2dlZCByZXNwb25zZXMKIAlub3RpZnlSZXNwb25zZUhhbmRsZXJzKHIpOwogCkBAIC01MTIsNyArNTQ3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYXV0aGxvZ2luKFN0cmluZyB1LCBTdHJpbmcgcCkKIAkJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAlTdHJpbmcgdGFnID0gbnVsbDsKIAlSZXNwb25zZSByID0gbnVsbDsKIAlib29sZWFuIGRvbmUgPSBmYWxzZTsKQEAgLTU2Nyw3ICs2MDIsNyBAQAogCQkJcyA9IHA7CiAJCSAgICAKIAkJICAgIC8vIG9idGFpbiBiNjQgZW5jb2RlZCBieXRlcwotCQkgICAgYjY0b3Mud3JpdGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHMpKTsKKwkJICAgIGI2NG9zLndyaXRlKHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCQkgICAgYjY0b3MuZmx1c2goKTsgCS8vIGNvbXBsZXRlIHRoZSBlbmNvZGluZwogCiAJCSAgICBib3Mud3JpdGUoQ1JMRik7IAkvLyBDUkxGIHRlcm1pbmF0aW9uCkBAIC01OTIsMTMgKzYyNywxOCBAQAogCSAgICByZXN1bWVUcmFjaW5nKCk7CiAJfQogCi0JLyogRGlzcGF0Y2ggdW50YWdnZWQgcmVzcG9uc2VzLgorCVJlc3BvbnNlW10gcmVzcG9uc2VzID0gdi50b0FycmF5KG5ldyBSZXNwb25zZVt2LnNpemUoKV0pOworCisJLy8gaGFuZGxlIGFuIGlsbGVnYWwgYnV0IG5vdCB1bmNvbW1vbiB1bnRhZ2dlZCBDQVBBQklMVFkgcmVzcG9uc2UKKwloYW5kbGVDYXBhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2VzKTsKKworCS8qCisJICogRGlzcGF0Y2ggdW50YWdnZWQgcmVzcG9uc2VzLgogCSAqIE5PVEU6IGluIG91ciBjdXJyZW50IHVwcGVyIGxldmVsIElNQVAgY2xhc3Nlcywgd2UgYWRkIHRoZQogCSAqIHJlc3BvbnNlSGFuZGxlciB0byB0aGUgUHJvdG9jb2wgb2JqZWN0IG9ubHkgKmFmdGVyKiB0aGUgCiAJICogY29ubmVjdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLiBTbywgZm9yIG5vdywgdGhlIGJlbG93CiAJICogY29kZSByZWFsbHkgZW5kcyB1cCBiZWluZyBqdXN0IGEgbm8tb3AuCiAJICovCi0JUmVzcG9uc2VbXSByZXNwb25zZXMgPSB2LnRvQXJyYXkobmV3IFJlc3BvbnNlW3Yuc2l6ZSgpXSk7CiAJbm90aWZ5UmVzcG9uc2VIYW5kbGVycyhyZXNwb25zZXMpOwogCiAJLy8gSGFuZGxlIHRoZSBmaW5hbCBPSywgTk8sIEJBRCBvciBCWUUgcmVzcG9uc2UKQEAgLTYyNiw3ICs2NjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhdXRocGxhaW4oU3RyaW5nIGF1dGh6aWQsIFN0cmluZyB1LCBTdHJpbmcgcCkKIAkJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAlTdHJpbmcgdGFnID0gbnVsbDsKIAlSZXNwb25zZSByID0gbnVsbDsKIAlib29sZWFuIGRvbmUgPSBmYWxzZTsKQEAgLTY3Nyw3ICs3MTcsNyBAQAogCQkJCSAgICBudWxsQnl0ZSArIHUgKyBudWxsQnl0ZSArIHA7CiAKIAkJICAgIC8vIG9idGFpbiBiNjQgZW5jb2RlZCBieXRlcwotCQkgICAgYjY0b3Mud3JpdGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHMpKTsKKwkJICAgIGI2NG9zLndyaXRlKHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCQkgICAgYjY0b3MuZmx1c2goKTsgCS8vIGNvbXBsZXRlIHRoZSBlbmNvZGluZwogCiAJCSAgICBib3Mud3JpdGUoQ1JMRik7IAkvLyBDUkxGIHRlcm1pbmF0aW9uCkBAIC03MDIsMTMgKzc0MiwxOCBAQAogCSAgICByZXN1bWVUcmFjaW5nKCk7CiAJfQogCi0JLyogRGlzcGF0Y2ggdW50YWdnZWQgcmVzcG9uc2VzLgorCVJlc3BvbnNlW10gcmVzcG9uc2VzID0gdi50b0FycmF5KG5ldyBSZXNwb25zZVt2LnNpemUoKV0pOworCisJLy8gaGFuZGxlIGFuIGlsbGVnYWwgYnV0IG5vdCB1bmNvbW1vbiB1bnRhZ2dlZCBDQVBBQklMVFkgcmVzcG9uc2UKKwloYW5kbGVDYXBhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2VzKTsKKworCS8qCisJICogRGlzcGF0Y2ggdW50YWdnZWQgcmVzcG9uc2VzLgogCSAqIE5PVEU6IGluIG91ciBjdXJyZW50IHVwcGVyIGxldmVsIElNQVAgY2xhc3Nlcywgd2UgYWRkIHRoZQogCSAqIHJlc3BvbnNlSGFuZGxlciB0byB0aGUgUHJvdG9jb2wgb2JqZWN0IG9ubHkgKmFmdGVyKiB0aGUKIAkgKiBjb25uZWN0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQuIFNvLCBmb3Igbm93LCB0aGUgYmVsb3cKIAkgKiBjb2RlIHJlYWxseSBlbmRzIHVwIGJlaW5nIGp1c3QgYSBuby1vcC4KIAkgKi8KLQlSZXNwb25zZVtdIHJlc3BvbnNlcyA9IHYudG9BcnJheShuZXcgUmVzcG9uc2Vbdi5zaXplKCldKTsKIAlub3RpZnlSZXNwb25zZUhhbmRsZXJzKHJlc3BvbnNlcyk7CiAKIAkvLyBIYW5kbGUgdGhlIGZpbmFsIE9LLCBOTywgQkFEIG9yIEJZRSByZXNwb25zZQpAQCAtNzM1LDcgKzc4MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGF1dGhudGxtKFN0cmluZyBhdXRoemlkLCBTdHJpbmcgdSwgU3RyaW5nIHApCiAJCQkJdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQlMaXN0PFJlc3BvbnNlPiB2ID0gbmV3IEFycmF5TGlzdDxSZXNwb25zZT4oKTsKKwlMaXN0PFJlc3BvbnNlPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJU3RyaW5nIHRhZyA9IG51bGw7CiAJUmVzcG9uc2UgciA9IG51bGw7CiAJYm9vbGVhbiBkb25lID0gZmFsc2U7CkBAIC03NzgsNyArODIzLDcgQEAKIAkJCXMgPSBudGxtLmdlbmVyYXRlVHlwZTNNc2coci5nZXRSZXN0KCkpOwogCQkgICAgfQogIAotCQkgICAgb3Mud3JpdGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHMpKTsKKwkJICAgIG9zLndyaXRlKHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCQkgICAgb3Mud3JpdGUoQ1JMRik7IAkvLyBDUkxGIHRlcm1pbmF0aW9uCiAJCSAgICBvcy5mbHVzaCgpOyAJLy8gZmx1c2ggdGhlIHN0cmVhbQogCQl9IGVsc2UgaWYgKHIuaXNUYWdnZWQoKSAmJiByLmdldFRhZygpLmVxdWFscyh0YWcpKQpAQCAtNzk5LDYgKzg0NCwxMSBAQAogCSAgICByZXN1bWVUcmFjaW5nKCk7CiAJfQogCisJUmVzcG9uc2VbXSByZXNwb25zZXMgPSB2LnRvQXJyYXkobmV3IFJlc3BvbnNlW3Yuc2l6ZSgpXSk7CisKKwkvLyBoYW5kbGUgYW4gaWxsZWdhbCBidXQgbm90IHVuY29tbW9uIHVudGFnZ2VkIENBUEFCSUxUWSByZXNwb25zZQorCWhhbmRsZUNhcGFiaWxpdHlSZXNwb25zZShyZXNwb25zZXMpOworCiAJLyoKIAkgKiBEaXNwYXRjaCB1bnRhZ2dlZCByZXNwb25zZXMuCiAJICogTk9URTogaW4gb3VyIGN1cnJlbnQgdXBwZXIgbGV2ZWwgSU1BUCBjbGFzc2VzLCB3ZSBhZGQgdGhlCkBAIC04MDYsNyArODU2LDYgQEAKIAkgKiBjb25uZWN0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQuIFNvLCBmb3Igbm93LCB0aGUgYmVsb3cKIAkgKiBjb2RlIHJlYWxseSBlbmRzIHVwIGJlaW5nIGp1c3QgYSBuby1vcC4KIAkgKi8KLQlSZXNwb25zZVtdIHJlc3BvbnNlcyA9IHYudG9BcnJheShuZXcgUmVzcG9uc2Vbdi5zaXplKCldKTsKIAlub3RpZnlSZXNwb25zZUhhbmRsZXJzKHJlc3BvbnNlcyk7CiAKIAkvLyBIYW5kbGUgdGhlIGZpbmFsIE9LLCBOTywgQkFEIG9yIEJZRSByZXNwb25zZQpAQCAtODMyLDcgKzg4MSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGF1dGhvYXV0aDIoU3RyaW5nIHUsIFN0cmluZyBwKQogCQkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8UmVzcG9uc2U+KCk7CisJTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCVN0cmluZyB0YWcgPSBudWxsOwogCVJlc3BvbnNlIHIgPSBudWxsOwogCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwpAQCAtODUwLDcgKzg5OSw3IEBACiAJICAgIGlmIChoYXNDYXBhYmlsaXR5KCJTQVNMLUlSIikpIHsKIAkJU3RyaW5nIHJlc3AgPSAidXNlcj0iICsgdSArICJcMDAxYXV0aD1CZWFyZXIgIiArIHAgKyAiXDAwMVwwMDEiOwogCQlieXRlW10gYmEgPSBCQVNFNjRFbmNvZGVyU3RyZWFtLmVuY29kZSgKLQkJCQkJCUFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhyZXNwKSk7CisJCQkJICAgIHJlc3AuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCQlTdHJpbmcgaXJzID0gQVNDSUlVdGlsaXR5LnRvU3RyaW5nKGJhLCAwLCBiYS5sZW5ndGgpOwogCQlhcmdzLndyaXRlQXRvbShpcnMpOwogCSAgICB9CkBAIC04NzEsNyArOTIwLDcgQEAKIAkJICAgIFN0cmluZyByZXNwID0gInVzZXI9IiArIHUgKyAiXDAwMWF1dGg9QmVhcmVyICIgKwogCQkJCSAgICBwICsgIlwwMDFcMDAxIjsKIAkJICAgIGJ5dGVbXSBiID0gQkFTRTY0RW5jb2RlclN0cmVhbS5lbmNvZGUoCi0JCQkJCQlBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXMocmVzcCkpOworCQkJCSAgICByZXNwLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKIAkJICAgIG9zLndyaXRlKGIpOwkvLyB3cml0ZSBvdXQgcmVzcG9uc2UKIAkJICAgIG9zLndyaXRlKENSTEYpOyAJLy8gQ1JMRiB0ZXJtaW5hdGlvbgogCQkgICAgb3MuZmx1c2goKTsgCS8vIGZsdXNoIHRoZSBzdHJlYW0KQEAgLTg5MywxMyArOTQyLDE4IEBACiAJICAgIHJlc3VtZVRyYWNpbmcoKTsKIAl9CiAKLQkvKiBEaXNwYXRjaCB1bnRhZ2dlZCByZXNwb25zZXMuCisJUmVzcG9uc2VbXSByZXNwb25zZXMgPSB2LnRvQXJyYXkobmV3IFJlc3BvbnNlW3Yuc2l6ZSgpXSk7CisKKwkvLyBoYW5kbGUgYW4gaWxsZWdhbCBidXQgbm90IHVuY29tbW9uIHVudGFnZ2VkIENBUEFCSUxUWSByZXNwb25zZQorCWhhbmRsZUNhcGFiaWxpdHlSZXNwb25zZShyZXNwb25zZXMpOworCisJLyoKKwkgKiBEaXNwYXRjaCB1bnRhZ2dlZCByZXNwb25zZXMuCiAJICogTk9URTogaW4gb3VyIGN1cnJlbnQgdXBwZXIgbGV2ZWwgSU1BUCBjbGFzc2VzLCB3ZSBhZGQgdGhlCiAJICogcmVzcG9uc2VIYW5kbGVyIHRvIHRoZSBQcm90b2NvbCBvYmplY3Qgb25seSAqYWZ0ZXIqIHRoZQogCSAqIGNvbm5lY3Rpb24gaGFzIGJlZW4gYXV0aGVudGljYXRlZC4gU28sIGZvciBub3csIHRoZSBiZWxvdwogCSAqIGNvZGUgcmVhbGx5IGVuZHMgdXAgYmVpbmcganVzdCBhIG5vLW9wLgogCSAqLwotCVJlc3BvbnNlW10gcmVzcG9uc2VzID0gdi50b0FycmF5KG5ldyBSZXNwb25zZVt2LnNpemUoKV0pOwogCW5vdGlmeVJlc3BvbnNlSGFuZGxlcnMocmVzcG9uc2VzKTsKIAogCS8vIEhhbmRsZSB0aGUgZmluYWwgT0ssIE5PLCBCQUQgb3IgQllFIHJlc3BvbnNlCkBAIC05NjEsNyArMTAxNSw3IEBACiAJTGlzdDxTdHJpbmc+IHY7CiAJaWYgKGFsbG93ZWQgIT0gbnVsbCAmJiBhbGxvd2VkLmxlbmd0aCA+IDApIHsKIAkgICAgLy8gcmVtb3ZlIGFueXRoaW5nIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlcgotCSAgICB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFsbG93ZWQubGVuZ3RoKTsKKwkgICAgdiA9IG5ldyBBcnJheUxpc3Q8PihhbGxvd2VkLmxlbmd0aCk7CiAJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dlZC5sZW5ndGg7IGkrKykKIAkJaWYgKGF1dGhtZWNocy5jb250YWlucyhhbGxvd2VkW2ldKSkJLy8gWFhYIC0gY2FzZSBtdXN0IG1hdGNoCiAJCSAgICB2LmFkZChhbGxvd2VkW2ldKTsKQEAgLTEwNjMsNyArMTExNyw3IEBACiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBpZChTdHJpbmcgZ3VpZCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAkvLyBzdXBwb3J0IHRoaXMgZm9yIG5vdywgYnV0IHJlbW92ZSBpdCBzb29uCi0JTWFwPFN0cmluZyxTdHJpbmc+IGdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOworCU1hcDxTdHJpbmcsU3RyaW5nPiBnbWFwID0gbmV3IEhhc2hNYXA8PigpOwogCWdtYXAucHV0KCJHVUlEIiwgZ3VpZCk7CiAJaWQoZ21hcCk7CiAgICAgfQpAQCAtMTEyMSw2ICsxMTc1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRW5jb2RlIGEgbWFpbGJveCBuYW1lIGFwcHJvcHJpYXRlbHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90CisgICAgICogdGhlIHNlcnZlciBzdXBwb3J0cyBVVEYtOCwgYW5kIGFkZCB0aGUgZW5jb2RlZCBuYW1lIHRvIHRoZQorICAgICAqIEFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtCWFyZ3MJdGhlIGFyZ3VtZW50cworICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIHRvIGVuY29kZQorICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjYuMAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlTWFpbGJveE5hbWUoQXJndW1lbnQgYXJncywgU3RyaW5nIG5hbWUpIHsKKwlpZiAodXRmOCkKKwkgICAgYXJncy53cml0ZVN0cmluZyhuYW1lLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwllbHNlCisJICAgIC8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAorCSAgICBhcmdzLndyaXRlU3RyaW5nKEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShuYW1lKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU0VMRUNUIENvbW1hbmQuCiAgICAgICoKICAgICAgKiBAcGFyYW0JbWJveAl0aGUgbWFpbGJveCBuYW1lCkBAIC0xMTQ1LDExICsxMjE2LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWFpbGJveEluZm8gc2VsZWN0KFN0cmluZyBtYm94LCBSZXN5bmNEYXRhIHJkKQogCQkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbWJveCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShtYm94KTsKLQogCUFyZ3VtZW50IGFyZ3MgPSBuZXcgQXJndW1lbnQoKTsJCi0JYXJncy53cml0ZVN0cmluZyhtYm94KTsKKwl3cml0ZU1haWxib3hOYW1lKGFyZ3MsIG1ib3gpOwogCiAJaWYgKHJkICE9IG51bGwpIHsKIAkgICAgaWYgKHJkID09IFJlc3luY0RhdGEuQ09ORFNUT1JFKSB7CkBAIC0xMjEwLDExICsxMjc4LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWFpbGJveEluZm8gZXhhbWluZShTdHJpbmcgbWJveCwgUmVzeW5jRGF0YSByZCkKIAkJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCW1ib3ggPSBCQVNFNjRNYWlsYm94RW5jb2Rlci5lbmNvZGUobWJveCk7Ci0KIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCWlmIChyZCAhPSBudWxsKSB7CiAJICAgIGlmIChyZCA9PSBSZXN5bmNEYXRhLkNPTkRTVE9SRSkgewpAQCAtMTI3Myw4ICsxMzM4LDExIEBACiAJYXJncy53cml0ZUF0b20oY2FwKTsKIAlzaW1wbGVDb21tYW5kKCJFTkFCTEUiLCBhcmdzKTsKIAlpZiAoZW5hYmxlZCA9PSBudWxsKQotCSAgICBlbmFibGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCSAgICBlbmFibGVkID0gbmV3IEhhc2hTZXQ8PigpOwogCWVuYWJsZWQuYWRkKGNhcC50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkpOworCisJLy8gdXBkYXRlIHRoZSB1dGY4IGZsYWcKKwl1dGY4ID0gaXNFbmFibGVkKCJVVEY4PUFDQ0VQVCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyMSwxMSArMTM4OSw4IEBACiAJICAgIC8vIGRvZXMgc3VwcG9ydCB0aGlzLgogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiU1RBVFVTIG5vdCBzdXBwb3J0ZWQiKTsKIAotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCW1ib3ggPSBCQVNFNjRNYWlsYm94RW5jb2Rlci5lbmNvZGUobWJveCk7Ci0KIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCUFyZ3VtZW50IGl0ZW1BcmdzID0gbmV3IEFyZ3VtZW50KCk7CiAJaWYgKGl0ZW1zID09IG51bGwpCkBAIC0xMzcxLDExICsxNDM2LDggQEAKICAgICAgKiBAc2VlICJSRkMyMDYwLCBzZWN0aW9uIDYuMy4zIgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNyZWF0ZShTdHJpbmcgbWJveCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKG1ib3gpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CiAKIAlzaW1wbGVDb21tYW5kKCJDUkVBVEUiLCBhcmdzKTsKICAgICB9CkBAIC0xMzg4LDExICsxNDUwLDggQEAKICAgICAgKiBAc2VlICJSRkMyMDYwLCBzZWN0aW9uIDYuMy40IgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShTdHJpbmcgbWJveCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKG1ib3gpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CiAKIAlzaW1wbGVDb21tYW5kKCJERUxFVEUiLCBhcmdzKTsKICAgICB9CkBAIC0xNDA2LDEzICsxNDY1LDkgQEAKICAgICAgKiBAc2VlICJSRkMyMDYwLCBzZWN0aW9uIDYuMy41IgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgbywgU3RyaW5nIG4pIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbyA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShvKTsKLQluID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG4pOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKG8pOwotCWFyZ3Mud3JpdGVTdHJpbmcobik7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBvKTsKKwl3cml0ZU1haWxib3hOYW1lKGFyZ3MsIG4pOwogCiAJc2ltcGxlQ29tbWFuZCgiUkVOQU1FIiwgYXJncyk7CiAgICAgfQpAQCAtMTQyNiw5ICsxNDgxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoU3RyaW5nIG1ib3gpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCXNpbXBsZUNvbW1hbmQoIlNVQlNDUklCRSIsIGFyZ3MpOwogICAgIH0KQEAgLTE0NDIsOSArMTQ5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoU3RyaW5nIG1ib3gpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCXNpbXBsZUNvbW1hbmQoIlVOU1VCU0NSSUJFIiwgYXJncyk7CiAgICAgfQpAQCAtMTQ5MCwxMyArMTU0MSw5IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3RJbmZvW10gZG9MaXN0KFN0cmluZyBjbWQsIFN0cmluZyByZWYsIFN0cmluZyBwYXQpCiAJCQl0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCXJlZiA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShyZWYpOwotCXBhdCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShwYXQpOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKHJlZik7Ci0JYXJncy53cml0ZVN0cmluZyhwYXQpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgcmVmKTsKKwl3cml0ZU1haWxib3hOYW1lKGFyZ3MsIHBhdCk7CiAKIAlSZXNwb25zZVtdIHIgPSBjb21tYW5kKGNtZCwgYXJncyk7CiAKQEAgLTE1MDQsNyArMTU1MSw3IEBACiAJUmVzcG9uc2UgcmVzcG9uc2UgPSByW3IubGVuZ3RoLTFdOwogCiAJaWYgKHJlc3BvbnNlLmlzT0soKSkgeyAvLyBjb21tYW5kIHN1Y2Nlc2Z1bCAKLQkgICAgTGlzdDxMaXN0SW5mbz4gdiA9IG5ldyBBcnJheUxpc3Q8TGlzdEluZm8+KDEpOworCSAgICBMaXN0PExpc3RJbmZvPiB2ID0gbmV3IEFycmF5TGlzdDw+KDEpOwogCSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gci5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogCQlpZiAoIShyW2ldIGluc3RhbmNlb2YgSU1BUFJlc3BvbnNlKSkKIAkJICAgIGNvbnRpbnVlOwpAQCAtMTU1OSwxMSArMTYwNiw4IEBACiAKICAgICBwdWJsaWMgQXBwZW5kVUlEIGFwcGVuZHVpZChTdHJpbmcgbWJveCwgRmxhZ3MgZiwgRGF0ZSBkLAogCQkJTGl0ZXJhbCBkYXRhLCBib29sZWFuIHVpZCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKG1ib3gpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CiAKIAlpZiAoZiAhPSBudWxsKSB7IC8vIHNldCBGbGFncyBpbiBhcHBlbmRlZCBtZXNzYWdlCiAJICAgIC8vIGNhbid0IHNldCB0aGUgXFJlY2VudCBmbGFnIGluIEFQUEVORApAQCAtMTg0OSw2ICsxODkzLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4JdGhlIGJ1ZmZlciB0byB1c2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQnl0ZUFycmF5IGdldFJlc3BvbnNlQnVmZmVyKCkgewogCUJ5dGVBcnJheSByZXQgPSBiYTsKIAliYSA9IG51bGw7CkBAIC0yMDA0LDcgKzIwNDksNyBAQAogCQkJICAgICAiVUlEIiwgdHJ1ZSk7CQogCiAJVUlEIHU7Ci0JTGlzdDxVSUQ+IHYgPSBuZXcgQXJyYXlMaXN0PFVJRD4oKTsKKwlMaXN0PFVJRD4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCWZvciAoaW50IGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAJICAgIGlmIChyW2ldID09IG51bGwgfHwgIShyW2ldIGluc3RhbmNlb2YgRmV0Y2hSZXNwb25zZSkpCiAJCWNvbnRpbnVlOwpAQCAtMjAzNSw3ICsyMDgwLDcgQEAKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS41LjMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmZXRjaFNlcXVlbmNlTnVtYmVycyhsb25nW10gdWlkcykgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCB1aWRzLmxlbmd0aDsgaSsrKSB7CiAJICAgIGlmIChpID4gMCkKIAkJc2IuYXBwZW5kKCIsIik7CkBAIC0yMDY5LDcgKzIxMTQsNyBAQAogCVJlc3BvbnNlW10gciA9IGNvbW1hbmQoIlVJRCBGRVRDSCAiICsgbXNnU2VxdWVuY2UgKwogCQkiIChGTEFHUykgKENIQU5HRURTSU5DRSAiICsgU3RyaW5nLnZhbHVlT2YobW9kc2VxKSArICIpIiwgbnVsbCk7CiAKLQlMaXN0PEludGVnZXI+IHYgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisJTGlzdDxJbnRlZ2VyPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJZm9yIChpbnQgaSA9IDAsIGxlbiA9IHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKIAkgICAgaWYgKHJbaV0gPT0gbnVsbCB8fCAhKHJbaV0gaW5zdGFuY2VvZiBGZXRjaFJlc3BvbnNlKSkKIAkJY29udGludWU7CkBAIC0yMTczLDEyICsyMjE4LDEwIEBACiAJCQkJdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAlpZiAodWlkICYmICFoYXNDYXBhYmlsaXR5KCJVSURQTFVTIikpIAogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiVUlEUExVUyBub3Qgc3VwcG9ydGVkIik7Ci0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbWJveCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShtYm94KTsKIAogCUFyZ3VtZW50IGFyZ3MgPSBuZXcgQXJndW1lbnQoKTsJCiAJYXJncy53cml0ZUF0b20obXNnU2VxdWVuY2UpOwotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCVJlc3BvbnNlW10gciA9IGNvbW1hbmQoIkNPUFkiLCBhcmdzKTsKIApAQCAtMjI3MSwxMiArMjMxNCwxMCBAQAogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiTU9WRSBub3Qgc3VwcG9ydGVkIik7CiAJaWYgKHVpZCAmJiAhaGFzQ2FwYWJpbGl0eSgiVUlEUExVUyIpKSAKIAkgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRFeGNlcHRpb24oIlVJRFBMVVMgbm90IHN1cHBvcnRlZCIpOwotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCW1ib3ggPSBCQVNFNjRNYWlsYm94RW5jb2Rlci5lbmNvZGUobWJveCk7CiAKIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQogCWFyZ3Mud3JpdGVBdG9tKG1zZ1NlcXVlbmNlKTsKLQlhcmdzLndyaXRlU3RyaW5nKG1ib3gpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CiAKIAlSZXNwb25zZVtdIHIgPSBjb21tYW5kKCJNT1ZFIiwgYXJncyk7CiAKQEAgLTIzNzMsOCArMjQxNCw3IEBACiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNS40CiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVGbGFnTGlzdChGbGFncyBmbGFncykgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlzYi5hcHBlbmQoIigiKTsgLy8gc3RhcnQgb2YgZmxhZ19saXN0CisJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCIoIik7IC8vIHN0YXJ0IG9mIGZsYWdfbGlzdAogCiAJRmxhZ3MuRmxhZ1tdIHNmID0gZmxhZ3MuZ2V0U3lzdGVtRmxhZ3MoKTsgLy8gZ2V0IHRoZSBzeXN0ZW0gZmxhZ3MKIAlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTI0NTMsMTcgKzI0OTMsMjAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludFtdIHNlYXJjaChTdHJpbmcgbXNnU2VxdWVuY2UsIFNlYXJjaFRlcm0gdGVybSkKIAkJCXRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwgU2VhcmNoRXhjZXB0aW9uIHsKLQkvLyBDaGVjayBpZiB0aGUgc2VhcmNoICJ0ZXh0IiB0ZXJtcyBjb250YWluIG9ubHkgQVNDSUkgY2hhcnMKLQlpZiAoU2VhcmNoU2VxdWVuY2UuaXNBc2NpaSh0ZXJtKSkgeworCS8vIENoZWNrIGlmIHRoZSBzZWFyY2ggInRleHQiIHRlcm1zIGNvbnRhaW4gb25seSBBU0NJSSBjaGFycywKKwkvLyBvciBpZiB1dGY4IHN1cHBvcnQgaGFzIGJlZW4gZW5hYmxlZCAoaW4gd2hpY2ggY2FzZSBDSEFSU0VUCisJLy8gaXMgbm90IGFsbG93ZWQ7IHNlZSBSRkMgNjg1NSwgc2VjdGlvbiAzLCBsYXN0IHBhcmFncmFwaCkKKwlpZiAoc3VwcG9ydHNVdGY4KCkgfHwgU2VhcmNoU2VxdWVuY2UuaXNBc2NpaSh0ZXJtKSkgewogCSAgICB0cnkgewogCQlyZXR1cm4gaXNzdWVTZWFyY2gobXNnU2VxdWVuY2UsIHRlcm0sIG51bGwpOwogCSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7IC8qIHdpbGwgbm90IGhhcHBlbiAqLyB9CiAJfQogCiAJLyoKLQkgKiBUaGUgc2VhcmNoICJ0ZXh0IiB0ZXJtcyBkbyBjb250YWluIG5vbi1BU0NJSSBjaGFycy4gV2UgbmVlZCB0bwotCSAqIHVzZSBTRUFSQ0ggQ0hBUlNFVCA8Y2hhcnNldD4gLi4uCi0JICoJVGhlIGNoYXJzZXRzIHdlIHRyeSB0byB1c2UgYXJlIFVURi04IGFuZCB0aGUgbG9jYWxlJ3MKKwkgKiBUaGUgc2VhcmNoICJ0ZXh0IiB0ZXJtcyBkbyBjb250YWluIG5vbi1BU0NJSSBjaGFycyBhbmQgdXRmOAorCSAqIHN1cHBvcnQgaGFzIG5vdCBiZWVuIGVuYWJsZWQuICBXZSBuZWVkIHRvIHVzZToKKwkgKiAiU0VBUkNIIENIQVJTRVQgPGNoYXJzZXQ+IC4uLiIKKwkgKiBUaGUgY2hhcnNldHMgd2UgdHJ5IHRvIHVzZSBhcmUgVVRGLTggYW5kIHRoZSBsb2NhbGUncwogCSAqIGRlZmF1bHQgY2hhcnNldC4gSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBVVEYtOCwgZ3JlYXQsIAogCSAqIGFsd2F5cyB1c2UgaXQuIEVsc2Ugd2UgdHJ5IHRvIHVzZSB0aGUgZGVmYXVsdCBjaGFyc2V0LgogCSAqLwpAQCAtMjUyNiw3ICsyNTY5LDcgQEAKIAogCS8vIEdyYWIgYWxsIFNFQVJDSCByZXNwb25zZXMKIAlpZiAocmVzcG9uc2UuaXNPSygpKSB7IC8vIGNvbW1hbmQgc3VjY2VzZnVsCi0JICAgIExpc3Q8SW50ZWdlcj4gdiA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkgICAgTGlzdDxJbnRlZ2VyPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJICAgIGludCBudW07CiAJICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAJCWlmICghKHJbaV0gaW5zdGFuY2VvZiBJTUFQUmVzcG9uc2UpKQpAQCAtMjU2Niw3ICsyNjA5LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2VhcmNoU2VxdWVuY2UgZ2V0U2VhcmNoU2VxdWVuY2UoKSB7CiAJaWYgKHNlYXJjaFNlcXVlbmNlID09IG51bGwpCi0JICAgIHNlYXJjaFNlcXVlbmNlID0gbmV3IFNlYXJjaFNlcXVlbmNlKCk7CisJICAgIHNlYXJjaFNlcXVlbmNlID0gbmV3IFNlYXJjaFNlcXVlbmNlKHRoaXMpOwogCXJldHVybiBzZWFyY2hTZXF1ZW5jZTsKICAgICB9CiAKQEAgLTI2MTgsNyArMjY2MSw3IEBACiAKIAkvLyBHcmFiIGFsbCBTT1JUIHJlc3BvbnNlcwogCWlmIChyZXNwb25zZS5pc09LKCkpIHsgLy8gY29tbWFuZCBzdWNjZXNmdWwKLQkgICAgTGlzdDxJbnRlZ2VyPiB2ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCSAgICBMaXN0PEludGVnZXI+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkgICAgaW50IG51bTsKIAkgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKIAkJaWYgKCEocltpXSBpbnN0YW5jZW9mIElNQVBSZXNwb25zZSkpCkBAIC0yNjk4LDE3ICsyNzQxLDE0IEBACiAJaWYgKCFoYXNDYXBhYmlsaXR5KCJRVU9UQSIpKSAKIAkgICAgdGhyb3cgbmV3IEJhZENvbW1hbmRFeGNlcHRpb24oIkdFVFFVT1RBUk9PVCBub3Qgc3VwcG9ydGVkIik7CiAKLQkvLyBlbmNvZGUgdGhlIG1ib3ggYXMgcGVyIFJGQzIwNjAKLQltYm94ID0gQkFTRTY0TWFpbGJveEVuY29kZXIuZW5jb2RlKG1ib3gpOwotCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKG1ib3gpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CiAKIAlSZXNwb25zZVtdIHIgPSBjb21tYW5kKCJHRVRRVU9UQVJPT1QiLCBhcmdzKTsKIAogCVJlc3BvbnNlIHJlc3BvbnNlID0gcltyLmxlbmd0aC0xXTsKIAotCU1hcDxTdHJpbmcsIFF1b3RhPiB0YWIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFF1b3RhPigpOworCU1hcDxTdHJpbmcsIFF1b3RhPiB0YWIgPSBuZXcgSGFzaE1hcDw+KCk7CiAKIAkvLyBHcmFiIGFsbCBRVU9UQVJPT1QgYW5kIFFVT1RBIHJlc3BvbnNlcwogCWlmIChyZXNwb25zZS5pc09LKCkpIHsgLy8gY29tbWFuZCBzdWNjZXNmdWwgCkBAIC0yNzcxLDEyICsyODExLDEyIEBACiAJICAgIHRocm93IG5ldyBCYWRDb21tYW5kRXhjZXB0aW9uKCJRVU9UQSBub3Qgc3VwcG9ydGVkIik7CiAKIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQotCWFyZ3Mud3JpdGVTdHJpbmcocm9vdCk7CisJYXJncy53cml0ZVN0cmluZyhyb290KTsJCS8vIFhYWCAtIGNvdWxkIGJlIFVURi04PwogCiAJUmVzcG9uc2VbXSByID0gY29tbWFuZCgiR0VUUVVPVEEiLCBhcmdzKTsKIAogCVF1b3RhIHF1b3RhID0gbnVsbDsKLQlMaXN0PFF1b3RhPiB2ID0gbmV3IEFycmF5TGlzdDxRdW90YT4oKTsKKwlMaXN0PFF1b3RhPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJUmVzcG9uc2UgcmVzcG9uc2UgPSByW3IubGVuZ3RoLTFdOwogCiAJLy8gR3JhYiBhbGwgUVVPVEEgcmVzcG9uc2VzCkBAIC0yODE0LDcgKzI4NTQsNyBAQAogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiUVVPVEEgbm90IHN1cHBvcnRlZCIpOwogCiAJQXJndW1lbnQgYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKLQlhcmdzLndyaXRlU3RyaW5nKHF1b3RhLnF1b3RhUm9vdCk7CisJYXJncy53cml0ZVN0cmluZyhxdW90YS5xdW90YVJvb3QpOwkvLyBYWFggLSBjb3VsZCBiZSBVVEYtOD8KIAlBcmd1bWVudCBxYXJncyA9IG5ldyBBcmd1bWVudCgpOwkKIAlpZiAocXVvdGEucmVzb3VyY2VzICE9IG51bGwpIHsKIAkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdW90YS5yZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKQEAgLTI4NzEsOCArMjkxMSw4IEBACiAJaWYgKHIucmVhZEJ5dGUoKSAhPSAnKCcpCiAJICAgIHRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCJwYXJzZSBlcnJvciBpbiBRVU9UQSIpOwogCi0JTGlzdDxRdW90YS5SZXNvdXJjZT4gdiA9IG5ldyBBcnJheUxpc3Q8UXVvdGEuUmVzb3VyY2U+KCk7Ci0Jd2hpbGUgKHIucGVla0J5dGUoKSAhPSAnKScpIHsKKwlMaXN0PFF1b3RhLlJlc291cmNlPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJd2hpbGUgKCFyLmlzTmV4dE5vblNwYWNlKCcpJykpIHsKIAkgICAgLy8gcXVvdGFfcmVzb3VyY2UgOjo9IGF0b20gU1AgbnVtYmVyIFNQIG51bWJlcgogCSAgICBTdHJpbmcgbmFtZSA9IHIucmVhZEF0b20oKTsKIAkgICAgaWYgKG5hbWUgIT0gbnVsbCkgewpAQCAtMjg4Miw3ICsyOTIyLDYgQEAKIAkJdi5hZGQocmVzKTsKIAkgICAgfQogCX0KLQlyLnJlYWRCeXRlKCk7CiAJcS5yZXNvdXJjZXMgPSB2LnRvQXJyYXkobmV3IFF1b3RhLlJlc291cmNlW3Yuc2l6ZSgpXSk7CiAJcmV0dXJuIHE7CiAgICAgfQpAQCAtMjkwMiwxMSArMjk0MSw4IEBACiAJaWYgKCFoYXNDYXBhYmlsaXR5KCJBQ0wiKSkgCiAJICAgIHRocm93IG5ldyBCYWRDb21tYW5kRXhjZXB0aW9uKCJBQ0wgbm90IHN1cHBvcnRlZCIpOwogCi0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbWJveCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShtYm94KTsKLQogCUFyZ3VtZW50IGFyZ3MgPSBuZXcgQXJndW1lbnQoKTsJCi0JYXJncy53cml0ZVN0cmluZyhtYm94KTsKKwl3cml0ZU1haWxib3hOYW1lKGFyZ3MsIG1ib3gpOwogCWFyZ3Mud3JpdGVTdHJpbmcoYWNsLmdldE5hbWUoKSk7CiAJU3RyaW5nIHJpZ2h0cyA9IGFjbC5nZXRSaWdodHMoKS50b1N0cmluZygpOwogCWlmIChtb2RpZmllciA9PSAnKycgfHwgbW9kaWZpZXIgPT0gJy0nKQpAQCAtMjkzMywxMiArMjk2OSw5IEBACiAJaWYgKCFoYXNDYXBhYmlsaXR5KCJBQ0wiKSkgCiAJICAgIHRocm93IG5ldyBCYWRDb21tYW5kRXhjZXB0aW9uKCJBQ0wgbm90IHN1cHBvcnRlZCIpOwogCi0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbWJveCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShtYm94KTsKLQogCUFyZ3VtZW50IGFyZ3MgPSBuZXcgQXJndW1lbnQoKTsJCi0JYXJncy53cml0ZVN0cmluZyhtYm94KTsKLQlhcmdzLndyaXRlU3RyaW5nKHVzZXIpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CisJYXJncy53cml0ZVN0cmluZyh1c2VyKTsJCS8vIFhYWCAtIGNvdWxkIGJlIFVURi04PwogCiAJUmVzcG9uc2VbXSByID0gY29tbWFuZCgiREVMRVRFQUNMIiwgYXJncyk7CiAJUmVzcG9uc2UgcmVzcG9uc2UgPSByW3IubGVuZ3RoLTFdOwpAQCAtMjk2MCwxNyArMjk5MywxNCBAQAogCWlmICghaGFzQ2FwYWJpbGl0eSgiQUNMIikpIAogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiQUNMIG5vdCBzdXBwb3J0ZWQiKTsKIAotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCW1ib3ggPSBCQVNFNjRNYWlsYm94RW5jb2Rlci5lbmNvZGUobWJveCk7Ci0KIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCVJlc3BvbnNlW10gciA9IGNvbW1hbmQoIkdFVEFDTCIsIGFyZ3MpOwogCVJlc3BvbnNlIHJlc3BvbnNlID0gcltyLmxlbmd0aC0xXTsKIAogCS8vIEdyYWIgYWxsIEFDTCByZXNwb25zZXMKLQlMaXN0PEFDTD4gdiA9IG5ldyBBcnJheUxpc3Q8QUNMPigpOworCUxpc3Q8QUNMPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJaWYgKHJlc3BvbnNlLmlzT0soKSkgeyAvLyBjb21tYW5kIHN1Y2Nlc2Z1bCAKIAkgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKIAkJaWYgKCEocltpXSBpbnN0YW5jZW9mIElNQVBSZXNwb25zZSkpCkBAIC0zMDE1LDE4ICszMDQ1LDE1IEBACiAJaWYgKCFoYXNDYXBhYmlsaXR5KCJBQ0wiKSkgCiAJICAgIHRocm93IG5ldyBCYWRDb21tYW5kRXhjZXB0aW9uKCJBQ0wgbm90IHN1cHBvcnRlZCIpOwogCi0JLy8gZW5jb2RlIHRoZSBtYm94IGFzIHBlciBSRkMyMDYwCi0JbWJveCA9IEJBU0U2NE1haWxib3hFbmNvZGVyLmVuY29kZShtYm94KTsKLQogCUFyZ3VtZW50IGFyZ3MgPSBuZXcgQXJndW1lbnQoKTsJCi0JYXJncy53cml0ZVN0cmluZyhtYm94KTsKLQlhcmdzLndyaXRlU3RyaW5nKHVzZXIpOworCXdyaXRlTWFpbGJveE5hbWUoYXJncywgbWJveCk7CisJYXJncy53cml0ZVN0cmluZyh1c2VyKTsJCS8vIFhYWCAtIGNvdWxkIGJlIFVURi04PwogCiAJUmVzcG9uc2VbXSByID0gY29tbWFuZCgiTElTVFJJR0hUUyIsIGFyZ3MpOwogCVJlc3BvbnNlIHJlc3BvbnNlID0gcltyLmxlbmd0aC0xXTsKIAogCS8vIEdyYWIgTElTVFJJR0hUUyByZXNwb25zZQotCUxpc3Q8UmlnaHRzPiB2ID0gbmV3IEFycmF5TGlzdDxSaWdodHM+KCk7CisJTGlzdDxSaWdodHM+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAlpZiAocmVzcG9uc2UuaXNPSygpKSB7IC8vIGNvbW1hbmQgc3VjY2VzZnVsIAogCSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gci5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogCQlpZiAoIShyW2ldIGluc3RhbmNlb2YgSU1BUFJlc3BvbnNlKSkKQEAgLTMwNjYsMTEgKzMwOTMsOCBAQAogCWlmICghaGFzQ2FwYWJpbGl0eSgiQUNMIikpIAogCSAgICB0aHJvdyBuZXcgQmFkQ29tbWFuZEV4Y2VwdGlvbigiQUNMIG5vdCBzdXBwb3J0ZWQiKTsKIAotCS8vIGVuY29kZSB0aGUgbWJveCBhcyBwZXIgUkZDMjA2MAotCW1ib3ggPSBCQVNFNjRNYWlsYm94RW5jb2Rlci5lbmNvZGUobWJveCk7Ci0KIAlBcmd1bWVudCBhcmdzID0gbmV3IEFyZ3VtZW50KCk7CQotCWFyZ3Mud3JpdGVTdHJpbmcobWJveCk7CisJd3JpdGVNYWlsYm94TmFtZShhcmdzLCBtYm94KTsKIAogCVJlc3BvbnNlW10gciA9IGNvbW1hbmQoIk1ZUklHSFRTIiwgYXJncyk7CiAJUmVzcG9uc2UgcmVzcG9uc2UgPSByW3IubGVuZ3RoLTFdOwpAQCAtMzEyOSw3ICszMTUzLDcgQEAKIAlpZiAoIWhhc0NhcGFiaWxpdHkoIklETEUiKSkgCiAJICAgIHRocm93IG5ldyBCYWRDb21tYW5kRXhjZXB0aW9uKCJJRExFIG5vdCBzdXBwb3J0ZWQiKTsKIAotCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworCUxpc3Q8UmVzcG9uc2U+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAlib29sZWFuIGRvbmUgPSBmYWxzZTsKIAlSZXNwb25zZSByID0gbnVsbDsKIApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBSZWZlcnJhbEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBSZWZlcnJhbEV4Y2VwdGlvbi5qYXZhCmluZGV4IGFiNTE4Y2QuLjM5M2IxZWQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JTUFQUmVmZXJyYWxFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFJlZmVycmFsRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFJlc3BvbnNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFJlc3BvbnNlLmphdmEKaW5kZXggNzg0YTM4Ny4uNmNjZjBjYSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBSZXNwb25zZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JTUFQUmVzcG9uc2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQyLDcgKzQyLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKIGltcG9ydCBjb20uc3VuLm1haWwuaWFwLio7CiAKIC8qKgpAQCAtOTMsMTUgKzkzLDMxIEBACiAgICAgICogQGV4Y2VwdGlvbglQcm90b2NvbEV4Y2VwdGlvbglmb3IgcHJvdG9jb2wgZmFpbHVyZXMKICAgICAgKi8KICAgICBwdWJsaWMgSU1BUFJlc3BvbnNlKFN0cmluZyByKSB0aHJvd3MgSU9FeGNlcHRpb24sIFByb3RvY29sRXhjZXB0aW9uIHsKLQlzdXBlcihyKTsKKwl0aGlzKHIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciB0ZXN0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtCXIJdGhlIHJlc3BvbnNlIHN0cmluZworICAgICAqIEBwYXJhbQl1dGY4CVVURi04IGFsbG93ZWQ/CisgICAgICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbglmb3IgSS9PIGVycm9ycworICAgICAqIEBleGNlcHRpb24JUHJvdG9jb2xFeGNlcHRpb24JZm9yIHByb3RvY29sIGZhaWx1cmVzCisgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNi4wCisgICAgICovCisgICAgcHVibGljIElNQVBSZXNwb25zZShTdHJpbmcgciwgYm9vbGVhbiB1dGY4KQorCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgUHJvdG9jb2xFeGNlcHRpb24geworCXN1cGVyKHIsIHV0ZjgpOwogCWluaXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgImZsYWdfZXh0ZW5zaW9uIiBzZXF1ZW5jZXMgYW5kIAorICAgICAqIFJlYWQgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCAiZmxhZy1leHRlbnNpb24iIHNlcXVlbmNlcyBhbmQgCiAgICAgICogcmV0dXJuIHRoZSBsaXN0IGFzIGEgYXJyYXkgb2YgU3RyaW5ncy4gQW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZAotICAgICAqIGFzIG51bGwuICBUaGlzIGlzIGFuIElNQVAtaXNtLCBhbmQgcGVyaGFwcyB0aGlzIG1ldGhvZCBzaG91bGQgCi0gICAgICogbW92ZWQgaW50byB0aGUgSU1BUCBsYXllci4KKyAgICAgKiBhcyBudWxsLiAgRWFjaCBpdGVtIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGF0b20sIHBvc3NpYmx5IHByZWNlZWRlZAorICAgICAqIGJ5IGEgYmFja3NsYXNoLCBidXQgd2UgYXJlbid0IHRoYXQgc3RyaWN0OyB3ZSBqdXN0IGxvb2sgZm9yIHN0cmluZ3MKKyAgICAgKiBzZXBhcmF0ZWQgYnkgc3BhY2VzIGFuZCB0ZXJtaW5hdGVkIGJ5IGEgcmlnaHQgcGFyZW4uICBXZSBhc3N1bWUgaXRlbXMKKyAgICAgKiBhcmUgYWx3YXlzIEFTQ0lJLgogICAgICAqCiAgICAgICogQHJldHVybgl0aGUgbGlzdCBpdGVtcyBhcyBhIFN0cmluZyBhcnJheQogICAgICAqLwpAQCAtMTEyLDcgKzEyOCw3IEBACiAJICAgIHJldHVybiBudWxsOwogCWluZGV4Kys7IC8vIHNraXAgJygnCiAKLQlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJaW50IHN0YXJ0OwogCWZvciAoc3RhcnQgPSBpbmRleDsgYnVmZmVyW2luZGV4XSAhPSAnKSc7IGluZGV4KyspIHsKIAkgICAgaWYgKGJ1ZmZlcltpbmRleF0gPT0gJyAnKSB7IC8vIGdvdCBvbmUgaXRlbQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBTYXNsQXV0aGVudGljYXRvci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lNQVBTYXNsQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDUyY2FkNGQuLmQ4ZGY1YTkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JTUFQU2FzbEF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU1BUFNhc2xBdXRoZW50aWNhdG9yLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00OCw3ICs0OCwxMSBAQAogCiBpbXBvcnQgY29tLnN1bi5tYWlsLmlhcC4qOwogaW1wb3J0IGNvbS5zdW4ubWFpbC5pbWFwLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Qcm9wVXRpbDsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NYWlsTG9nZ2VyOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5CQVNFNjRFbmNvZGVyU3RyZWFtOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkJBU0U2NERlY29kZXJTdHJlYW07CiAKIC8qKgogICogVGhpcyBjbGFzcyBjb250YWlucyBhIHNpbmdsZSBtZXRob2QgdGhhdCBkb2VzIGF1dGhlbnRpY2F0aW9uIHVzaW5nCkBAIC04NSwxMiArODksMTMgQEAKIAl0aGlzLmhvc3QgPSBob3N0OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmdbXSBtZWNocywgZmluYWwgU3RyaW5nIHJlYWxtLAogCQkJCWZpbmFsIFN0cmluZyBhdXRoemlkLCBmaW5hbCBTdHJpbmcgdSwKIAkJCQlmaW5hbCBTdHJpbmcgcCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAogCXN5bmNocm9uaXplZCAocHIpIHsJLy8gYXV0aGVudGljYXRlIG1ldGhvZCBzaG91bGQgYmUgc3luY2hyb25pemVkCi0JTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8UmVzcG9uc2U+KCk7CisJTGlzdDxSZXNwb25zZT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCVN0cmluZyB0YWcgPSBudWxsOwogCVJlc3BvbnNlIHIgPSBudWxsOwogCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwpAQCAtMTAzLDYgKzEwOCw3IEBACiAKIAlTYXNsQ2xpZW50IHNjOwogCUNhbGxiYWNrSGFuZGxlciBjYmggPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCkgeworCQlAT3ZlcnJpZGUKIAkgICAgcHVibGljIHZvaWQgaGFuZGxlKENhbGxiYWNrW10gY2FsbGJhY2tzKSB7CiAJCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkKIAkJICAgIGxvZ2dlci5maW5lKCJTQVNMIGNhbGxiYWNrIGxlbmd0aDogIiArIGNhbGxiYWNrcy5sZW5ndGgpOwpAQCAtMjU5LDEzICsyNjUsMTggQEAKIAkgICAgfQogCX0KIAotCS8qIERpc3BhdGNoIHVudGFnZ2VkIHJlc3BvbnNlcy4KKwlSZXNwb25zZVtdIHJlc3BvbnNlcyA9IHYudG9BcnJheShuZXcgUmVzcG9uc2Vbdi5zaXplKCldKTsKKworCS8vIGhhbmRsZSBhbiBpbGxlZ2FsIGJ1dCBub3QgdW5jb21tb24gdW50YWdnZWQgQ0FQQUJJTFRZIHJlc3BvbnNlCisJcHIuaGFuZGxlQ2FwYWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlcyk7CisKKwkvKgorCSAqIERpc3BhdGNoIHVudGFnZ2VkIHJlc3BvbnNlcy4KIAkgKiBOT1RFOiBpbiBvdXIgY3VycmVudCB1cHBlciBsZXZlbCBJTUFQIGNsYXNzZXMsIHdlIGFkZCB0aGUKIAkgKiByZXNwb25zZUhhbmRsZXIgdG8gdGhlIFByb3RvY29sIG9iamVjdCBvbmx5ICphZnRlciogdGhlIAogCSAqIGNvbm5lY3Rpb24gaGFzIGJlZW4gYXV0aGVudGljYXRlZC4gU28sIGZvciBub3csIHRoZSBiZWxvdwogCSAqIGNvZGUgcmVhbGx5IGVuZHMgdXAgYmVpbmcganVzdCBhIG5vLW9wLgogCSAqLwotCVJlc3BvbnNlW10gcmVzcG9uc2VzID0gdi50b0FycmF5KG5ldyBSZXNwb25zZVt2LnNpemUoKV0pOwogCXByLm5vdGlmeVJlc3BvbnNlSGFuZGxlcnMocmVzcG9uc2VzKTsKIAogCS8vIEhhbmRsZSB0aGUgZmluYWwgT0ssIE5PLCBCQUQgb3IgQllFIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU5URVJOQUxEQVRFLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSU5URVJOQUxEQVRFLmphdmEKaW5kZXggYWJlM2FmYi4uMzMwNGUwNiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0lOVEVSTkFMREFURS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JTlRFUk5BTERBVEUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JdGVtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvSXRlbS5qYXZhCmluZGV4IGExMTlmZTguLjNhYTgzZGYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9JdGVtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0l0ZW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTEgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9MaXN0SW5mby5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0xpc3RJbmZvLmphdmEKaW5kZXggOGU3NWIwYi4uOTU3MWFlZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0xpc3RJbmZvLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL0xpc3RJbmZvLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgcHVibGljIExpc3RJbmZvKElNQVBSZXNwb25zZSByKSB0aHJvd3MgUGFyc2luZ0V4Y2VwdGlvbiB7CiAJU3RyaW5nW10gcyA9IHIucmVhZFNpbXBsZUxpc3QoKTsKIAotCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CS8vIGFjY3VtdWxhdGUgYXR0cmlidXRlcworCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CS8vIGFjY3VtdWxhdGUgYXR0cmlidXRlcwogCWlmIChzICE9IG51bGwpIHsKIAkgICAgLy8gbm9uLWVtcHR5IGF0dHJpYnV0ZSBsaXN0CiAJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewpAQCAtOTYsNyArOTYsOCBAQAogCXIuc2tpcFNwYWNlcygpOwogCW5hbWUgPSByLnJlYWRBdG9tU3RyaW5nKCk7CiAKLQkvLyBkZWNvZGUgdGhlIG5hbWUgKHVzaW5nIFJGQzIwNjAncyBtb2RpZmllZCBVVEY3KQotCW5hbWUgPSBCQVNFNjRNYWlsYm94RGVjb2Rlci5kZWNvZGUobmFtZSk7CisJaWYgKCFyLnN1cHBvcnRzVXRmOCgpKQorCSAgICAvLyBkZWNvZGUgdGhlIG5hbWUgKHVzaW5nIFJGQzIwNjAncyBtb2RpZmllZCBVVEY3KQorCSAgICBuYW1lID0gQkFTRTY0TWFpbGJveERlY29kZXIuZGVjb2RlKG5hbWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NT0RTRVEuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NT0RTRVEuamF2YQppbmRleCA4ZGQ5MWRjLi5hMWIyODViIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvTU9EU0VRLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL01PRFNFUS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzEsNyArNzEsNyBAQAogCiAJbW9kc2VxID0gci5yZWFkTG9uZygpOwogCi0JaWYgKHIucmVhZEJ5dGUoKSAhPSAnKScpCisJaWYgKCFyLmlzTmV4dE5vblNwYWNlKCcpJykpCiAJICAgIHRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCJNT0RTRVEgcGFyc2UgZXJyb3IiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvTWFpbGJveEluZm8uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NYWlsYm94SW5mby5qYXZhCmluZGV4IDQ0YzlhNTMuLjVmOTRmZDMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NYWlsYm94SW5mby5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NYWlsYm94SW5mby5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNjksNiArNjksOCBAQAogICAgIHB1YmxpYyBsb25nIHVpZHZhbGlkaXR5ID0gLTE7CiAgICAgLyoqIFRoZSBuZXh0IFVJRCB2YWx1ZSB0byBiZSBhc3NpZ25lZC4gKi8KICAgICBwdWJsaWMgbG9uZyB1aWRuZXh0ID0gLTE7CisgICAgLyoqIFVJRHMgYXJlIG5vdCBzdGlja3kuICovCisgICAgcHVibGljIGJvb2xlYW4gdWlkTm90U3RpY2t5ID0gZmFsc2U7CS8vIFJGQyA0MzE1CiAgICAgLyoqIFRoZSBoaWdoZXN0IE1PRFNFUSB2YWx1ZS4gKi8KICAgICBwdWJsaWMgbG9uZyBoaWdoZXN0bW9kc2VxID0gLTE7CS8vIFJGQyA0NTUxIC0gQ09ORFNUT1JFCiAgICAgLyoqIEZvbGRlci5SRUFEX1dSSVRFIG9yIEZvbGRlci5SRUFEX09OTFksIHNldCBieSBJTUFQUHJvdG9jb2wuICovCkBAIC0xMDEsMTIgKzEwMywxMiBAQAogCQlyW2ldID0gbnVsbDsgLy8gcmVtb3ZlIHRoaXMgcmVzcG9uc2UKIAkgICAgfSBlbHNlIGlmIChpci5rZXlFcXVhbHMoIlZBTklTSEVEIikpIHsKIAkJaWYgKHJlc3BvbnNlcyA9PSBudWxsKQotCQkgICAgcmVzcG9uc2VzID0gbmV3IEFycmF5TGlzdDxJTUFQUmVzcG9uc2U+KCk7CisJCSAgICByZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJcmVzcG9uc2VzLmFkZChpcik7CiAJCXJbaV0gPSBudWxsOyAvLyByZW1vdmUgdGhpcyByZXNwb25zZQogCSAgICB9IGVsc2UgaWYgKGlyLmtleUVxdWFscygiRkVUQ0giKSkgewogCQlpZiAocmVzcG9uc2VzID09IG51bGwpCi0JCSAgICByZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PElNQVBSZXNwb25zZT4oKTsKKwkJICAgIHJlc3BvbnNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlyZXNwb25zZXMuYWRkKGlyKTsKIAkJcltpXSA9IG51bGw7IC8vIHJlbW92ZSB0aGlzIHJlc3BvbnNlCiAJICAgIH0gZWxzZSBpZiAoaXIuaXNVblRhZ2dlZCgpICYmIGlyLmlzT0soKSkgewpAQCAtMTQ0LDYgKzE0NiwyOSBAQAogCQkgICAgcltpXSA9IG51bGw7IC8vIHJlbW92ZSB0aGlzIHJlc3BvbnNlCiAJCWVsc2UKIAkJICAgIGlyLnJlc2V0KCk7CS8vIHNvIEFMRVJUIGNhbiBiZSByZWFkCisJICAgIH0gZWxzZSBpZiAoaXIuaXNVblRhZ2dlZCgpICYmIGlyLmlzTk8oKSkgeworCQkvKgorCQkgKiBzaG91bGQgYmUgb25lIG9mOgorCQkgKiAJKiBOTyBbVUlETk9UU1RJQ0tZXQorCQkgKi8KKwkJaXIuc2tpcFNwYWNlcygpOworCisJCWlmIChpci5yZWFkQnl0ZSgpICE9ICdbJykgewkvLyBodWggPz8/CisJCSAgICBpci5yZXNldCgpOworCQkgICAgY29udGludWU7CisJCX0KKworCQlib29sZWFuIGhhbmRsZWQgPSB0cnVlOworCQlTdHJpbmcgcyA9IGlyLnJlYWRBdG9tKCk7CisJCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIlVJRE5PVFNUSUNLWSIpKQorCQkgICAgdWlkTm90U3RpY2t5ID0gdHJ1ZTsKKwkJZWxzZQorCQkgICAgaGFuZGxlZCA9IGZhbHNlOwkvLyBwb3NzaWJseSBhbiBBTEVSVAorCisJCWlmIChoYW5kbGVkKQorCQkgICAgcltpXSA9IG51bGw7IC8vIHJlbW92ZSB0aGlzIHJlc3BvbnNlCisJCWVsc2UKKwkJICAgIGlyLnJlc2V0KCk7CS8vIHNvIEFMRVJUIGNhbiBiZSByZWFkCiAJICAgIH0KIAl9CiAKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NZXNzYWdlU2V0LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvTWVzc2FnZVNldC5qYXZhCmluZGV4IDBhZWEzODYuLjg4NjcxZWYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9NZXNzYWdlU2V0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL01lc3NhZ2VTZXQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgKiBAcmV0dXJuCQlhcnJheSBvZiBNZXNzYWdlU2V0IG9iamVjdHMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VTZXRbXSBjcmVhdGVNZXNzYWdlU2V0cyhpbnRbXSBtc2dzKSB7Ci0JTGlzdDxNZXNzYWdlU2V0PiB2ID0gbmV3IEFycmF5TGlzdDxNZXNzYWdlU2V0PigpOworCUxpc3Q8TWVzc2FnZVNldD4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCWludCBpLGo7CiAKIAlmb3IgKGk9MDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAgICByZXR1cm4gbnVsbDsgCiAKIAlpbnQgaSA9IDA7ICAvLyBtc2dzZXQgaW5kZXgKLQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCWludCBzaXplID0gbXNnc2V0cy5sZW5ndGg7CiAJaW50IHN0YXJ0LCBlbmQ7CiAKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9OYW1lc3BhY2VzLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvTmFtZXNwYWNlcy5qYXZhCmluZGV4IDNmZDljMTAuLmI5YjNiODUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9OYW1lc3BhY2VzLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL05hbWVzcGFjZXMuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc3LDExICs3NywxMyBAQAogCXB1YmxpYyBOYW1lc3BhY2UoUmVzcG9uc2UgcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKIAkgICAgLy8gTmFtZXNwYWNlX0VsZW1lbnQgPSAiKCIgc3RyaW5nIFNQICg8Ij4gUVVPVEVEX0NIQVIgPCI+IC8gbmlsKQogCSAgICAvLwkJKihOYW1lc3BhY2VfUmVzcG9uc2VfRXh0ZW5zaW9uKSAiKSIKLQkgICAgaWYgKHIucmVhZEJ5dGUoKSAhPSAnKCcpCisJICAgIGlmICghci5pc05leHROb25TcGFjZSgnKCcpKQogCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oCiAJCQkJCSJNaXNzaW5nICcoJyBhdCBzdGFydCBvZiBOYW1lc3BhY2UiKTsKIAkgICAgLy8gZmlyc3QsIHRoZSBwcmVmaXgKLQkgICAgcHJlZml4ID0gQkFTRTY0TWFpbGJveERlY29kZXIuZGVjb2RlKHIucmVhZFN0cmluZygpKTsKKwkgICAgcHJlZml4ID0gci5yZWFkU3RyaW5nKCk7CisJICAgIGlmICghci5zdXBwb3J0c1V0ZjgoKSkKKwkJcHJlZml4ID0gQkFTRTY0TWFpbGJveERlY29kZXIuZGVjb2RlKHByZWZpeCk7CiAJICAgIHIuc2tpcFNwYWNlcygpOwogCSAgICAvLyBkZWxpbWl0ZXIgaXMgYSBxdW90ZWQgY2hhcmFjdGVyIG9yIE5JTAogCSAgICBpZiAoci5wZWVrQnl0ZSgpID09ICciJykgewpAQCAtMTAxLDE2ICsxMDMsMTYgQEAKIAkJZGVsaW1pdGVyID0gMDsKIAkgICAgfQogCSAgICAvLyBhdCBlbmQgb2YgTmFtZXNwYWNlIGRhdGE/Ci0JICAgIGlmIChyLnBlZWtCeXRlKCkgIT0gJyknKSB7Ci0JCS8vIG90aGVyd2lzZSwgbXVzdCBiZSBhIE5hbWVzcGFjZV9SZXNwb25zZV9FeHRlbnNpb24KLQkJLy8gICAgTmFtZXNwYWNlX1Jlc3BvbnNlX0V4dGVuc2lvbiA9IFNQIHN0cmluZyBTUAotCQkvLwkgICAgIigiIHN0cmluZyAqKFNQIHN0cmluZykgIikiCi0JCXIuc2tpcFNwYWNlcygpOwotCQlyLnJlYWRTdHJpbmcoKTsKLQkJci5za2lwU3BhY2VzKCk7Ci0JCXIucmVhZFN0cmluZ0xpc3QoKTsKLQkgICAgfQotCSAgICBpZiAoci5yZWFkQnl0ZSgpICE9ICcpJykKKwkgICAgaWYgKHIuaXNOZXh0Tm9uU3BhY2UoJyknKSkKKwkJcmV0dXJuOworCisJICAgIC8vIG90aGVyd2lzZSwgbXVzdCBiZSBhIE5hbWVzcGFjZV9SZXNwb25zZV9FeHRlbnNpb24KKwkgICAgLy8gICAgTmFtZXNwYWNlX1Jlc3BvbnNlX0V4dGVuc2lvbiA9IFNQIHN0cmluZyBTUAorCSAgICAvLwkgICAgIigiIHN0cmluZyAqKFNQIHN0cmluZykgIikiCisJICAgIHIucmVhZFN0cmluZygpOworCSAgICByLnNraXBTcGFjZXMoKTsKKwkgICAgci5yZWFkU3RyaW5nTGlzdCgpOworCSAgICBpZiAoIXIuaXNOZXh0Tm9uU3BhY2UoJyknKSkKIAkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nICcpJyBhdCBlbmQgb2YgTmFtZXNwYWNlIik7CiAJfQogICAgIH07CkBAIC0xNDksMTYgKzE1MSwxMyBAQAogICAgICAqIFBhcnNlIG91dCBvbmUgb2YgdGhlIHRocmVlIHNldHMgb2YgbmFtZXNwYWNlcy4KICAgICAgKi8KICAgICBwcml2YXRlIE5hbWVzcGFjZVtdIGdldE5hbWVzcGFjZXMoUmVzcG9uc2UgcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQlyLnNraXBTcGFjZXMoKTsKIAkvLyAgICBOYW1lc3BhY2UgPSBuaWwgLyAiKCIgMSooIE5hbWVzcGFjZV9FbGVtZW50KSAiKSIKLQlpZiAoci5wZWVrQnl0ZSgpID09ICcoJykgewotCSAgICBMaXN0PE5hbWVzcGFjZT4gdiA9IG5ldyBBcnJheUxpc3Q8TmFtZXNwYWNlPigpOwotCSAgICByLnJlYWRCeXRlKCk7CisJaWYgKHIuaXNOZXh0Tm9uU3BhY2UoJygnKSkgeworCSAgICBMaXN0PE5hbWVzcGFjZT4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCSAgICBkbyB7CiAJCU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2Uocik7CiAJCXYuYWRkKG5zKTsKLQkgICAgfSB3aGlsZSAoci5wZWVrQnl0ZSgpICE9ICcpJyk7Ci0JICAgIHIucmVhZEJ5dGUoKTsKKwkgICAgfSB3aGlsZSAoIXIuaXNOZXh0Tm9uU3BhY2UoJyknKSk7CiAJICAgIHJldHVybiB2LnRvQXJyYXkobmV3IE5hbWVzcGFjZVt2LnNpemUoKV0pOwogCX0gZWxzZSB7CiAJICAgIFN0cmluZyBzID0gci5yZWFkQXRvbSgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1JGQzgyMkRBVEEuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9SRkM4MjJEQVRBLmphdmEKaW5kZXggNjE0YmRhZi4uM2M0NDBiZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1JGQzgyMkRBVEEuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvUkZDODIyREFUQS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1JGQzgyMlNJWkUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9SRkM4MjJTSVpFLmphdmEKaW5kZXggYjczYzU3ZS4uNTFmYTA2YiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1JGQzgyMlNJWkUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvUkZDODIyU0laRS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNTMsNyArNTMsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gbmFtZSA9IHsnUicsJ0YnLCdDJywnOCcsJzInLCcyJywnLicsJ1MnLCdJJywnWicsJ0UnfTsKICAgICBwdWJsaWMgaW50IG1zZ25vOwogCi0gICAgcHVibGljIGludCBzaXplOworICAgIHB1YmxpYyBsb25nIHNpemU7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KQEAgLTY0LDYgKzY0LDYgQEAKICAgICBwdWJsaWMgUkZDODIyU0laRShGZXRjaFJlc3BvbnNlIHIpIHRocm93cyBQYXJzaW5nRXhjZXB0aW9uIHsKIAltc2dubyA9IHIuZ2V0TnVtYmVyKCk7CiAJci5za2lwU3BhY2VzKCk7Ci0Jc2l6ZSA9IHIucmVhZE51bWJlcigpOwkJCisJc2l6ZSA9IHIucmVhZExvbmcoKTsJCQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TYXNsQXV0aGVudGljYXRvci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1Nhc2xBdXRoZW50aWNhdG9yLmphdmEKaW5kZXggMjFjMGJiZS4uOTJmNTNiZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1Nhc2xBdXRoZW50aWNhdG9yLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1Nhc2xBdXRoZW50aWNhdG9yLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvU2VhcmNoU2VxdWVuY2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TZWFyY2hTZXF1ZW5jZS5qYXZhCmluZGV4IDcwYjAzMmIuLjA3ZTczMjEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TZWFyY2hTZXF1ZW5jZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TZWFyY2hTZXF1ZW5jZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNTksOSArNTksMjkgQEAKICAqIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgcHJvZHVjdC1zcGVjaWZpYyBzZWFyY2ggdGVybXMuCiAgKgogICogQGF1dGhvcglKb2huIE1hbmkKKyAqIEBhdXRob3IJQmlsbCBTaGFubm9uCiAgKi8KIHB1YmxpYyBjbGFzcyBTZWFyY2hTZXF1ZW5jZSB7CiAKKyAgICBwcml2YXRlIElNQVBQcm90b2NvbCBwcm90b2NvbDsJLy8gZm9yIGhhc0NhcGFiaWxpdHkgY2hlY2tzOyBtYXkgYmUgbnVsbAorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgU2VhcmNoU2VxdWVuY2UgZm9yIHRoaXMgSU1BUFByb3RvY29sLgorICAgICAqCisgICAgICogQHBhcmFtCXAJdGhlIElNQVBQcm90b2NvbCBvYmplY3QgZm9yIHRoZSBzZXJ2ZXIKKyAgICAgKiBAc2luY2UJSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VhcmNoU2VxdWVuY2UoSU1BUFByb3RvY29sIHApIHsKKwlwcm90b2NvbCA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgU2VhcmNoU2VxdWVuY2UuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU2VhcmNoU2VxdWVuY2UoKSB7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2VuZXJhdGUgdGhlIElNQVAgc2VhcmNoIHNlcXVlbmNlIGZvciB0aGUgZ2l2ZW4gc2VhcmNoIGV4cHJlc3Npb24uIAogICAgICAqCkBAIC00MDQsNyArNDI0LDcgQEAKICAgICBwcm90ZWN0ZWQgQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvSU1BUERhdGUoRGF0ZSBkYXRlKSB7Ci0JU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogCWNhbC5zZXRUaW1lKGRhdGUpOwogCkBAIC00ODYsNiArNTA2LDggQEAKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS41LjEKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQXJndW1lbnQgb2xkZXIoT2xkZXJUZXJtIHRlcm0pIHRocm93cyBTZWFyY2hFeGNlcHRpb24geworCWlmIChwcm90b2NvbCAhPSBudWxsICYmICFwcm90b2NvbC5oYXNDYXBhYmlsaXR5KCJXSVRISU4iKSkKKwkgICAgdGhyb3cgbmV3IFNlYXJjaEV4Y2VwdGlvbigiU2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBPTERFUiBzZWFyY2hlcyIpOwogCUFyZ3VtZW50IHJlc3VsdCA9IG5ldyBBcmd1bWVudCgpOwogCXJlc3VsdC53cml0ZUF0b20oIk9MREVSIik7CiAJcmVzdWx0LndyaXRlTnVtYmVyKHRlcm0uZ2V0SW50ZXJ2YWwoKSk7CkBAIC01MDEsNiArNTIzLDggQEAKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS41LjEKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQXJndW1lbnQgeW91bmdlcihZb3VuZ2VyVGVybSB0ZXJtKSB0aHJvd3MgU2VhcmNoRXhjZXB0aW9uIHsKKwlpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiAhcHJvdG9jb2wuaGFzQ2FwYWJpbGl0eSgiV0lUSElOIikpCisJICAgIHRocm93IG5ldyBTZWFyY2hFeGNlcHRpb24oIlNlcnZlciBkb2Vzbid0IHN1cHBvcnQgWU9VTkdFUiBzZWFyY2hlcyIpOwogCUFyZ3VtZW50IHJlc3VsdCA9IG5ldyBBcmd1bWVudCgpOwogCXJlc3VsdC53cml0ZUF0b20oIllPVU5HRVIiKTsKIAlyZXN1bHQud3JpdGVOdW1iZXIodGVybS5nZXRJbnRlcnZhbCgpKTsKQEAgLTUxNyw2ICs1NDEsOCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBBcmd1bWVudCBtb2RpZmllZFNpbmNlKE1vZGlmaWVkU2luY2VUZXJtIHRlcm0pCiAJCQkJdGhyb3dzIFNlYXJjaEV4Y2VwdGlvbiB7CisJaWYgKHByb3RvY29sICE9IG51bGwgJiYgIXByb3RvY29sLmhhc0NhcGFiaWxpdHkoIkNPTkRTVE9SRSIpKQorCSAgICB0aHJvdyBuZXcgU2VhcmNoRXhjZXB0aW9uKCJTZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IE1PRFNFUSBzZWFyY2hlcyIpOwogCUFyZ3VtZW50IHJlc3VsdCA9IG5ldyBBcmd1bWVudCgpOwogCXJlc3VsdC53cml0ZUF0b20oIk1PRFNFUSIpOwogCXJlc3VsdC53cml0ZU51bWJlcih0ZXJtLmdldE1vZFNlcSgpKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TdGF0dXMuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9TdGF0dXMuamF2YQppbmRleCA3NWU1ZGY5Li4yNTYwMGY0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvU3RhdHVzLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1N0YXR1cy5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNjgsMTEgKzY4LDEzIEBACiAKICAgICBwdWJsaWMgU3RhdHVzKFJlc3BvbnNlIHIpIHRocm93cyBQYXJzaW5nRXhjZXB0aW9uIHsKIAkvLyBtYWlsYm94IDo9IGFzdHJpbmcKLQltYm94ID0gQkFTRTY0TWFpbGJveERlY29kZXIuZGVjb2RlKHIucmVhZEF0b21TdHJpbmcoKSk7CisJbWJveCA9IHIucmVhZEF0b21TdHJpbmcoKTsKKwlpZiAoIXIuc3VwcG9ydHNVdGY4KCkpCisJICAgIG1ib3ggPSBCQVNFNjRNYWlsYm94RGVjb2Rlci5kZWNvZGUobWJveCk7CiAKIAkvLyBXb3JrYXJvdW5kIGJ1Z2d5IElNQVAgc2VydmVycyB0aGF0IGRvbid0IHF1b3RlIGZvbGRlciBuYW1lcwogCS8vIHdpdGggc3BhY2VzLgotCWZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJZmluYWwgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCWJvb2xlYW4gb25seVNwYWNlcyA9IHRydWU7CiAKIAl3aGlsZSAoci5wZWVrQnl0ZSgpICE9ICcoJyAmJiByLnBlZWtCeXRlKCkgIT0gMCkgewpAQCAtOTQsNiArOTYsOCBAQAogCQogCWRvIHsKIAkgICAgU3RyaW5nIGF0dHIgPSByLnJlYWRBdG9tKCk7CisJICAgIGlmIChhdHRyID09IG51bGwpCisJCXRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCJwYXJzZSBlcnJvciBpbiBTVEFUVVMiKTsKIAkgICAgaWYgKGF0dHIuZXF1YWxzSWdub3JlQ2FzZSgiTUVTU0FHRVMiKSkKIAkJdG90YWwgPSByLnJlYWROdW1iZXIoKTsKIAkgICAgZWxzZSBpZiAoYXR0ci5lcXVhbHNJZ25vcmVDYXNlKCJSRUNFTlQiKSkKQEAgLTEwOCwxMSArMTEyLDExIEBACiAJCWhpZ2hlc3Rtb2RzZXEgPSByLnJlYWRMb25nKCk7CiAJICAgIGVsc2UgewogCQlpZiAoaXRlbXMgPT0gbnVsbCkKLQkJICAgIGl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KCk7CisJCSAgICBpdGVtcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJaXRlbXMucHV0KGF0dHIudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpLAogCQkJICAgIExvbmcudmFsdWVPZihyLnJlYWRMb25nKCkpKTsKIAkgICAgfQotCX0gd2hpbGUgKHIucmVhZEJ5dGUoKSAhPSAnKScpOworCX0gd2hpbGUgKCFyLmlzTmV4dE5vblNwYWNlKCcpJykpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1VJRC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1VJRC5qYXZhCmluZGV4IGU3YzBhNzkuLmI5MTc4NjEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9VSUQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvVUlELmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvVUlEU2V0LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL2ltYXAvcHJvdG9jb2wvVUlEU2V0LmphdmEKaW5kZXggNDM2YTBhZC4uZjZmZGViZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9pbWFwL3Byb3RvY29sL1VJRFNldC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvaW1hcC9wcm90b2NvbC9VSURTZXQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFVJRFNldFtdIGNyZWF0ZVVJRFNldHMobG9uZ1tdIHVpZHMpIHsKIAlpZiAodWlkcyA9PSBudWxsKQogCSAgICByZXR1cm4gbnVsbDsKLQlMaXN0PFVJRFNldD4gdiA9IG5ldyBBcnJheUxpc3Q8VUlEU2V0PigpOworCUxpc3Q8VUlEU2V0PiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJaW50IGksajsKIAogCWZvciAoaT0wOyBpIDwgdWlkcy5sZW5ndGg7IGkrKykgewpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBVSURTZXRbXSBwYXJzZVVJRFNldHMoU3RyaW5nIHVpZHMpIHsKIAlpZiAodWlkcyA9PSBudWxsKQogCSAgICByZXR1cm4gbnVsbDsKLQlMaXN0PFVJRFNldD4gdiA9IG5ldyBBcnJheUxpc3Q8VUlEU2V0PigpOworCUxpc3Q8VUlEU2V0PiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih1aWRzLCAiLDoiLCB0cnVlKTsKIAlsb25nIHN0YXJ0ID0gLTE7CiAJVUlEU2V0IGN1ciA9IG51bGw7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvQXBwZW5kU3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvQXBwZW5kU3RyZWFtLmphdmEKaW5kZXggYTZkMzkyZC4uOWVmNmM0MyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL0FwcGVuZFN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9BcHBlbmRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTY0LDE4ICs2NCwyMiBAQAogCXJhZi5zZWVrKHN0YXJ0KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlyYWYud3JpdGUoYik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcmFmLndyaXRlKGIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXJhZi53cml0ZShiLCBvZmYsIGxlbik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAllbmQgPSB0Zi51cGRhdGVMZW5ndGgoKTsKIAlyYWYgPSBudWxsOwkvLyBubyBtb3JlIHdyaXRpbmcgYWxsb3dlZApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL0RlZmF1bHRGb2xkZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9EZWZhdWx0Rm9sZGVyLmphdmEKaW5kZXggNzFhNjI5OS4uNGNlYjM2ZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL0RlZmF1bHRGb2xkZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvRGVmYXVsdEZvbGRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNTMsNDMgKzUzLDUzIEBACiAJc3VwZXIoc3RvcmUpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAlyZXR1cm4gIiI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKIAlyZXR1cm4gIiI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlciBnZXRQYXJlbnQoKSB7CiAJcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewogCXJldHVybiB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGb2xkZXJbXSBsaXN0KFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlGb2xkZXJbXSBmID0geyBnZXRJbmJveCgpIH07CiAJcmV0dXJuIGY7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGNoYXIgZ2V0U2VwYXJhdG9yKCkgewogCXJldHVybiAnLyc7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRUeXBlKCkgewogCXJldHVybiBIT0xEU19GT0xERVJTOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZShpbnQgdHlwZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhhc05ld01lc3NhZ2VzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSU5CT1giKSkgewogCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJvbmx5IElOQk9YIHN1cHBvcnRlZCIpOwpAQCAtMTAzLDQyICsxMTMsNTIgQEAKICAgICB9CiAgICAgCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGUoYm9vbGVhbiByZWN1cnNlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJkZWxldGUiKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZW5hbWVUbyhGb2xkZXIgZikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigicmVuYW1lVG8iKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvcGVuKGludCBtb2RlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJvcGVuIik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoYm9vbGVhbiBleHB1bmdlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJjbG9zZSIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZsYWdzIGdldFBlcm1hbmVudEZsYWdzKCkgewogCXJldHVybiBuZXcgRmxhZ3MoKTsgLy8gZW1wdHkgZmxhZ3Mgb2JqZWN0CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRNZXNzYWdlQ291bnQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gMDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKGludCBtc2dubykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiZ2V0TWVzc2FnZSIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFwcGVuZE1lc3NhZ2VzKE1lc3NhZ2VbXSBtc2dzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJBcHBlbmQgbm90IHN1cHBvcnRlZCIpOwkKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZVtdIGV4cHVuZ2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJleHB1bmdlIik7CQogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzRm9sZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM0ZvbGRlci5qYXZhCmluZGV4IGUxY2M1ODcuLjI1ODljYWIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzRm9sZGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNGb2xkZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTg1LDE4ICs4NSwyMSBAQAogCXRoaXMuc3RvcmUgPSBzdG9yZTsKIAlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJJTkJPWCIpKQogCSAgICBleGlzdHMgPSB0cnVlOwotCWxvZ2dlciA9IG5ldyBNYWlsTG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKSwKLQkJCQkiREVCVUcgUE9QMyIsIHN0b3JlLmdldFNlc3Npb24oKSk7CisJbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLCAiREVCVUcgUE9QMyIsCisJICAgIHN0b3JlLmdldFNlc3Npb24oKS5nZXREZWJ1ZygpLCBzdG9yZS5nZXRTZXNzaW9uKCkuZ2V0RGVidWdPdXQoKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCXJldHVybiBuYW1lOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CiAJcmV0dXJuIG5hbWU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlciBnZXRQYXJlbnQoKSB7CiAJcmV0dXJuIG5ldyBEZWZhdWx0Rm9sZGVyKHN0b3JlKTsKICAgICB9CkBAIC0xMDcsNiArMTEwLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4JdHJ1ZSBmb3IgSU5CT1gsIGZhbHNlIG90aGVyd2lzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKIAlyZXR1cm4gZXhpc3RzOwogICAgIH0KQEAgLTExNyw2ICsxMjEsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24JYWx3YXlzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlcltdIGxpc3QoU3RyaW5nIHBhdHRlcm4pIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIm5vdCBhIGRpcmVjdG9yeSIpOwogICAgIH0KQEAgLTEyNiw2ICsxMzEsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybglOVUwKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgY2hhciBnZXRTZXBhcmF0b3IoKSB7CiAJcmV0dXJuICdcMCc7CiAgICAgfQpAQCAtMTM1LDYgKzE0MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCUZvbGRlci5IT0xEU19NRVNTQUdFUwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKIAlyZXR1cm4gSE9MRFNfTUVTU0FHRVM7CiAgICAgfQpAQCAtMTQ1LDYgKzE1Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCWZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlKGludCB0eXBlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTU1LDYgKzE2Myw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCWZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV3TWVzc2FnZXMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZmFsc2U7ICAgIC8vIG5vIHdheSB0byBrbm93CiAgICAgfQpAQCAtMTY1LDYgKzE3NCw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbglhbHdheXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyIGdldEZvbGRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigibm90IGEgZGlyZWN0b3J5Iik7CiAgICAgfQpAQCAtMTc2LDYgKzE4Niw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uCU1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbglhbHdheXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGUoYm9vbGVhbiByZWN1cnNlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJkZWxldGUiKTsKICAgICB9CkBAIC0xODYsNiArMTk3LDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24JTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uCWFsd2F5cwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlbmFtZVRvKEZvbGRlciBmKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJyZW5hbWVUbyIpOwogICAgIH0KQEAgLTE5OCw2ICsyMTAsNyBAQAogICAgICAqIEBleGNlcHRpb24JQXV0aGVudGljYXRpb25GYWlsZWRFeGNlcHRpb24JYXV0aGVudGljYXRpb24gZmFpbHVyZXMKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbglvdGhlciBvcGVuIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oaW50IG1vZGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrQ2xvc2VkKCk7CiAJaWYgKCFleGlzdHMpCkBAIC0yMzgsNiArMjUxLDcgQEAKIAlub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKENvbm5lY3Rpb25FdmVudC5PUEVORUQpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZShib29sZWFuIGV4cHVuZ2UpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrT3BlbigpOwogCkBAIC0yOTcsNiArMzExLDcgQEAKIAl9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzT3BlbigpIHsKIAlpZiAoIW9wZW5lZCkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzA4LDkgKzMyMyw4IEBACiAJCWNsb3NlKGZhbHNlKTsKIAkgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIG1leCkgewogCQkvLyBpZ25vcmUgaXQKLQkgICAgfSBmaW5hbGx5IHsKLQkJcmV0dXJuIGZhbHNlOwogCSAgICB9CisJICAgIHJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMzIxLDYgKzMzNSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCWVtcHR5IEZsYWdzIG9iamVjdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGbGFncyBnZXRQZXJtYW5lbnRGbGFncygpIHsKIAlyZXR1cm4gbmV3IEZsYWdzKCk7IC8vIGVtcHR5IGZsYWdzIG9iamVjdAogICAgIH0KQEAgLTMzMCw2ICszNDUsNyBAQAogICAgICAqIHByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb24gb2YgbmV3IG1lc3NhZ2VzCiAgICAgICogYXJyaXZpbmcgaW4gb3BlbiBmb2xkZXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1lc3NhZ2VDb3VudCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmICghb3BlbmVkKQogCSAgICByZXR1cm4gLTE7CkBAIC0zMzcsNiArMzUzLDcgQEAKIAlyZXR1cm4gdG90YWw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBNZXNzYWdlIGdldE1lc3NhZ2UoaW50IG1zZ25vKQogCQkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja09wZW4oKTsKQEAgLTM3NCw2ICszOTEsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24JYWx3YXlzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwZW5kTWVzc2FnZXMoTWVzc2FnZVtdIG1zZ3MpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkFwcGVuZCBub3Qgc3VwcG9ydGVkIik7CQogICAgIH0KQEAgLTM4Nyw2ICs0MDUsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24JYWx3YXlzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1lc3NhZ2VbXSBleHB1bmdlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRXhwdW5nZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQpAQCAtNDAwLDYgKzQxOSw3IEBACiAgICAgICogdGhlIGhlYWRlcnMgYW5kIHNpemUgb2YgYWxsIG1lc3NhZ2VzIGFyZSBmZXRjaGVkIHVzaW5nIHRoZSBQT1AzIFRPUAogICAgICAqIGFuZCBMSVNUIGNvbW1hbmRzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBmZXRjaChNZXNzYWdlW10gbXNncywgRmV0Y2hQcm9maWxlIGZwKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrUmVhZGFibGUoKTsKQEAgLTU0OCw2ICs1NjgsNyBAQAogICAgIC8qKgogICAgICAqIENsb3NlIHRoZSBmb2xkZXIgd2hlbiB3ZSdyZSBmaW5hbGl6ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAlmb3JjZUNsb3NlID0gIXN0b3JlLmZpbmFsaXplQ2xlYW5DbG9zZTsKIAl0cnkgewpAQCAtNjAwLDYgKzYyMSw3IEBACiAgICAgLyoKICAgICAgKiBPbmx5IGhlcmUgdG8gbWFrZSBhY2Nlc3NpYmxlIHRvIFBPUDNNZXNzYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeU1lc3NhZ2VDaGFuZ2VkTGlzdGVuZXJzKGludCB0eXBlLCBNZXNzYWdlIG0pIHsKIAlzdXBlci5ub3RpZnlNZXNzYWdlQ2hhbmdlZExpc3RlbmVycyh0eXBlLCBtKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM01lc3NhZ2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzTWVzc2FnZS5qYXZhCmluZGV4IGQyNDFmOWMuLmZjMWM1ZjAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzTWVzc2FnZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzTWVzc2FnZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzMsNyArNzMsNyBAQAogCiAgICAgLy8gcmF3RGF0YSBpdHNlbGYgaXMgbmV2ZXIgbnVsbAogICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxJbnB1dFN0cmVhbT4gcmF3RGF0YQotCSAgICA9IG5ldyBTb2Z0UmVmZXJlbmNlPElucHV0U3RyZWFtPihudWxsKTsKKwkgICAgPSBuZXcgU29mdFJlZmVyZW5jZTw+KG51bGwpOwogCiAgICAgcHVibGljIFBPUDNNZXNzYWdlKEZvbGRlciBmb2xkZXIsIGludCBtc2dubykKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewpAQCAtODgsNiArODgsNyBAQAogICAgICAqIEBwYXJhbSBuZXdGbGFncwl0aGUgZmxhZ3MgdG8gYmUgc2V0CiAgICAgICogQHBhcmFtIHNldAl0aGUgdmFsdWUgdG8gYmUgc2V0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZsYWdzKEZsYWdzIG5ld0ZsYWdzLCBib29sZWFuIHNldCkKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlGbGFncyBvbGRGbGFncyA9IChGbGFncylmbGFncy5jbG9uZSgpOwpAQCAtMTA4LDYgKzEwOSw3IEBACiAgICAgICogQHJldHVybiAgICAgICAgICBzaXplIG9mIGNvbnRlbnQgaW4gYnl0ZXMKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8gIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRyeSB7CiAJICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMjM4LDcgKzI0MCw3IEBACiAJCS8vIHNraXBwZWQgdGhlIGhlYWRlciwgdGhlIG1lc3NhZ2UgaXMgd2hhdCdzIGxlZnQKIAkJbXNnU2l6ZSA9IHJhd2NvbnRlbnQuYXZhaWxhYmxlKCk7CiAKLQkJcmF3RGF0YSA9IG5ldyBTb2Z0UmVmZXJlbmNlPElucHV0U3RyZWFtPihyYXdjb250ZW50KTsKKwkJcmF3RGF0YSA9IG5ldyBTb2Z0UmVmZXJlbmNlPD4ocmF3Y29udGVudCk7CiAJICAgIH0KIAl9CiAJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGVleCkgewpAQCAtMjY0LDYgKzI2Niw3IEBACiAgICAgICoKICAgICAgKiBAc2VlICNjb250ZW50U3RyZWFtCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBJbnB1dFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKQpAQCAtMjg4LDYgKzI5MSw3IEBACiAgICAgICogQHJldHVybgl0aGUgTUlNRSBmb3JtYXQgc3RyZWFtCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNC41CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldE1pbWVTdHJlYW0oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0UmF3U3RyZWFtKGZhbHNlKTsKICAgICB9CkBAIC0zMTEsNyArMzE1LDcgQEAKIAkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKIAkJLy8gaWdub3JlIGl0CiAJICAgIH0KLQkgICAgcmF3RGF0YSA9IG5ldyBTb2Z0UmVmZXJlbmNlPElucHV0U3RyZWFtPihudWxsKTsKKwkgICAgcmF3RGF0YSA9IG5ldyBTb2Z0UmVmZXJlbmNlPD4obnVsbCk7CiAJfQogCWlmIChjb250ZW50U3RyZWFtICE9IG51bGwpIHsKIAkgICAgdHJ5IHsKQEAgLTM2MCw2ICszNjQsNyBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqIEBzZWUgCWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVV0aWxpdHkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGhlYWRlcnMgPT0gbnVsbCkKQEAgLTM3OSw2ICszODQsNyBAQAogICAgICAqCQkJCXRoaXMgbmFtZQogICAgICAqIEBleGNlcHRpb24JCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlbGltaXRlcikKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoaGVhZGVycyA9PSBudWxsKQpAQCAtMzk5LDYgKzQwNSw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJLy8gWFhYIC0gc2hvdWxkIGNoZWNrIGZvciByZWFkLW9ubHkgZm9sZGVyPwpAQCAtNDE3LDYgKzQyNCw3IEBACiAgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXNzYWdlIGlzCiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJLy8gWFhYIC0gc2hvdWxkIGNoZWNrIGZvciByZWFkLW9ubHkgZm9sZGVyPwpAQCAtNDMyLDYgKzQ0MCw3IEBACiAgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXNzYWdlIGlzCiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXIoU3RyaW5nIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIFhYWCAtIHNob3VsZCBjaGVjayBmb3IgcmVhZC1vbmx5IGZvbGRlcj8KQEAgLTQ1MCw3ICs0NTksNyBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqIEBzZWUgCWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVV0aWxpdHkKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRBbGxIZWFkZXJzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGhlYWRlcnMgPT0gbnVsbCkKIAkgICAgbG9hZEhlYWRlcnMoKTsKQEAgLTQ2Myw3ICs0NzIsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0TWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGhlYWRlcnMgPT0gbnVsbCkKQEAgLTQ3Nyw3ICs0ODYsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGhlYWRlcnMgPT0gbnVsbCkKQEAgLTQ5NCw2ICs1MDMsNyBAQAogICAgICAqIEBleGNlcHRpb24JSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWVzc2FnZSBpcwogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyTGluZShTdHJpbmcgbGluZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJLy8gWFhYIC0gc2hvdWxkIGNoZWNrIGZvciByZWFkLW9ubHkgZm9sZGVyPwogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIlBPUDMgbWVzc2FnZXMgYXJlIHJlYWQtb25seSIpOwpAQCAtNTA2LDcgKzUxNiw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBbGxIZWFkZXJMaW5lcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmIChoZWFkZXJzID09IG51bGwpCiAJICAgIGxvYWRIZWFkZXJzKCk7CkBAIC01MjAsNyArNTMwLDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGhlYWRlcnMgPT0gbnVsbCkKQEAgLTUzNSw3ICs1NDUsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoaGVhZGVycyA9PSBudWxsKQpAQCAtNTUwLDYgKzU2MCw3IEBACiAgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsV3JpdGVFeGNlcHRpb24gYmVjYXVzZSB0aGUgdW5kZXJseWluZwogICAgICAqCQkJaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtb2RpZmljYXRpb24KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzYXZlQ2hhbmdlcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIFBPUDMgTWVzc2FnZXMgYXJlIHJlYWQtb25seQogCXRocm93IG5ldyBJbGxlZ2FsV3JpdGVFeGNlcHRpb24oIlBPUDMgbWVzc2FnZXMgYXJlIHJlYWQtb25seSIpOwpAQCAtNTY5LDYgKzU4MCw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyI3dyaXRlVG8KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MsIFN0cmluZ1tdIGlnbm9yZUxpc3QpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCUlucHV0U3RyZWFtIHJhd2NvbnRlbnQgPSByYXdEYXRhLmdldCgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNQcm92aWRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjBjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorCisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAorICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKKyAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgorICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KKyAqCisgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKKyAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCisgKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKKyAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCisgKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKKyAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKKyAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCisgKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKKyAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKKyAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bworICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCisgKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCisgKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAorICogaG9sZGVyLgorICovCisKK3BhY2thZ2UgY29tLnN1bi5tYWlsLnBvcDM7CisKK2ltcG9ydCBqYXZheC5tYWlsLlByb3ZpZGVyOworCisvKioKKyAqIFRoZSBQT1AzIHByb3RvY29sIHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgUE9QM1Byb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIgeworICAgIHB1YmxpYyBQT1AzUHJvdmlkZXIoKSB7CisJc3VwZXIoUHJvdmlkZXIuVHlwZS5TVE9SRSwgInBvcDMiLCBQT1AzU3RvcmUuY2xhc3MuZ2V0TmFtZSgpLAorCSAgICAiT3JhY2xlIiwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNTU0xQcm92aWRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNTU0xQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOWJlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM1NTTFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorCisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAorICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKKyAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgorICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KKyAqCisgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKKyAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCisgKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKKyAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCisgKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKKyAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKKyAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCisgKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKKyAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKKyAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bworICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCisgKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCisgKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAorICogaG9sZGVyLgorICovCisKK3BhY2thZ2UgY29tLnN1bi5tYWlsLnBvcDM7CisKK2ltcG9ydCBqYXZheC5tYWlsLlByb3ZpZGVyOworCisvKioKKyAqIFRoZSBQT1AzIFNTTCBwcm90b2NvbCBwcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFBPUDNTU0xQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyIHsKKyAgICBwdWJsaWMgUE9QM1NTTFByb3ZpZGVyKCkgeworCXN1cGVyKFByb3ZpZGVyLlR5cGUuU1RPUkUsICJwb3AzcyIsIFBPUDNTU0xTdG9yZS5jbGFzcy5nZXROYW1lKCksCisJICAgICJPcmFjbGUiLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM1NTTFN0b3JlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM1NTTFN0b3JlLmphdmEKaW5kZXggNTdiZDIzZS4uMjk5MzI5YiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNTU0xTdG9yZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzU1NMU3RvcmUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzU3RvcmUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9QT1AzU3RvcmUuamF2YQppbmRleCAyYTA4MmI3Li4wOGVmNzAzIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvUE9QM1N0b3JlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1BPUDNTdG9yZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTA3LDExICsxMDcsMTEgQEAKIAlpZiAodXJsICE9IG51bGwpCiAJICAgIG5hbWUgPSB1cmwuZ2V0UHJvdG9jb2woKTsKIAl0aGlzLm5hbWUgPSBuYW1lOwotCWxvZ2dlciA9IG5ldyBNYWlsTG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKSwKLQkJCQkiREVCVUcgUE9QMyIsIHNlc3Npb24pOworCWxvZ2dlciA9IG5ldyBNYWlsTG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKSwgIkRFQlVHIFBPUDMiLAorCQkJCXNlc3Npb24uZ2V0RGVidWcoKSwgc2Vzc2lvbi5nZXREZWJ1Z091dCgpKTsKIAogCWlmICghaXNTU0wpCi0JICAgIGlzU1NMID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBpc1NTTCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShzZXNzaW9uLmdldFByb3BlcnRpZXMoKSwKIAkJCQkibWFpbC4iICsgbmFtZSArICIuc3NsLmVuYWJsZSIsIGZhbHNlKTsKIAlpZiAoaXNTU0wpCiAJICAgIHRoaXMuZGVmYXVsdFBvcnQgPSA5OTU7CkBAIC0xNzQsNyArMTc0LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHN5bmNocm9uaXplZCBib29sZWFuIGdldEJvb2xQcm9wKFN0cmluZyBwcm9wKSB7CiAJcHJvcCA9ICJtYWlsLiIgKyBuYW1lICsgIi4iICsgcHJvcDsKLQlib29sZWFuIHZhbCA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwgcHJvcCwgZmFsc2UpOworCWJvb2xlYW4gdmFsID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHNlc3Npb24uZ2V0UHJvcGVydGllcygpLAorCQkJCQkJICAgIHByb3AsIGZhbHNlKTsKIAlpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkKIAkgICAgbG9nZ2VyLmNvbmZpZyhwcm9wICsgIjogIiArIHZhbCk7CiAJcmV0dXJuIHZhbDsKQEAgLTE4Nyw2ICsxODgsNyBAQAogICAgICAgICByZXR1cm4gc2Vzc2lvbjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gcHJvdG9jb2xDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydE51bSwKIAkJU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd2QpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCQkgICAgCkBAIC0xOTcsNyArMTk5LDcgQEAKIAkvLyBpZiBwb3J0IGlzIG5vdCBzcGVjaWZpZWQsIHNldCBpdCB0byB2YWx1ZSBvZiBtYWlsLnBvcDMucG9ydAogICAgICAgICAvLyBwcm9wZXJ0eSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDExMAogICAgICAgICBpZiAocG9ydE51bSA9PSAtMSkKLQkgICAgcG9ydE51bSA9IFByb3BVdGlsLmdldEludFNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBwb3J0TnVtID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkoc2Vzc2lvbi5nZXRQcm9wZXJ0aWVzKCksCiAJCQkJIm1haWwuIiArIG5hbWUgKyAiLnBvcnQiLCAtMSk7CiAKIAlpZiAocG9ydE51bSA9PSAtMSkKQEAgLTIzMiw2ICsyMzQsNyBAQAogICAgICAqIGFzIGxvbmcgYXMgd2UgY2FuIHJlY29ubmVjdCBhdCB0aGF0IHBvaW50LiAgVGhpcyBtZWFucyB0aGF0IHdlCiAgICAgICogbmVlZCB0byBiZSBhYmxlIHRvIHJlY29ubmVjdCB0aGUgU3RvcmUgb24gZGVtYW5kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKIAlpZiAoIXN1cGVyLmlzQ29ubmVjdGVkKCkpCiAJICAgIC8vIGlmIHdlIGhhdmVuJ3QgYmVlbiBjb25uZWN0ZWQgYXQgYWxsLCBkb24ndCBib3RoZXIgd2l0aApAQCAtMjQ5LDkgKzI1Miw4IEBACiAJCXN1cGVyLmNsb3NlKCk7CQkvLyBub3RpZmllcyBsaXN0ZW5lcnMKIAkgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIG1leCkgewogCQkvLyBpZ25vcmUgaXQKLQkgICAgfSBmaW5hbGx5IHsKLQkJcmV0dXJuIGZhbHNlOwogCSAgICB9CisJICAgIHJldHVybiBmYWxzZTsKIAl9CiAgICAgfQogCkBAIC0yNzUsMjEgKzI3NywxMyBAQAogCQkgICAgcC5zZXRDYXBhYmlsaXRpZXMocC5jYXBhKCkpOwogCQl9IGVsc2UgaWYgKHJlcXVpcmVTdGFydFRMUykgewogCQkgICAgbG9nZ2VyLmZpbmUoIlNUTFMgcmVxdWlyZWQgYnV0IGZhaWxlZCIpOwotCQkgICAgdHJ5IHsKLQkJCXAucXVpdCgpOwotCQkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewotCQkgICAgfSBmaW5hbGx5IHsKLQkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oIlNUTFMgcmVxdWlyZWQgYnV0IGZhaWxlZCIpOwotCQkgICAgfQorCQkgICAgdGhyb3cgY2xlYW51cEFuZFRocm93KHAsCisJCQkgICAgbmV3IEVPRkV4Y2VwdGlvbigiU1RMUyByZXF1aXJlZCBidXQgZmFpbGVkIikpOwogCQl9CiAJICAgIH0gZWxzZSBpZiAocmVxdWlyZVN0YXJ0VExTKSB7CiAJCWxvZ2dlci5maW5lKCJTVExTIHJlcXVpcmVkIGJ1dCBub3Qgc3VwcG9ydGVkIik7Ci0JCXRyeSB7Ci0JCSAgICBwLnF1aXQoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewotCQl9IGZpbmFsbHkgewotCQkgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigiU1RMUyByZXF1aXJlZCBidXQgbm90IHN1cHBvcnRlZCIpOwotCQl9CisJCXRocm93IGNsZWFudXBBbmRUaHJvdyhwLAorCQkJbmV3IEVPRkV4Y2VwdGlvbigiU1RMUyByZXF1aXJlZCBidXQgbm90IHN1cHBvcnRlZCIpKTsKIAkgICAgfQogCX0KIApAQCAtMzEyLDEyICszMDYsNyBAQAogCiAJU3RyaW5nIG1zZyA9IG51bGw7CiAJaWYgKChtc2cgPSBwLmxvZ2luKHVzZXIsIHBhc3N3ZCkpICE9IG51bGwpIHsKLQkgICAgdHJ5IHsKLQkJcC5xdWl0KCk7Ci0JICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKLQkgICAgfSBmaW5hbGx5IHsKLQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbihtc2cpOwotCSAgICB9CisJICAgIHRocm93IGNsZWFudXBBbmRUaHJvdyhwLCBuZXcgRU9GRXhjZXB0aW9uKG1zZykpOwogCX0KIAogCS8qCkBAIC0zMzcsNiArMzI2LDMwIEBACiAJcmV0dXJuIHA7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgSU9FeGNlcHRpb24gY2xlYW51cEFuZFRocm93KFByb3RvY29sIHAsIElPRXhjZXB0aW9uIGlmZSkgeworCXRyeSB7CisJICAgIHAucXVpdCgpOworCX0gY2F0Y2ggKFRocm93YWJsZSB0aHIpIHsKKwkgICAgaWYgKGlzUmVjb3ZlcmFibGUodGhyKSkgeworCQlpZmUuYWRkU3VwcHJlc3NlZCh0aHIpOworCSAgICB9IGVsc2UgeworCQl0aHIuYWRkU3VwcHJlc3NlZChpZmUpOworCQlpZiAodGhyIGluc3RhbmNlb2YgRXJyb3IpIHsKKwkJICAgIHRocm93IChFcnJvcikgdGhyOworCQl9CisJCWlmICh0aHIgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisJCSAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgdGhyOworCQl9CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHRocik7CisJICAgIH0KKwl9CisJcmV0dXJuIGlmZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVjb3ZlcmFibGUoVGhyb3dhYmxlIHQpIHsKKwlyZXR1cm4gKHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHx8ICh0IGluc3RhbmNlb2YgTGlua2FnZUVycm9yKTsKKyAgICB9CisKICAgICBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZVBvcnQoUE9QM0ZvbGRlciBvd25lcikgewogCWlmIChwb3J0T3duZXIgPT0gb3duZXIpIHsKIAkgICAgcG9ydCA9IG51bGw7CkBAIC0zNDQsNiArMzU3LDcgQEAKIAl9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2xvc2UoZmFsc2UpOwogICAgIH0KQEAgLTM2NSw2ICszNzksNyBAQAogCX0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyIGdldERlZmF1bHRGb2xkZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAljaGVja0Nvbm5lY3RlZCgpOwogCXJldHVybiBuZXcgRGVmYXVsdEZvbGRlcih0aGlzKTsKQEAgLTM3MywxMSArMzg4LDEzIEBACiAgICAgLyoqCiAgICAgICogT25seSB0aGUgbmFtZSAiSU5CT1giIGlzIHN1cHBvcnRlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRm9sZGVyIGdldEZvbGRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJY2hlY2tDb25uZWN0ZWQoKTsKIAlyZXR1cm4gbmV3IFBPUDNGb2xkZXIodGhpcywgbmFtZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZvbGRlciBnZXRGb2xkZXIoVVJMTmFtZSB1cmwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWNoZWNrQ29ubmVjdGVkKCk7CiAJcmV0dXJuIG5ldyBQT1AzRm9sZGVyKHRoaXMsIHVybC5nZXRGaWxlKCkpOwpAQCAtNDE5LDYgKzQzNiw3IEBACiAJcmV0dXJuIHVzaW5nU1NMOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAJdHJ5IHsKIAkgICAgaWYgKHBvcnQgIT0gbnVsbCkJLy8gZG9uJ3QgZm9yY2UgYSBjb25uZWN0aW9uIGF0dGVtcHQKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9Qcm90b2NvbC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1Byb3RvY29sLmphdmEKaW5kZXggODg1ZDk4NC4uZTUzYTRjNCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1Byb3RvY29sLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1Byb3RvY29sLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00Nyw3ICs0NywxMyBAQAogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OwogCi1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Qcm9wVXRpbDsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NYWlsTG9nZ2VyOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlNvY2tldEZldGNoZXI7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTGluZUlucHV0U3RyZWFtOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlRyYWNlSW5wdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuVHJhY2VPdXRwdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuU2hhcmVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogCiBjbGFzcyBSZXNwb25zZSB7CiAgICAgYm9vbGVhbiBvayA9IGZhbHNlOwkJLy8gdHJ1ZSBpZiAiK09LIgpAQCAtMTEzLDE5ICsxMTksMTEgQEAKIAkgICAgaW5pdFN0cmVhbXMoKTsKIAkgICAgciA9IHNpbXBsZUNvbW1hbmQobnVsbCk7CiAJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JICAgIHRyeSB7Ci0JCXNvY2tldC5jbG9zZSgpOwotCSAgICB9IGZpbmFsbHkgewotCQl0aHJvdyBpb2U7Ci0JICAgIH0KKwkgICAgdGhyb3cgY2xlYW51cEFuZFRocm93KHNvY2tldCwgaW9lKTsKIAl9CiAKIAlpZiAoIXIub2spIHsKLQkgICAgdHJ5IHsKLQkJc29ja2V0LmNsb3NlKCk7Ci0JICAgIH0gZmluYWxseSB7Ci0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ubmVjdCBmYWlsZWQiKTsKLQkgICAgfQorCSAgICB0aHJvdyBjbGVhbnVwQW5kVGhyb3coc29ja2V0LCBuZXcgSU9FeGNlcHRpb24oIkNvbm5lY3QgZmFpbGVkIikpOwogCX0KIAlpZiAoZW5hYmxlQVBPUCAmJiByLmRhdGEgIT0gbnVsbCkgewogCSAgICBpbnQgY2hhbGxTdGFydCA9IHIuZGF0YS5pbmRleE9mKCc8Jyk7CS8vIHN0YXJ0IG9mIGNoYWxsZW5nZQpAQCAtMTQ1LDYgKzE0MywzMCBAQAogCSAgICBsb2dnZXIuY29uZmlnKCJQSVBFTElOSU5HIGVuYWJsZWQiKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBJT0V4Y2VwdGlvbiBjbGVhbnVwQW5kVGhyb3coU29ja2V0IHNvY2tldCwgSU9FeGNlcHRpb24gaWZlKSB7CisJdHJ5IHsKKwkgICAgc29ja2V0LmNsb3NlKCk7CisJfSBjYXRjaCAoVGhyb3dhYmxlIHRocikgeworCSAgICBpZiAoaXNSZWNvdmVyYWJsZSh0aHIpKSB7CisJCWlmZS5hZGRTdXBwcmVzc2VkKHRocik7CisJICAgIH0gZWxzZSB7CisJCXRoci5hZGRTdXBwcmVzc2VkKGlmZSk7CisJCWlmICh0aHIgaW5zdGFuY2VvZiBFcnJvcikgeworCQkgICAgdGhyb3cgKEVycm9yKSB0aHI7CisJCX0KKwkJaWYgKHRociBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKwkJICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0aHI7CisJCX0KKwkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgdGhyKTsKKwkgICAgfQorCX0KKwlyZXR1cm4gaWZlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZWNvdmVyYWJsZShUaHJvd2FibGUgdCkgeworCXJldHVybiAodCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgfHwgKHQgaW5zdGFuY2VvZiBMaW5rYWdlRXJyb3IpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBib29sZWFuIHByb3BlcnR5LgogICAgICAqIFByaW50IG91dCB0aGUgdmFsdWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLgpAQCAtMTc2LDYgKzE5OCw3IEBACiAJCQluZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHRyYWNlT3V0cHV0LCAiaXNvLTg4NTktMSIpKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAl0cnkgewogCSAgICBpZiAoc29ja2V0ICE9IG51bGwpCS8vIEZvcmdvdCB0byBsb2dvdXQgPyEKQEAgLTE5NCw3ICsyMTcsNyBAQAogCSAgICByZXR1cm47CiAJfQogCi0JY2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDEwKTsKKwljYXBhYmlsaXRpZXMgPSBuZXcgSGFzaE1hcDw+KDEwKTsKIAlCdWZmZXJlZFJlYWRlciByID0gbnVsbDsKIAl0cnkgewogCSAgICByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgInVzLWFzY2lpIikpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1N0YXR1cy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1N0YXR1cy5qYXZhCmluZGV4IDMwOWFhNzUuLjJhNjVjY2IgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9TdGF0dXMuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvU3RhdHVzLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvVGVtcEZpbGUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9UZW1wRmlsZS5qYXZhCmluZGV4IDZjMDE0NDIuLjQ3NDhiZTEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9UZW1wRmlsZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9UZW1wRmlsZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtODAsNiArODAsNyBAQAogCWZpbGUuZGVsZXRlKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAl0cnkgewogCSAgICBjbG9zZSgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1dyaXRhYmxlU2hhcmVkRmlsZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9wb3AzL1dyaXRhYmxlU2hhcmVkRmlsZS5qYXZhCmluZGV4IGYyN2ZkZTguLjdhODkwYzYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9Xcml0YWJsZVNoYXJlZEZpbGUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvV3JpdGFibGVTaGFyZWRGaWxlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03NCw2ICs3NCw3IEBACiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBmaWxlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJdHJ5IHsKIAkgICAgc3VwZXIuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9wYWNrYWdlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3BvcDMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EzNzc2Li4wMDAwMDAwCi0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvcG9wMy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0KLQotICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKLSAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAotICAgIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gICAgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCi0gICAgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAgICBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCi0gICAgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gICAgZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgotCi0gICAgR1BMIENsYXNzcGF0aCBFeGNlcHRpb246Ci0gICAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKLSAgICBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAgICBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotCi0gICAgTW9kaWZpY2F0aW9uczoKLSAgICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcwotICAgIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICBDb250cmlidXRvcihzKToKLSAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAgICBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZyAiW0NvbnRyaWJ1dG9yXQotICAgIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcyBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTAotICAgIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAgICByZWNpcGllbnQgaGFzIHRoZSBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi0gICAgZWl0aGVyIHRoZSBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvCi0gICAgaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gICAgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZSBvcHRpb24gYXBwbGllcwotICAgIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0Ci0gICAgaG9sZGVyLgotCi0tLT4KLQotPC9IRUFEPgotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi1BIFBPUDMgcHJvdG9jb2wgcHJvdmlkZXIgZm9yIHRoZSBKYXZhTWFpbCBBUEkKLXRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgUE9QMyBtZXNzYWdlIHN0b3JlLgotUmVmZXIgdG8gPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTkzOS50eHQiIFRBUkdFVD0iX3RvcCI+Ci1SRkMgMTkzOTwvQT4KLWZvciBtb3JlIGluZm9ybWF0aW9uLgotPFA+Ci1UaGUgUE9QMyBwcm92aWRlciBwcm92aWRlcyBhIFN0b3JlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIEZvbGRlcgotbmFtZWQgIklOQk9YIi4gRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgUE9QMyBwcm90b2NvbCwgbWFueSBvZgotdGhlIEphdmFNYWlsIEFQSSBjYXBhYmlsaXRpZXMgbGlrZSBldmVudCBub3RpZmljYXRpb24sIGZvbGRlciBtYW5hZ2VtZW50LAotZmxhZyBtYW5hZ2VtZW50LCBldGMuIGFyZSBub3QgYWxsb3dlZC4gIFRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgdGhyb3cKLXRoZSBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXhjZXB0aW9uOyBzZWUgYmVsb3cgZm9yIGRldGFpbHMuCi08UD4KLU5vdGUgdGhhdCBKYXZhTWFpbCBkb2VzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGluY2x1ZGUgYSBsb2NhbCBzdG9yZSBpbnRvCi13aGljaCBtZXNzYWdlcyBjYW4gYmUgZG93bmxvYWRlZCBhbmQgc3RvcmVkLiAgU2VlIG91cgotPEEgSFJFRj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhbWFpbC9UaGlyZF9QYXJ0eS5odG1sIiBUQVJHRVQ9Il90b3AiPgotVGhpcmQgUGFydHkgUHJvZHVjdHM8L0E+Ci13ZWIgcGFnZSBmb3IgYXZhaWxhYmlsaXR5IG9mICJtYm94IiBhbmQgIk1IIiBsb2NhbCBzdG9yZSBwcm92aWRlcnMuCi08UD4KLVRoZSBQT1AzIHByb3ZpZGVyIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIEphdmFNYWlsIEFQSXMgYnkgdXNpbmcgdGhlIHByb3RvY29sCi1uYW1lICJwb3AzIiBvciBhIFVSTCBvZiB0aGUgZm9ybSAicG9wMzovL3VzZXI6cGFzc3dvcmRAaG9zdDpwb3J0L0lOQk9YIi4KLTxQPgotUE9QMyBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIGZvbGRlciBuYW1lZCAiSU5CT1giLgotPFA+Ci1QT1AzIHN1cHBvcnRzIDxzdHJvbmc+bm88L3N0cm9uZz4gcGVybWFuZW50IGZsYWdzIChzZWUKLXtAbGluayBqYXZheC5tYWlsLkZvbGRlciNnZXRQZXJtYW5lbnRGbGFncyBGb2xkZXIuZ2V0UGVybWFuZW50RmxhZ3MoKX0pLgotSW4gcGFydGljdWxhciwgdGhlIDxjb2RlPkZsYWdzLkZsYWcuUkVDRU5UPC9jb2RlPiBmbGFnIHdpbGwgbmV2ZXIgYmUgc2V0Ci1mb3IgUE9QMwotbWVzc2FnZXMuICBJdCdzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbWVzc2FnZXMgaW4gYQotUE9QMyBtYWlsYm94IGFyZSAibmV3Ii4gIFRoZXJlIGFyZSBzZXZlcmFsIHN0cmF0ZWdpZXMgdG8gYWNjb21wbGlzaAotdGhpcywgZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBlbnZpcm9ubWVudDoKLTxQPgotPFVMPgotPExJPgotQSBzaW1wbGUgYXBwcm9hY2ggd291bGQgYmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbmV3ZXN0Ci1tZXNzYWdlIHNlZW4gYnkgdGhlIGFwcGxpY2F0aW9uLgotPC9MST4KLTxMST4KLUFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIFVJRHMgKHNlZSBiZWxvdykKLW9mIGFsbCBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBzZWVuLgotPC9MST4KLTxMST4KLUFub3RoZXIgYXBwcm9hY2ggaXMgdG8gZG93bmxvYWQgPHN0cm9uZz5hbGw8L3N0cm9uZz4gbWVzc2FnZXMgaW50byBhIGxvY2FsCi1tYWlsYm94LCBzbyB0aGF0IGFsbCBtZXNzYWdlcyBpbiB0aGUgUE9QMyBtYWlsYm94IGFyZSwgYnkKLWRlZmluaXRpb24sIG5ldy4KLTwvTEk+Ci08L1VMPgotPFA+Ci1BbGwgYXBwcm9hY2hlcyB3aWxsIHJlcXVpcmUgc29tZSBwZXJtYW5lbnQgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudC4KLTxQPgotUE9QMyBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8Y29kZT5Gb2xkZXIuZXhwdW5nZSgpPC9jb2RlPiBtZXRob2QuICBUbyBkZWxldGUgYW5kCi1leHB1bmdlIG1lc3NhZ2VzLCBzZXQgdGhlIDxjb2RlPkZsYWdzLkZsYWcuREVMRVRFRDwvY29kZT4gZmxhZyBvbiB0aGUgbWVzc2FnZXMKLWFuZCBjbG9zZSB0aGUgZm9sZGVyIHVzaW5nIHRoZSA8Y29kZT5Gb2xkZXIuY2xvc2UodHJ1ZSk8L2NvZGU+IG1ldGhvZC4gIFlvdQotY2Fubm90IGV4cHVuZ2Ugd2l0aG91dCBjbG9zaW5nIHRoZSBmb2xkZXIuCi08UD4KLVBPUDMgZG9lcyBub3QgcHJvdmlkZSBhICJyZWNlaXZlZCBkYXRlIiwgc28gdGhlIDxjb2RlPmdldFJlY2VpdmVkRGF0ZTwvY29kZT4KLW1ldGhvZCB3aWxsIHJldHVybiBudWxsLgotSXQgbWF5IGJlIHBvc3NpYmxlIHRvIGV4YW1pbmUgb3RoZXIgbWVzc2FnZSBoZWFkZXJzIChlLmcuLCB0aGUKLSJSZWNlaXZlZCIgaGVhZGVycykgdG8gZXN0aW1hdGUgdGhlIHJlY2VpdmVkIGRhdGUsIGJ1dCB0aGVzZSB0ZWNobmlxdWVzCi1hcmUgZXJyb3ItcHJvbmUgYXQgYmVzdC4KLTxQPgotVGhlIFBPUDMgcHJvdmlkZXIgc3VwcG9ydHMgdGhlIFBPUDMgVUlETCBjb21tYW5kLCBzZWUKLXtAbGluayBjb20uc3VuLm1haWwucG9wMy5QT1AzRm9sZGVyI2dldFVJRCBQT1AzRm9sZGVyLmdldFVJRCgpfS4KLVlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3M6Ci08UD4KLTxCTE9DS1FVT1RFPjxQUkU+Ci1pZiAoZm9sZGVyIGluc3RhbmNlb2YgY29tLnN1bi5tYWlsLnBvcDMuUE9QM0ZvbGRlcikgewotICAgIGNvbS5zdW4ubWFpbC5wb3AzLlBPUDNGb2xkZXIgcGYgPQotCShjb20uc3VuLm1haWwucG9wMy5QT1AzRm9sZGVyKWZvbGRlcjsKLSAgICBTdHJpbmcgdWlkID0gcGYuZ2V0VUlEKG1zZyk7Ci0gICAgaWYgKHVpZCAhPSBudWxsKQotCS4uLiAvLyB1c2UgaXQKLX0KLTwvUFJFPjwvQkxPQ0tRVU9URT4KLTxQPgotWW91IGNhbiBhbHNvIHByZS1mZXRjaCBhbGwgdGhlIFVJRHMgZm9yIGFsbCBtZXNzYWdlcyBsaWtlIHRoaXM6Ci08UD4KLTxCTE9DS1FVT1RFPjxQUkU+Ci1GZXRjaFByb2ZpbGUgZnAgPSBuZXcgRmV0Y2hQcm9maWxlKCk7Ci1mcC5hZGQoVUlERm9sZGVyLkZldGNoUHJvZmlsZUl0ZW0uVUlEKTsKLWZvbGRlci5mZXRjaChmb2xkZXIuZ2V0TWVzc2FnZXMoKSwgZnApOwotPC9QUkU+PC9CTE9DS1FVT1RFPgotPFA+Ci1UaGVuIHVzZSB0aGUgdGVjaG5pcXVlIGFib3ZlIHRvIGdldCB0aGUgVUlEIGZvciBlYWNoIG1lc3NhZ2UuICBUaGlzIGlzCi1zaW1pbGFyIHRvIHRoZSB0ZWNobmlxdWUgdXNlZCB3aXRoIHRoZSBVSURGb2xkZXIgaW50ZXJmYWNlIHN1cHBvcnRlZCBieQotSU1BUCwgYnV0IG5vdGUgdGhhdCBQT1AzIFVJRHMgYXJlIHN0cmluZ3MsIG5vdCBpbnRlZ2VycyBsaWtlIElNQVAKLVVJRHMuICBTZWUgdGhlIFBPUDMgc3BlYyBmb3IgZGV0YWlscy4KLTxQPgotV2hlbiB0aGUgaGVhZGVycyBvZiBhIFBPUDMgbWVzc2FnZSBhcmUgYWNjZXNzZWQsIHRoZSBQT1AzIHByb3ZpZGVyIHVzZXMKLXRoZSBUT1AgY29tbWFuZCB0byBmZXRjaCBhbGwgaGVhZGVycywgd2hpY2ggYXJlIHRoZW4gY2FjaGVkLiAgVXNlIG9mIHRoZQotVE9QIGNvbW1hbmQgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIDxDT0RFPm1haWwucG9wMy5kaXNhYmxldG9wPC9DT0RFPgotcHJvcGVydHksIGluIHdoaWNoIGNhc2UgdGhlIGVudGlyZSBtZXNzYWdlIGNvbnRlbnQgaXMgZmV0Y2hlZCB3aXRoIHRoZQotUkVUUiBjb21tYW5kLgotPFA+Ci1XaGVuIHRoZSBjb250ZW50IG9mIGEgUE9QMyBtZXNzYWdlIGlzIGFjY2Vzc2VkLCB0aGUgUE9QMyBwcm92aWRlciB1c2VzCi10aGUgUkVUUiBjb21tYW5kIHRvIGZldGNoIHRoZSBlbnRpcmUgbWVzc2FnZS4gIE5vcm1hbGx5IHRoZSBtZXNzYWdlCi1jb250ZW50IGlzIGNhY2hlZCBpbiBtZW1vcnkuICBCeSBzZXR0aW5nIHRoZQotPENPREU+bWFpbC5wb3AzLmZpbGVjYWNoZS5lbmFibGU8L0NPREU+IHByb3BlcnR5LCB0aGUgbWVzc2FnZSBjb250ZW50Ci13aWxsIGluc3RlYWQgYmUgY2FjaGVkIGluIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGUgZmlsZSB3aWxsIGJlIHJlbW92ZWQKLXdoZW4gdGhlIGZvbGRlciBpcyBjbG9zZWQuICBDYWNoaW5nIG1lc3NhZ2UgY29udGVudCBpbiBhIGZpbGUgaXMgZ2VuZXJhbGx5Ci1zbG93ZXIsIGJ1dCB1c2VzIHN1YnN0YW50aWFsbHkgbGVzcyBtZW1vcnkgYW5kIG1heSBiZSBoZWxwZnVsIHdoZW4gZGVhbGluZwotd2l0aCB2ZXJ5IGxhcmdlIG1lc3NhZ2VzLgotPFA+Ci1UaGUge0BsaW5rIGNvbS5zdW4ubWFpbC5wb3AzLlBPUDNNZXNzYWdlI2ludmFsaWRhdGUgUE9QM01lc3NhZ2UuaW52YWxpZGF0ZX0KLW1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbnZhbGlkYXRlIGNhY2hlZCBkYXRhIHdpdGhvdXQgY2xvc2luZyB0aGUgZm9sZGVyLgotTm90ZSB0aGF0IGlmIHRoZSBmaWxlIGNhY2hlIGlzIGJlaW5nIHVzZWQgdGhlIGRhdGEgaW4gdGhlIGZpbGUgd2lsbCBiZQotZm9yZ290dGVuIGFuZCBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciBpZiBpdCdzIG5lZWRlZCBhZ2FpbiwgYW5kIHN0b3JlZCBhZ2FpbgotaW4gdGhlIGZpbGUgY2FjaGUuCi08UD4KLVRoZSBQT1AzIENBUEEgY29tbWFuZCAoZGVmaW5lZCBieQotPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjQ0OS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDI0NDk8L0E+KQotd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgY2FwYWJpbGl0aWVzIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotU29tZSBzZXJ2ZXJzIGRvbid0IGltcGxlbWVudCB0aGUgQ0FQQSBjb21tYW5kLCBhbmQgc29tZSBzZXJ2ZXJzIGRvbid0Ci1yZXR1cm4gY29ycmVjdCBpbmZvcm1hdGlvbiwgc28gdmFyaW91cyBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUgdG8KLWRpc2FibGUgdXNlIG9mIGNlcnRhaW4gUE9QMyBjb21tYW5kcywgaW5jbHVkaW5nIENBUEEuCi08UD4KLUlmIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyB0aGUgUElQRUxJTklORyBjYXBhYmlsaXR5IChkZWZpbmVkIGJ5Ci08QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNDQ5LnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMjQ0OTwvQT4pLAotb3IgdGhlIDxDT0RFPm1haWwucG9wMy5waXBlbGluaW5nPC9DT0RFPiBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBQT1AzCi1wcm92aWRlciB3aWxsIHNlbmQgc29tZSBjb21tYW5kcyBpbiBiYXRjaGVzLCB3aGljaCBjYW4gc2lnbmlmaWNhbnRseQotaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5IHVzZS4KLVNvbWUgc2VydmVycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIENBUEEgY29tbWFuZCBvciBkb24ndCBhZHZlcnRpc2UKLVBJUEVMSU5JTkcgbWF5IHN0aWxsIHN1cHBvcnQgcGlwZWxpbmluZzsgZXhwZXJpbWVudGF0aW9uIG1heSBiZSByZXF1aXJlZC4KLTxQPgotSWYgcGlwZWxpbmluZyBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIGlzIHVzaW5nCi1TU0wsIHRoZSBVU0VSIGFuZCBQQVNTIGNvbW1hbmRzIHdpbGwgYmUgc2VudCBhcyBhIGJhdGNoLgotKElmIFNTTCBpcyBub3QgYmVpbmcgdXNlZCwgdGhlIFBBU1MgY29tbWFuZCBpc24ndCBzZW50Ci11bnRpbCB0aGUgdXNlciBpcyB2ZXJpZmllZCB0byBhdm9pZCBleHBvc2luZyB0aGUgcGFzc3dvcmQKLWlmIHRoZSB1c2VyIG5hbWUgaXMgYmFkLikKLTxQPgotSWYgcGlwZWxpbmluZyBpcyBzdXBwb3J0ZWQsIHdoZW4gZmV0Y2hpbmcgYSBtZXNzYWdlIHdpdGggdGhlIFJFVFIgY29tbWFuZCwKLXRoZSBMSVNUIGNvbW1hbmQgd2lsbCBiZSBzZW50IGFzIHdlbGwsIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgdXNlZCB0byBzaXplCi10aGUgSS9PIGJ1ZmZlciwgZ3JlYXRseSByZWR1Y2luZyBtZW1vcnkgdXNhZ2Ugd2hlbiBmZXRjaGluZyBtZXNzYWdlcy4KLTxQPgotPEEgTkFNRT0icHJvcGVydGllcyI+Ci08SDQ+UHJvcGVydGllczwvSDQ+Ci08L0E+Ci1UaGUgUE9QMyBwcm90b2NvbCBwcm92aWRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMsCi13aGljaCBtYXkgYmUgc2V0IGluIHRoZSBKYXZhTWFpbCA8Y29kZT5TZXNzaW9uPC9jb2RlPiBvYmplY3QuCi1UaGUgcHJvcGVydGllcyBhcmUgYWx3YXlzIHNldCBhcyBzdHJpbmdzOyB0aGUgVHlwZSBjb2x1bW4gZGVzY3JpYmVzCi1ob3cgdGhlIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gIEZvciBleGFtcGxlLCB1c2UKLTxQUkU+Ci0JcHJvcHMucHV0KCJtYWlsLnBvcDMucG9ydCIsICI4ODgiKTsKLTwvUFJFPgotdG8gc2V0IHRoZSA8Q09ERT5tYWlsLnBvcDMucG9ydDwvQ09ERT4gcHJvcGVydHksIHdoaWNoIGlzIG9mIHR5cGUgaW50LgotPFA+Ci1Ob3RlIHRoYXQgaWYgeW91J3JlIHVzaW5nIHRoZSAicG9wM3MiIHByb3RvY29sIHRvIGFjY2VzcyBQT1AzIG92ZXIgU1NMLAotYWxsIHRoZSBwcm9wZXJ0aWVzIHdvdWxkIGJlIG5hbWVkICJtYWlsLnBvcDNzLioiLgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPk5hbWU8L1RIPgotPFRIPlR5cGU8L1RIPgotPFRIPkRlc2NyaXB0aW9uPC9USD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy51c2VyIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy51c2VyIj4KLTxURD5tYWlsLnBvcDMudXNlcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD5EZWZhdWx0IHVzZXIgbmFtZSBmb3IgUE9QMy48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLmhvc3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLmhvc3QiPgotPFREPm1haWwucG9wMy5ob3N0PC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPlRoZSBQT1AzIHNlcnZlciB0byBjb25uZWN0IHRvLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMucG9ydCI+Ci08VEQ+bWFpbC5wb3AzLnBvcnQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+VGhlIFBPUDMgc2VydmVyIHBvcnQgdG8gY29ubmVjdCB0bywgaWYgdGhlIGNvbm5lY3QoKSBtZXRob2QgZG9lc24ndAotZXhwbGljaXRseSBzcGVjaWZ5IG9uZS4gRGVmYXVsdHMgdG8gMTEwLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuY29ubmVjdGlvbnRpbWVvdXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLmNvbm5lY3Rpb250aW1lb3V0Ij4KLTxURD5tYWlsLnBvcDMuY29ubmVjdGlvbnRpbWVvdXQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+U29ja2V0IGNvbm5lY3Rpb24gdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCi1UaGlzIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgYnkgamF2YS5uZXQuU29ja2V0LgotRGVmYXVsdCBpcyBpbmZpbml0ZSB0aW1lb3V0LjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMudGltZW91dCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMudGltZW91dCI+Ci08VEQ+bWFpbC5wb3AzLnRpbWVvdXQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+U29ja2V0IHJlYWQgdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCi1UaGlzIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgYnkgamF2YS5uZXQuU29ja2V0LgotRGVmYXVsdCBpcyBpbmZpbml0ZSB0aW1lb3V0LjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMud3JpdGV0aW1lb3V0Ij48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy53cml0ZXRpbWVvdXQiPgotPFREPm1haWwucG9wMy53cml0ZXRpbWVvdXQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+U29ja2V0IHdyaXRlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgotVGhpcyB0aW1lb3V0IGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIGEKLWphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBwZXIgY29ubmVjdGlvbgotdGhhdCBzY2hlZHVsZXMgYSB0aHJlYWQgdG8gY2xvc2UgdGhlIHNvY2tldCBpZiB0aGUgdGltZW91dCBleHBpcmVzLgotVGh1cywgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIHRoaXMgdGltZW91dCBpcyBvbmUgdGhyZWFkIHBlciBjb25uZWN0aW9uLgotRGVmYXVsdCBpcyBpbmZpbml0ZSB0aW1lb3V0LjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMucnNldGJlZm9yZXF1aXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLnJzZXRiZWZvcmVxdWl0Ij4KLTxURD5tYWlsLnBvcDMucnNldGJlZm9yZXF1aXQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotU2VuZCBhIFBPUDMgUlNFVCBjb21tYW5kIHdoZW4gY2xvc2luZyB0aGUgZm9sZGVyLCBiZWZvcmUgc2VuZGluZyB0aGUKLVFVSVQgY29tbWFuZC4gIFVzZWZ1bCB3aXRoIFBPUDMgc2VydmVycyB0aGF0IGltcGxpY2l0bHkgbWFyayBhbGwKLW1lc3NhZ2VzIHRoYXQgYXJlIHJlYWQgYXMgImRlbGV0ZWQiOyB0aGlzIHdpbGwgcHJldmVudCBzdWNoIG1lc3NhZ2VzCi1mcm9tIGJlaW5nIGRlbGV0ZWQgYW5kIGV4cHVuZ2VkIHVubGVzcyB0aGUgY2xpZW50IHJlcXVlc3RzIHNvLiAgRGVmYXVsdAotaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLm1lc3NhZ2UuY2xhc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLm1lc3NhZ2UuY2xhc3MiPgotPFREPm1haWwucG9wMy5tZXNzYWdlLmNsYXNzPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotQ2xhc3MgbmFtZSBvZiBhIHN1YmNsYXNzIG9mIDxjb2RlPmNvbS5zdW4ubWFpbC5wb3AzLlBPUDNNZXNzYWdlPC9jb2RlPi4KLVRoZSBzdWJjbGFzcyBjYW4gYmUgdXNlZCB0byBoYW5kbGUgKGZvciBleGFtcGxlKSBub24tc3RhbmRhcmQKLUNvbnRlbnQtVHlwZSBoZWFkZXJzLiAgVGhlIHN1YmNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3Rvcgotb2YgdGhlIGZvcm0gPGNvZGU+TXlQT1AzTWVzc2FnZShGb2xkZXIgZiwgaW50IG1zZ25vKQotdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbjwvY29kZT4uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLmxvY2FsYWRkcmVzcyI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMubG9jYWxhZGRyZXNzIj4KLTxURD5tYWlsLnBvcDMubG9jYWxhZGRyZXNzPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotTG9jYWwgYWRkcmVzcyAoaG9zdCBuYW1lKSB0byBiaW5kIHRvIHdoZW4gY3JlYXRpbmcgdGhlIFBPUDMgc29ja2V0LgotRGVmYXVsdHMgdG8gdGhlIGFkZHJlc3MgcGlja2VkIGJ5IHRoZSBTb2NrZXQgY2xhc3MuCi1TaG91bGQgbm90IG5vcm1hbGx5IG5lZWQgdG8gYmUgc2V0LCBidXQgdXNlZnVsIHdpdGggbXVsdGktaG9tZWQgaG9zdHMKLXdoZXJlIGl0J3MgaW1wb3J0YW50IHRvIHBpY2sgYSBwYXJ0aWN1bGFyIGxvY2FsIGFkZHJlc3MgdG8gYmluZCB0by4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMubG9jYWxwb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5sb2NhbHBvcnQiPgotPFREPm1haWwucG9wMy5sb2NhbHBvcnQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+Ci1Mb2NhbCBwb3J0IG51bWJlciB0byBiaW5kIHRvIHdoZW4gY3JlYXRpbmcgdGhlIFBPUDMgc29ja2V0LgotRGVmYXVsdHMgdG8gdGhlIHBvcnQgbnVtYmVyIHBpY2tlZCBieSB0aGUgU29ja2V0IGNsYXNzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5hcG9wLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuYXBvcC5lbmFibGUiPgotPFREPm1haWwucG9wMy5hcG9wLmVuYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdXNlIEFQT1AgaW5zdGVhZCBvZiBVU0VSL1BBU1MgdG8gbG9naW4gdG8gdGhlCi1QT1AzIHNlcnZlciwgaWYgdGhlIFBPUDMgc2VydmVyIHN1cHBvcnRzIEFQT1AuICBBUE9QIHNlbmRzIGEKLWRpZ2VzdCBvZiB0aGUgcGFzc3dvcmQgcmF0aGVyIHRoYW4gdGhlIGNsZWFyIHRleHQgcGFzc3dvcmQuCi1EZWZhdWx0cyB0byBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeSI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeSI+Ci08VEQ+bWFpbC5wb3AzLnNvY2tldEZhY3Rvcnk8L1REPgotPFREPlNvY2tldEZhY3Rvcnk8L1REPgotPFREPgotSWYgc2V0IHRvIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQotPGNvZGU+amF2YXgubmV0LlNvY2tldEZhY3Rvcnk8L2NvZGU+IGludGVyZmFjZSwgdGhpcyBjbGFzcwotd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBQT1AzIHNvY2tldHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhbgotaW5zdGFuY2Ugb2YgYSBjbGFzcywgbm90IGEgbmFtZSwgYW5kIG11c3QgYmUgc2V0IHVzaW5nIHRoZQotPGNvZGU+cHV0PC9jb2RlPiBtZXRob2QsIG5vdCB0aGUgPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IG1ldGhvZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5jbGFzcyI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5jbGFzcyI+Ci08VEQ+bWFpbC5wb3AzLnNvY2tldEZhY3RvcnkuY2xhc3M8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1JZiBzZXQsIHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLTxjb2RlPmphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5PC9jb2RlPiBpbnRlcmZhY2UuICBUaGlzIGNsYXNzCi13aWxsIGJlIHVzZWQgdG8gY3JlYXRlIFBPUDMgc29ja2V0cy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5mYWxsYmFjayI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5mYWxsYmFjayI+Ci08VEQ+bWFpbC5wb3AzLnNvY2tldEZhY3RvcnkuZmFsbGJhY2s8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIGZhaWx1cmUgdG8gY3JlYXRlIGEgc29ja2V0IHVzaW5nIHRoZSBzcGVjaWZpZWQKLXNvY2tldCBmYWN0b3J5IGNsYXNzIHdpbGwgY2F1c2UgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkIHVzaW5nCi10aGUgPGNvZGU+amF2YS5uZXQuU29ja2V0PC9jb2RlPiBjbGFzcy4KLURlZmF1bHRzIHRvIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNvY2tldEZhY3RvcnkucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5wb3J0Ij4KLTxURD5tYWlsLnBvcDMuc29ja2V0RmFjdG9yeS5wb3J0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gd2hlbiB1c2luZyB0aGUgc3BlY2lmaWVkIHNvY2tldAotZmFjdG9yeS4KLUlmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IHBvcnQgd2lsbCBiZSB1c2VkLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5zc2wuZW5hYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5zc2wuZW5hYmxlIj4KLTxURD5tYWlsLnBvcDMuc3NsLmVuYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdXNlIFNTTCB0byBjb25uZWN0IGFuZCB1c2UgdGhlIFNTTCBwb3J0IGJ5IGRlZmF1bHQuCi1EZWZhdWx0cyB0byBmYWxzZSBmb3IgdGhlICJwb3AzIiBwcm90b2NvbCBhbmQgdHJ1ZSBmb3IgdGhlICJwb3AzcyIgcHJvdG9jb2wuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNzbC5jaGVja3NlcnZlcmlkZW50aXR5Ij48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5zc2wuY2hlY2tzZXJ2ZXJpZGVudGl0eSI+Ci08VEQ+bWFpbC5wb3AzLnNzbC5jaGVja3NlcnZlcmlkZW50aXR5PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCBjaGVjayB0aGUgc2VydmVyIGlkZW50aXR5IGFzIHNwZWNpZmllZCBieQotPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjU5NS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDI1OTU8L0E+LgotVGhlc2UgYWRkaXRpb25hbCBjaGVja3MgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlCi1hcmUgaW50ZW5kZWQgdG8gcHJldmVudCBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNzbC50cnVzdCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc3NsLnRydXN0Ij4KLTxURD5tYWlsLnBvcDMuc3NsLnRydXN0PC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotSWYgc2V0LCBhbmQgYSBzb2NrZXQgZmFjdG9yeSBoYXNuJ3QgYmVlbiBzcGVjaWZpZWQsIGVuYWJsZXMgdXNlIG9mIGEKLXtAbGluayBjb20uc3VuLm1haWwudXRpbC5NYWlsU1NMU29ja2V0RmFjdG9yeSBNYWlsU1NMU29ja2V0RmFjdG9yeX0uCi1JZiBzZXQgdG8gIioiLCBhbGwgaG9zdHMgYXJlIHRydXN0ZWQuCi1JZiBzZXQgdG8gYSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGhvc3RzLCB0aG9zZSBob3N0cyBhcmUgdHJ1c3RlZC4KLU90aGVyd2lzZSwgdHJ1c3QgZGVwZW5kcyBvbiB0aGUgY2VydGlmaWNhdGUgdGhlIHNlcnZlciBwcmVzZW50cy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc3NsLnNvY2tldEZhY3RvcnkiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLnNzbC5zb2NrZXRGYWN0b3J5Ij4KLTxURD5tYWlsLnBvcDMuc3NsLnNvY2tldEZhY3Rvcnk8L1REPgotPFREPlNTTFNvY2tldEZhY3Rvcnk8L1REPgotPFREPgotSWYgc2V0IHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZQotPGNvZGU+amF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5PC9jb2RlPiBjbGFzcywgdGhpcyBjbGFzcwotd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBQT1AzIFNTTCBzb2NrZXRzLiAgTm90ZSB0aGF0IHRoaXMgaXMgYW4KLWluc3RhbmNlIG9mIGEgY2xhc3MsIG5vdCBhIG5hbWUsIGFuZCBtdXN0IGJlIHNldCB1c2luZyB0aGUKLTxjb2RlPnB1dDwvY29kZT4gbWV0aG9kLCBub3QgdGhlIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2QuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNzbC5zb2NrZXRGYWN0b3J5LmNsYXNzIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5zc2wuc29ja2V0RmFjdG9yeS5jbGFzcyI+Ci08VEQ+bWFpbC5wb3AzLnNzbC5zb2NrZXRGYWN0b3J5LmNsYXNzPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotSWYgc2V0LCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlCi08Y29kZT5qYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk8L2NvZGU+IGNsYXNzLiAgVGhpcyBjbGFzcwotd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBQT1AzIFNTTCBzb2NrZXRzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5zc2wuc29ja2V0RmFjdG9yeS5wb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5zc2wuc29ja2V0RmFjdG9yeS5wb3J0Ij4KLTxURD5tYWlsLnBvcDMuc3NsLnNvY2tldEZhY3RvcnkucG9ydDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvIHdoZW4gdXNpbmcgdGhlIHNwZWNpZmllZCBzb2NrZXQKLWZhY3RvcnkuCi1JZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBwb3J0IHdpbGwgYmUgdXNlZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc3NsLnByb3RvY29scyI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc3NsLnByb3RvY29scyI+Ci08VEQ+bWFpbC5wb3AzLnNzbC5wcm90b2NvbHM8L1REPgotPFREPnN0cmluZzwvVEQ+Ci08VEQ+Ci1TcGVjaWZpZXMgdGhlIFNTTCBwcm90b2NvbHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQgZm9yIFNTTCBjb25uZWN0aW9ucy4KLVRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zIGFjY2VwdGFibGUKLXRvIHRoZSA8Y29kZT5qYXZheC5uZXQuc3NsLlNTTFNvY2tldC5zZXRFbmFibGVkUHJvdG9jb2xzPC9jb2RlPiBtZXRob2QuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNzbC5jaXBoZXJzdWl0ZXMiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLnNzbC5jaXBoZXJzdWl0ZXMiPgotPFREPm1haWwucG9wMy5zc2wuY2lwaGVyc3VpdGVzPC9URD4KLTxURD5zdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBTU0wgY2lwaGVyIHN1aXRlcyB0aGF0IHdpbGwgYmUgZW5hYmxlZCBmb3IgU1NMIGNvbm5lY3Rpb25zLgotVGhlIHByb3BlcnR5IHZhbHVlIGlzIGEgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0b2tlbnMgYWNjZXB0YWJsZQotdG8gdGhlIDxjb2RlPmphdmF4Lm5ldC5zc2wuU1NMU29ja2V0LnNldEVuYWJsZWRDaXBoZXJTdWl0ZXM8L2NvZGU+IG1ldGhvZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuc3RhcnR0bHMuZW5hYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5zdGFydHRscy5lbmFibGUiPgotPFREPm1haWwucG9wMy5zdGFydHRscy5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgdHJ1ZSwgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSA8Y29kZT5TVExTPC9jb2RlPiBjb21tYW5kIChpZgotc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIpIHRvIHN3aXRjaCB0aGUgY29ubmVjdGlvbiB0byBhIFRMUy1wcm90ZWN0ZWQKLWNvbm5lY3Rpb24gYmVmb3JlIGlzc3VpbmcgYW55IGxvZ2luIGNvbW1hbmRzLiAgTm90ZSB0aGF0IGFuIGFwcHJvcHJpYXRlCi10cnVzdCBzdG9yZSBtdXN0IGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgY2xpZW50IHdpbGwgdHJ1c3QgdGhlIHNlcnZlcidzCi1jZXJ0aWZpY2F0ZS4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5zdGFydHRscy5yZXF1aXJlZCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMuc3RhcnR0bHMucmVxdWlyZWQiPgotPFREPm1haWwucG9wMy5zdGFydHRscy5yZXF1aXJlZDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiB0cnVlLCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSA8Y29kZT5TVExTPC9jb2RlPiBjb21tYW5kLgotSWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFNUTFMgY29tbWFuZCwgb3IgdGhlIGNvbW1hbmQKLWZhaWxzLCB0aGUgY29ubmVjdCBtZXRob2Qgd2lsbCBmYWlsLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNvY2tzLmhvc3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLnNvY2tzLmhvc3QiPgotPFREPm1haWwucG9wMy5zb2Nrcy5ob3N0PC9URD4KLTxURD5zdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBob3N0IG5hbWUgb2YgYSBTT0NLUzUgcHJveHkgc2VydmVyIHRoYXQgd2lsbCBiZSB1c2VkIGZvcgotY29ubmVjdGlvbnMgdG8gdGhlIG1haWwgc2VydmVyLgotKE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gSkRLIDEuNSBvciBuZXdlci4pCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLnNvY2tzLnBvcnQiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLnNvY2tzLnBvcnQiPgotPFREPm1haWwucG9wMy5zb2Nrcy5wb3J0PC9URD4KLTxURD5zdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBwb3J0IG51bWJlciBmb3IgdGhlIFNPQ0tTNSBwcm94eSBzZXJ2ZXIuCi1UaGlzIHNob3VsZCBvbmx5IG5lZWQgdG8gYmUgdXNlZCBpZiB0aGUgcHJveHkgc2VydmVyIGlzIG5vdCB1c2luZwotdGhlIHN0YW5kYXJkIHBvcnQgbnVtYmVyIG9mIDEwODAuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLmRpc2FibGV0b3AiPjwvQT4KLTxUUiBpZD0ibWFpbC5wb3AzLmRpc2FibGV0b3AiPgotPFREPm1haWwucG9wMy5kaXNhYmxldG9wPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCB0aGUgUE9QMyBUT1AgY29tbWFuZCB3aWxsIG5vdCBiZSB1c2VkIHRvIGZldGNoCi1tZXNzYWdlIGhlYWRlcnMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgUE9QMyBzZXJ2ZXJzIHRoYXQgZG9uJ3QKLXByb3Blcmx5IGltcGxlbWVudCB0aGUgVE9QIGNvbW1hbmQsIG9yIHRoYXQgcHJvdmlkZSBpbmNvcnJlY3QKLWluZm9ybWF0aW9uIGluIHRoZSBUT1AgY29tbWFuZCByZXN1bHRzLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLmRpc2FibGVjYXBhIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5kaXNhYmxlY2FwYSI+Ci08VEQ+bWFpbC5wb3AzLmRpc2FibGVjYXBhPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCB0aGUgUE9QMyBDQVBBIGNvbW1hbmQgd2lsbCBub3QgYmUgdXNlZCB0byBmZXRjaAotc2VydmVyIGNhcGFiaWxpdGllcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBQT1AzIHNlcnZlcnMgdGhhdCBkb24ndAotcHJvcGVybHkgaW1wbGVtZW50IHRoZSBDQVBBIGNvbW1hbmQsIG9yIHRoYXQgcHJvdmlkZSBpbmNvcnJlY3QKLWluZm9ybWF0aW9uIGluIHRoZSBDQVBBIGNvbW1hbmQgcmVzdWx0cy4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5mb3JnZXR0b3BoZWFkZXJzIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5mb3JnZXR0b3BoZWFkZXJzIj4KLTxURD5tYWlsLnBvcDMuZm9yZ2V0dG9waGVhZGVyczwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdGhlIGhlYWRlcnMgdGhhdCBtaWdodCBoYXZlIGJlZW4gcmV0cmlldmVkIHVzaW5nCi10aGUgUE9QMyBUT1AgY29tbWFuZCB3aWxsIGJlIGZvcmdvdHRlbiBhbmQgcmVwbGFjZWQgYnkgaGVhZGVycwotcmV0cmlldmVkIGFzIHBhcnQgb2YgdGhlIFBPUDMgUkVUUiBjb21tYW5kLiAgU29tZSBzZXJ2ZXJzLCBzdWNoCi1hcyBzb21lIHZlcnNpb25zIG9mIE1pY3Jvc2Z0IEV4Y2hhbmdlIGFuZCBJQk0gTG90dXMgTm90ZXMsCi13aWxsIHJldHVybiBzbGlnaHRseSBkaWZmZXJlbnQKLWhlYWRlcnMgZWFjaCB0aW1lIHRoZSBUT1Agb3IgUkVUUiBjb21tYW5kIGlzIHVzZWQuICBUbyBhbGxvdyB0aGUKLVBPUDMgcHJvdmlkZXIgdG8gcHJvcGVybHkgcGFyc2UgdGhlIG1lc3NhZ2UgY29udGVudCByZXR1cm5lZCBmcm9tCi10aGUgUkVUUiBjb21tYW5kLCB0aGUgaGVhZGVycyBhbHNvIHJldHVybmVkIGJ5IHRoZSBSRVRSIGNvbW1hbmQKLW11c3QgYmUgdXNlZC4gIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHdpbGwgY2F1c2UgdGhlc2UKLWhlYWRlcnMgdG8gYmUgdXNlZCwgZXZlbiBpZiB0aGV5IGRpZmZlciBmcm9tIHRoZSBoZWFkZXJzIHJldHVybmVkCi1wcmV2aW91c2x5IGFzIGEgcmVzdWx0IG9mIHVzaW5nIHRoZSBUT1AgY29tbWFuZC4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5maWxlY2FjaGUuZW5hYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5maWxlY2FjaGUuZW5hYmxlIj4KLTxURD5tYWlsLnBvcDMuZmlsZWNhY2hlLmVuYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdGhlIFBPUDMgcHJvdmlkZXIgd2lsbCBjYWNoZSBtZXNzYWdlIGRhdGEgaW4gYSB0ZW1wb3JhcnkKLWZpbGUgcmF0aGVyIHRoYW4gaW4gbWVtb3J5LiAgTWVzc2FnZXMgYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGNhY2hlIHdoZW4KLWFjY2Vzc2luZyB0aGUgbWVzc2FnZSBjb250ZW50LiAgTWVzc2FnZSBoZWFkZXJzIGFyZSBhbHdheXMgY2FjaGVkIGluCi1tZW1vcnkgKG9uIGRlbWFuZCkuICBUaGUgZmlsZSBjYWNoZSBpcyByZW1vdmVkIHdoZW4gdGhlIGZvbGRlciBpcyBjbG9zZWQKLW9yIHRoZSBKVk0gdGVybWluYXRlcy4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucG9wMy5maWxlY2FjaGUuZGlyIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5maWxlY2FjaGUuZGlyIj4KLTxURD5tYWlsLnBvcDMuZmlsZWNhY2hlLmRpcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHRoZSBmaWxlIGNhY2hlIGlzIGVuYWJsZWQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBKREsgZm9yIHRlbXBvcmFyeSBmaWxlcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuY2FjaGV3cml0ZXRvIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5jYWNoZXdyaXRldG8iPgotPFREPm1haWwucG9wMy5jYWNoZXdyaXRldG88L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotQ29udHJvbHMgdGhlIGJlaGF2aW9yIG9mIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5wb3AzLlBPUDNNZXNzYWdlI3dyaXRlVG8gd3JpdGVUb30gbWV0aG9kCi1vbiBhIFBPUDMgbWVzc2FnZSBvYmplY3QuCi1JZiBzZXQgdG8gdHJ1ZSwgYW5kIHRoZSBtZXNzYWdlIGNvbnRlbnQgaGFzbid0IHlldCBiZWVuIGNhY2hlZCwKLWFuZCBpZ25vcmVMaXN0IGlzIG51bGwsIHRoZSBtZXNzYWdlIGlzIGNhY2hlZCBiZWZvcmUgYmVpbmcgd3JpdHRlbi4KLU90aGVyd2lzZSwgdGhlIG1lc3NhZ2UgaXMgc3RyZWFtZWQgZGlyZWN0bHkKLXRvIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGhvdXQgYmVpbmcgY2FjaGVkLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wb3AzLmtlZXBtZXNzYWdlY29udGVudCI+PC9BPgotPFRSIGlkPSJtYWlsLnBvcDMua2VlcG1lc3NhZ2Vjb250ZW50Ij4KLTxURD5tYWlsLnBvcDMua2VlcG1lc3NhZ2Vjb250ZW50PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVRoZSBjb250ZW50IG9mIGEgbWVzc2FnZSBpcyBjYWNoZWQgd2hlbiBpdCBpcyBmaXJzdCBmZXRjaGVkLgotTm9ybWFsbHkgdGhpcyBjYWNoZSB1c2VzIGEge0BsaW5rIGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZSBTb2Z0UmVmZXJlbmNlfQotdG8gcmVmZXIgdG8gdGhlIGNhY2hlZCBjb250ZW50LiAgVGhpcyBhbGxvd3MgdGhlIGNhY2hlZCBjb250ZW50IHRvIGJlIHB1cmdlZAotaWYgbWVtb3J5IGlzIGxvdywgaW4gd2hpY2ggY2FzZSB0aGUgY29udGVudCB3aWxsIGJlIGZldGNoZWQgYWdhaW4gaWYgaXQncwotbmVlZGVkLgotSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSwgYSBoYXJkIHJlZmVyZW5jZSB0byB0aGUgY2FjaGVkIGNvbnRlbnQKLXdpbGwgYmUga2VwdCwgcHJldmVudGluZyB0aGUgbWVtb3J5IGZyb20gYmVpbmcgcmV1c2VkIHVudGlsIHRoZSBmb2xkZXIKLWlzIGNsb3NlZCBvciB0aGUgY2FjaGVkIGNvbnRlbnQgaXMgZXhwbGljaXRseSBpbnZhbGlkYXRlZCAodXNpbmcgdGhlCi17QGxpbmsgY29tLnN1bi5tYWlsLnBvcDMuUE9QM01lc3NhZ2UjaW52YWxpZGF0ZSBpbnZhbGlkYXRlfSBtZXRob2QpLgotKFRoaXMgd2FzIHRoZSBiZWhhdmlvciBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBKYXZhTWFpbC4pCi1EZWZhdWx0cyB0byBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnBvcDMuZmluYWxpemVjbGVhbmNsb3NlIj48L0E+Ci08VFIgaWQ9Im1haWwucG9wMy5maW5hbGl6ZWNsZWFuY2xvc2UiPgotPFREPm1haWwucG9wMy5maW5hbGl6ZWNsZWFuY2xvc2U8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotV2hlbiB0aGUgZmluYWxpemVyIGZvciBQT1AzU3RvcmUgb3IgUE9QM0ZvbGRlciBpcyBjYWxsZWQsCi1zaG91bGQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBiZSBjbG9zZWQgY2xlYW5seSwgYXMgaWYgdGhlCi1hcHBsaWNhdGlvbiBjYWxsZWQgdGhlIGNsb3NlIG1ldGhvZD8KLU9yIHNob3VsZCB0aGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGJlIGNsb3NlZCB3aXRob3V0IHNlbmRpbmcKLWFueSBjb21tYW5kcyB0byB0aGUgc2VydmVyPwotRGVmYXVsdHMgdG8gZmFsc2UsIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBjbG9zZWQgY2xlYW5seS4KLTwvVEQ+Ci08L1RSPgotCi08L1RBQkxFPgotPFA+Ci1JbiBnZW5lcmFsLCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBuZWVkIHRvIHVzZSB0aGUgY2xhc3NlcyBpbiB0aGlzCi1wYWNrYWdlIGRpcmVjdGx5LiAgSW5zdGVhZCwgdGhleSBzaG91bGQgdXNlIHRoZSBBUElzIGRlZmluZWQgYnkKLTxjb2RlPmphdmF4Lm1haWw8L2NvZGU+IHBhY2thZ2UgKGFuZCBzdWJwYWNrYWdlcykuICBBcHBsaWNhdGlvbnMgc2hvdWxkCi1uZXZlciBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIDxjb2RlPlBPUDNTdG9yZTwvY29kZT4gb3IKLTxjb2RlPlBPUDNGb2xkZXI8L2NvZGU+IGRpcmVjdGx5LiAgSW5zdGVhZCwgdGhleSBzaG91bGQgdXNlIHRoZQotPGNvZGU+U2Vzc2lvbjwvY29kZT4gbWV0aG9kIDxjb2RlPmdldFN0b3JlPC9jb2RlPiB0byBhY3F1aXJlIGFuCi1hcHByb3ByaWF0ZSA8Y29kZT5TdG9yZTwvY29kZT4gb2JqZWN0LCBhbmQgZnJvbSB0aGF0IGFjcXVpcmUKLTxjb2RlPkZvbGRlcjwvY29kZT4gb2JqZWN0cy4KLTxQPgotSW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgZGVidWdnaW5nIG91dHB1dCBhcyBjb250cm9sbGVkIGJ5IHRoZQote0BsaW5rIGphdmF4Lm1haWwuU2Vzc2lvbiBTZXNzaW9ufSBjb25maWd1cmF0aW9uLAotdGhlIGNvbS5zdW4ubWFpbC5wb3AzIHByb3ZpZGVyIGxvZ3MgdGhlIHNhbWUgaW5mb3JtYXRpb24gdXNpbmcKLXtAbGluayBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXJ9IGFzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPkxvZ2dlciBOYW1lPC9USD4KLTxUSD5Mb2dnaW5nIExldmVsPC9USD4KLTxUSD5QdXJwb3NlPC9USD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwucG9wMzwvVEQ+Ci08VEQ+Q09ORklHPC9URD4KLTxURD5Db25maWd1cmF0aW9uIG9mIHRoZSBQT1AzU3RvcmU8L1REPgotPC9UUj4KLQotPFRSPgotPFREPmNvbS5zdW4ubWFpbC5wb3AzPC9URD4KLTxURD5GSU5FPC9URD4KLTxURD5HZW5lcmFsIGRlYnVnZ2luZyBvdXRwdXQ8L1REPgotPC9UUj4KLQotPFRSPgotPFREPmNvbS5zdW4ubWFpbC5wb3AzLnByb3RvY29sPC9URD4KLTxURD5GSU5FU1Q8L1REPgotPFREPkNvbXBsZXRlIHByb3RvY29sIHRyYWNlPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxzdHJvbmc+V0FSTklORzo8L3N0cm9uZz4gVGhlIEFQSXMgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSBzaG91bGQgYmUKLWNvbnNpZGVyZWQgPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uICBUaGV5IG1heSBiZSBjaGFuZ2VkIGluIHRoZQotZnV0dXJlIGluIHdheXMgdGhhdCBhcmUgaW5jb21wYXRpYmxlIHdpdGggYXBwbGljYXRpb25zIHVzaW5nIHRoZQotY3VycmVudCBBUElzLgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvRGlnZXN0TUQ1LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvRGlnZXN0TUQ1LmphdmEKaW5kZXggOGI3NDRlZS4uMTg0YzA1MCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL0RpZ2VzdE1ENS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9EaWdlc3RNRDUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ0LDggKzQ0LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YS5zZWN1cml0eS4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLio7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWFpbExvZ2dlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5BU0NJSVV0aWxpdHk7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuQkFTRTY0RW5jb2RlclN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5CQVNFNjREZWNvZGVyU3RyZWFtOwogCiAvKioKICAqIERJR0VTVC1NRDUgYXV0aGVudGljYXRpb24gc3VwcG9ydC4KQEAgLTkxLDcgKzk1LDcgQEAKIAkgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FLCAiTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiwgZXgpOwogCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7CiAJfQotCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCiAJdXJpID0gInNtdHAvIiArIGhvc3Q7CiAJU3RyaW5nIG5jID0gIjAwMDAwMDAxIjsKQEAgLTExMyw2ICsxMTcsMTAgQEAKIAkvLyBzZXJ2ZXIgY2hhbGxlbmdlIHJhbmRvbSB2YWx1ZQogCVN0cmluZyBub25jZSA9IG1hcC5nZXQoIm5vbmNlIik7CiAKKwkvLyBEb2VzIHNlcnZlciBzdXBwb3J0IFVURi04IHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzPworCVN0cmluZyBjaGFyc2V0ID0gbWFwLmdldCgiY2hhcnNldCIpOworCWJvb2xlYW4gdXRmOCA9IGNoYXJzZXQgIT0gbnVsbCAmJiBjaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInV0Zi04Iik7CisKIAlyYW5kb20ubmV4dEJ5dGVzKGJ5dGVzKTsKIAliNjRvcy53cml0ZShieXRlcyk7CiAJYjY0b3MuZmx1c2goKTsKQEAgLTEyMiw3ICsxMzAsMTEgQEAKIAlib3MucmVzZXQoKTsKIAogCS8vIERJR0VTVC1NRDUgY29tcHV0YXRpb24sIGNvbW1vbiBwb3J0aW9uIChvcmRlciBjcml0aWNhbCkKLQltZDUudXBkYXRlKG1kNS5kaWdlc3QoCisJaWYgKHV0ZjgpIHsKKwkgICAgU3RyaW5nIHVwID0gdXNlciArICI6IiArIHJlYWxtICsgIjoiICsgcGFzc3dkOworCSAgICBtZDUudXBkYXRlKG1kNS5kaWdlc3QodXAuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpKTsKKwl9IGVsc2UKKwkgICAgbWQ1LnVwZGF0ZShtZDUuZGlnZXN0KAogCQlBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXModXNlciArICI6IiArIHJlYWxtICsgIjoiICsgcGFzc3dkKSkpOwogCW1kNS51cGRhdGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKCI6IiArIG5vbmNlICsgIjoiICsgY25vbmNlKSk7CiAJY2xpZW50UmVzcG9uc2UgPSB0b0hleChtZDUuZGlnZXN0KCkpCkBAIC0xNDAsNiArMTUyLDggQEAKIAlyZXN1bHQuYXBwZW5kKCIsbm9uY2U9XCIiICsgbm9uY2UgKyAiXCIiKTsKIAlyZXN1bHQuYXBwZW5kKCIsY25vbmNlPVwiIiArIGNub25jZSArICJcIiIpOwogCXJlc3VsdC5hcHBlbmQoIixkaWdlc3QtdXJpPVwiIiArIHVyaSArICJcIiIpOworCWlmICh1dGY4KQorCSAgICByZXN1bHQuYXBwZW5kKCIsY2hhcnNldD1cInV0Zi04XCIiKTsKIAlyZXN1bHQuYXBwZW5kKCIscmVzcG9uc2U9IiArIHRvSGV4KG1kNS5kaWdlc3QoKSkpOwogCiAJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQpAQCAtMTc5LDcgKzE5Myw3IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gdG9rZW5pemUoU3RyaW5nIHNlcnZlclJlc3BvbnNlKQogCSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwCT0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAJPSBuZXcgSGFzaE1hcDw+KCk7CiAJYnl0ZVtdIGJ5dGVzID0gc2VydmVyUmVzcG9uc2UuZ2V0Qnl0ZXMoImlzby04ODU5LTEiKTsJLy8gcmVhbGx5IEFTQ0lJPwogCVN0cmluZyBrZXkgPSBudWxsOwogCWludCB0dHlwZTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQQWRkcmVzc0ZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBBZGRyZXNzRmFpbGVkRXhjZXB0aW9uLmphdmEKaW5kZXggOTllNzI5Ni4uOGQ2ZmUzMCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBBZGRyZXNzRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBBZGRyZXNzRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUEFkZHJlc3NTdWNjZWVkZWRFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQQWRkcmVzc1N1Y2NlZWRlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGNhNmMyZTMuLjNmNDBhOGMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQQWRkcmVzc1N1Y2NlZWRlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQQWRkcmVzc1N1Y2NlZWRlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBNZXNzYWdlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUE1lc3NhZ2UuamF2YQppbmRleCBjNjA0MmE3Li44M2ZkM2I1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUE1lc3NhZ2UuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUE1lc3NhZ2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE4Niw3ICsxODYsNyBAQAogCSAgICByZXR1cm4gbnVsbDsKIAlpZiAobm90aWZ5T3B0aW9ucyA9PSBOT1RJRllfTkVWRVIpCiAJICAgIHJldHVybiAiTkVWRVIiOwotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAlpZiAoKG5vdGlmeU9wdGlvbnMgJiBOT1RJRllfU1VDQ0VTUykgIT0gMCkKIAkgICAgc2IuYXBwZW5kKCJTVUNDRVNTIik7CiAJaWYgKChub3RpZnlPcHRpb25zICYgTk9USUZZX0ZBSUxVUkUpICE9IDApIHsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQT3V0cHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGFlMGMyMGYuLjcyZmQzODAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBPdXRwdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTU3LDYgKzU3LDcgQEAKIAlzdXBlcihvcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJLy8gaWYgdGhhdCBsYXN0IGNoYXJhY3RlciB3YXMgYSBuZXdsaW5lLCBhbmQgdGhlIGN1cnJlbnQKIAkvLyBjaGFyYWN0ZXIgaXMgIi4iLCB3ZSBhbHdheXMgd3JpdGUgb3V0IGFuIGV4dHJhICIuIi4KQEAgLTcwLDYgKzcxLDcgQEAKICAgICAvKiAKICAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBhZGRlZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWludCBsYXN0YyA9IChsYXN0YiA9PSAtMSkgPyAnXG4nIDogbGFzdGI7CiAJaW50IHN0YXJ0ID0gb2ZmOwpAQCAtOTksNiArMTAxLDcgQEAKICAgICAgKiBTTVRQVHJhbnNwb3J0IHdpbGwgbWFudWFsbHkgZmx1c2ggdGhlIHNvY2tldCBiZWZvcmUgcmVhZGluZwogICAgICAqIHRoZSByZXNwb25zZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKIAkvLyBkbyBub3RoaW5nCiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBQcm92aWRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzUyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorCisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAorICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKKyAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgorICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KKyAqCisgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKKyAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCisgKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKKyAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCisgKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKKyAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCisgKgorICogQ29udHJpYnV0b3Iocyk6CisgKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKKyAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCisgKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKKyAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKKyAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKKyAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bworICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCisgKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCisgKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAorICogaG9sZGVyLgorICovCisKK3BhY2thZ2UgY29tLnN1bi5tYWlsLnNtdHA7CisKK2ltcG9ydCBqYXZheC5tYWlsLlByb3ZpZGVyOworCisvKioKKyAqIFRoZSBTTVRQIHByb3RvY29sIHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgU01UUFByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIgeworICAgIHB1YmxpYyBTTVRQUHJvdmlkZXIoKSB7CisJc3VwZXIoUHJvdmlkZXIuVHlwZS5UUkFOU1BPUlQsICJzbXRwIiwgU01UUFRyYW5zcG9ydC5jbGFzcy5nZXROYW1lKCksCisJICAgICJPcmFjbGUiLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNTTFByb3ZpZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNTTFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlZTA5YgotLS0gL2Rldi9udWxsCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQU1NMUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CisgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQorICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCisgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgorICoKKyAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgorICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKKyAqIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQorICogZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBNb2RpZmljYXRpb25zOgorICogSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMKKyAqIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgorICogIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKKyAqCisgKiBDb250cmlidXRvcihzKToKKyAqIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgorICogb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0KKyAqIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcyBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTAorICogVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQorICogcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgorICogZWl0aGVyIHRoZSBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvCisgKiBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKKyAqIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMKKyAqIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0CisgKiBob2xkZXIuCisgKi8KKworcGFja2FnZSBjb20uc3VuLm1haWwuc210cDsKKworaW1wb3J0IGphdmF4Lm1haWwuUHJvdmlkZXI7CisKKy8qKgorICogVGhlIFNNVFAgU1NMIHByb3RvY29sIHByb3ZpZGVyLgorICovCitwdWJsaWMgY2xhc3MgU01UUFNTTFByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIgeworICAgIHB1YmxpYyBTTVRQU1NMUHJvdmlkZXIoKSB7CisJc3VwZXIoUHJvdmlkZXIuVHlwZS5UUkFOU1BPUlQsICJzbXRwcyIsCisJICAgIFNNVFBTU0xUcmFuc3BvcnQuY2xhc3MuZ2V0TmFtZSgpLCAiT3JhY2xlIiwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTU0xUcmFuc3BvcnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQU1NMVHJhbnNwb3J0LmphdmEKaW5kZXggMmM1MjM4Ni4uMDZhZDJjOCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTU0xUcmFuc3BvcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNTTFRyYW5zcG9ydC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTYXNsQXV0aGVudGljYXRvci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTYXNsQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDMyOWZlN2QuLjk3NzRkMDQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQU2FzbEF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNhc2xBdXRoZW50aWNhdG9yLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00Nyw3ICs0NywxMCBAQAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suKjsKIGltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKIAotaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLio7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWFpbExvZ2dlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5BU0NJSVV0aWxpdHk7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuQkFTRTY0RW5jb2RlclN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5CQVNFNjREZWNvZGVyU3RyZWFtOwogCiAvKioKICAqIFRoaXMgY2xhc3MgY29udGFpbnMgYSBzaW5nbGUgbWV0aG9kIHRoYXQgZG9lcyBhdXRoZW50aWNhdGlvbiB1c2luZwpAQCAtODQsNiArODcsNyBAQAogCXRoaXMuaG9zdCA9IGhvc3Q7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFN0cmluZ1tdIG1lY2hzLCBmaW5hbCBTdHJpbmcgcmVhbG0sCiAJCQkJZmluYWwgU3RyaW5nIGF1dGh6aWQsIGZpbmFsIFN0cmluZyB1LAogCQkJCWZpbmFsIFN0cmluZyBwKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKQEAgLTk4LDYgKzEwMiw3IEBACiAKIAlTYXNsQ2xpZW50IHNjOwogCUNhbGxiYWNrSGFuZGxlciBjYmggPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIHZvaWQgaGFuZGxlKENhbGxiYWNrW10gY2FsbGJhY2tzKSB7CiAJCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkKIAkJICAgIGxvZ2dlci5maW5lKCJTQVNMIGNhbGxiYWNrIGxlbmd0aDogIiArIGNhbGxiYWNrcy5sZW5ndGgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTZW5kRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNlbmRGYWlsZWRFeGNlcHRpb24uamF2YQppbmRleCBkY2QwMmU0Li45NWRjMzg5IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNlbmRGYWlsZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNlbmRGYWlsZWRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQU2VuZGVyRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFNlbmRlckZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDljMWI1MmYuLjE3ZWYwODcgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQU2VuZGVyRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBTZW5kZXJGYWlsZWRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQVHJhbnNwb3J0LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU01UUFRyYW5zcG9ydC5qYXZhCmluZGV4IGI3NzFiZGMuLjlmMzkyNzggMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9TTVRQVHJhbnNwb3J0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1NNVFBUcmFuc3BvcnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ1LDE0ICs0NSwyNCBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OwogCiBpbXBvcnQgamF2YXgubWFpbC4qOwogaW1wb3J0IGphdmF4Lm1haWwuZXZlbnQuKjsKIGltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lio7CiAKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4ubWFpbC5hdXRoLio7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUHJvcFV0aWw7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWFpbExvZ2dlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5BU0NJSVV0aWxpdHk7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuU29ja2V0RmV0Y2hlcjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NYWlsQ29ubmVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Tb2NrZXRDb25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkJBU0U2NEVuY29kZXJTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTGluZUlucHV0U3RyZWFtOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlRyYWNlSW5wdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuVHJhY2VPdXRwdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLmF1dGguTnRsbTsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFRyYW5zcG9ydCBhYnN0cmFjdCBjbGFzcyB1c2luZyBTTVRQIGZvcgpAQCAtMTA5LDcgKzExOSw3IEBACiAgICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGV4dE1hcDsKIAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgQXV0aGVudGljYXRvcj4gYXV0aGVudGljYXRvcnMKLQkgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF1dGhlbnRpY2F0b3I+KCk7CisJICAgID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXM7CS8vIHNldCBpbiBjb25zdHJ1Y3RvcgogCiAgICAgcHJpdmF0ZSBib29sZWFuIHF1aXRXYWl0ID0gZmFsc2U7CS8vIHRydWUgaWYgd2Ugc2hvdWxkIHdhaXQKQEAgLTE0MCw2ICsxNTAsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBub2F1dGhkZWJ1ZyA9IHRydWU7CS8vIGhpZGUgYXV0aCBpbmZvIGluIGRlYnVnIG91dHB1dAogICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z3VzZXJuYW1lOwkvLyBpbmNsdWRlIHVzZXJuYW1lIGluIGRlYnVnIG91dHB1dD8KICAgICBwcml2YXRlIGJvb2xlYW4gZGVidWdwYXNzd29yZDsJLy8gaW5jbHVkZSBwYXNzd29yZCBpbiBkZWJ1ZyBvdXRwdXQ/CisgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93dXRmODsJCS8vIGFsbG93IFVURi04IHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzPworICAgIHByaXZhdGUgaW50IGNodW5rU2l6ZTsJCS8vIGNodW5rIHNpemUgaWYgQ0hVTktJTkcgc3VwcG9ydGVkCiAKICAgICAvKiogSGVhZGVycyB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgd2hlbiBzZW5kaW5nICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gaWdub3JlTGlzdCA9IHsgIkJjYyIsICJDb250ZW50LUxlbmd0aCIgfTsKQEAgLTE2OSwxOSArMTgxLDIyIEBACiAgICAgcHJvdGVjdGVkIFNNVFBUcmFuc3BvcnQoU2Vzc2lvbiBzZXNzaW9uLCBVUkxOYW1lIHVybG5hbWUsCiAJCQkJU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNTU0wpIHsKIAlzdXBlcihzZXNzaW9uLCB1cmxuYW1lKTsKLQlsb2dnZXIgPSBuZXcgTWFpbExvZ2dlcih0aGlzLmdldENsYXNzKCksICJERUJVRyBTTVRQIiwgc2Vzc2lvbik7CisJUHJvcGVydGllcyBwcm9wcyA9IHNlc3Npb24uZ2V0UHJvcGVydGllcygpOworCisJbG9nZ2VyID0gbmV3IE1haWxMb2dnZXIodGhpcy5nZXRDbGFzcygpLCAiREVCVUcgU01UUCIsCisJCQkJc2Vzc2lvbi5nZXREZWJ1ZygpLCBzZXNzaW9uLmdldERlYnVnT3V0KCkpOwogCXRyYWNlTG9nZ2VyID0gbG9nZ2VyLmdldFN1YkxvZ2dlcigicHJvdG9jb2wiLCBudWxsKTsKLQlub2F1dGhkZWJ1ZyA9ICFQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJbm9hdXRoZGVidWcgPSAhUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCQkJICAgICJtYWlsLmRlYnVnLmF1dGgiLCBmYWxzZSk7Ci0JZGVidWd1c2VybmFtZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlkZWJ1Z3VzZXJuYW1lID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCQkJIm1haWwuZGVidWcuYXV0aC51c2VybmFtZSIsIHRydWUpOwotCWRlYnVncGFzc3dvcmQgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJZGVidWdwYXNzd29yZCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJCSJtYWlsLmRlYnVnLmF1dGgucGFzc3dvcmQiLCBmYWxzZSk7CiAJaWYgKHVybG5hbWUgIT0gbnVsbCkKIAkgICAgbmFtZSA9IHVybG5hbWUuZ2V0UHJvdG9jb2woKTsKIAl0aGlzLm5hbWUgPSBuYW1lOwogCWlmICghaXNTU0wpCi0JICAgIGlzU1NMID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBpc1NTTCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJCQkibWFpbC4iICsgbmFtZSArICIuc3NsLmVuYWJsZSIsIGZhbHNlKTsKIAlpZiAoaXNTU0wpCiAJICAgIHRoaXMuZGVmYXVsdFBvcnQgPSA0NjU7CkBAIC0xOTEsNDAgKzIwNiw1MCBAQAogCiAJLy8gc2V0dGluZyBtYWlsLnNtdHAucXVpdHdhaXQgdG8gZmFsc2UgY2F1c2VzIHVzIHRvIG5vdCB3YWl0IGZvciB0aGUKIAkvLyByZXNwb25zZSBmcm9tIHRoZSBRVUlUIGNvbW1hbmQKLQlxdWl0V2FpdCA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlxdWl0V2FpdCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJCQkibWFpbC4iICsgbmFtZSArICIucXVpdHdhaXQiLCB0cnVlKTsKIAogCS8vIG1haWwuc210cC5yZXBvcnRzdWNjZXNzIGNhdXNlcyB1cyB0byB0aHJvdyBhbiBleGNlcHRpb24gb24gc3VjY2VzcwotCXJlcG9ydFN1Y2Nlc3MgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJcmVwb3J0U3VjY2VzcyA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkJCQkibWFpbC4iICsgbmFtZSArICIucmVwb3J0c3VjY2VzcyIsIGZhbHNlKTsKIAogCS8vIG1haWwuc210cC5zdGFydHRscy5lbmFibGUgZW5hYmxlcyB1c2Ugb2YgU1RBUlRUTFMgY29tbWFuZAotCXVzZVN0YXJ0VExTID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCXVzZVN0YXJ0VExTID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5zdGFydHRscy5lbmFibGUiLCBmYWxzZSk7CiAKIAkvLyBtYWlsLnNtdHAuc3RhcnR0bHMucmVxdWlyZWQgcmVxdWlyZXMgdXNlIG9mIFNUQVJUVExTIGNvbW1hbmQKLQlyZXF1aXJlU3RhcnRUTFMgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJcmVxdWlyZVN0YXJ0VExTID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAogCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5zdGFydHRscy5yZXF1aXJlZCIsIGZhbHNlKTsKIAogCS8vIG1haWwuc210cC51c2Vyc2V0IGNhdXNlcyB1cyB0byB1c2UgUlNFVCBpbnN0ZWFkIG9mIE5PT1AKIAkvLyBmb3IgaXNDb25uZWN0ZWQKLQl1c2VSc2V0ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCXVzZVJzZXQgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJIm1haWwuIiArIG5hbWUgKyAiLnVzZXJzZXQiLCBmYWxzZSk7CiAKIAkvLyBtYWlsLnNtdHAubm9vcC5zdHJpY3QgcmVxdWlyZXMgMjUwIHJlc3BvbnNlIHRvIGluZGljYXRlIHN1Y2Nlc3MKLQlub29wU3RyaWN0ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCW5vb3BTdHJpY3QgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJIm1haWwuIiArIG5hbWUgKyAiLm5vb3Auc3RyaWN0IiwgdHJ1ZSk7CiAKIAkvLyBjaGVjayBpZiBTQVNMIGlzIGVuYWJsZWQKLQllbmFibGVTQVNMID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWVuYWJsZVNBU0wgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJICAgICJtYWlsLiIgKyBuYW1lICsgIi5zYXNsLmVuYWJsZSIsIGZhbHNlKTsKIAlpZiAoZW5hYmxlU0FTTCkKIAkgICAgbG9nZ2VyLmNvbmZpZygiZW5hYmxlIFNBU0wiKTsKLQl1c2VDYW5vbmljYWxIb3N0TmFtZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwl1c2VDYW5vbmljYWxIb3N0TmFtZSA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wcywKIAkgICAgIm1haWwuIiArIG5hbWUgKyAiLnNhc2wudXNlY2Fub25pY2FsaG9zdG5hbWUiLCBmYWxzZSk7CiAJaWYgKHVzZUNhbm9uaWNhbEhvc3ROYW1lKQogCSAgICBsb2dnZXIuY29uZmlnKCJ1c2UgY2Fub25pY2FsIGhvc3QgbmFtZSIpOwogCisJYWxsb3d1dGY4ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAorCSAgICAibWFpbC5taW1lLmFsbG93dXRmOCIsIGZhbHNlKTsKKwlpZiAoYWxsb3d1dGY4KQorCSAgICBsb2dnZXIuY29uZmlnKCJhbGxvdyBVVEYtOCIpOworCisJY2h1bmtTaXplID0gUHJvcFV0aWwuZ2V0SW50UHJvcGVydHkocHJvcHMsCisJICAgICJtYWlsLiIgKyBuYW1lICsgIi5jaHVua3NpemUiLCAtMSk7CisJaWYgKGNodW5rU2l6ZSA+IDAgJiYgbG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkKKwkgICAgbG9nZ2VyLmNvbmZpZygiY2h1bmsgc2l6ZSAiICsgY2h1bmtTaXplKTsKKwogCS8vIGNyZWF0ZWQgaGVyZSwgYmVjYXVzZSB0aGV5J3JlIGlubmVyIGNsYXNzZXMgdGhhdCByZWZlcmVuY2UgInRoaXMiCiAJQXV0aGVudGljYXRvcltdIGEgPSBuZXcgQXV0aGVudGljYXRvcltdIHsKIAkgICAgbmV3IExvZ2luQXV0aGVudGljYXRvcigpLApAQCAtMjMzLDcgKzI1OCw3IEBACiAJICAgIG5ldyBOdGxtQXV0aGVudGljYXRvcigpLAogCSAgICBuZXcgT0F1dGgyQXV0aGVudGljYXRvcigpCiAJfTsKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAJICAgIGF1dGhlbnRpY2F0b3JzLnB1dChhW2ldLmdldE1lY2hhbmlzbSgpLCBhW2ldKTsKIAkgICAgc2IuYXBwZW5kKGFbaV0uZ2V0TWVjaGFuaXNtKCkpLmFwcGVuZCgnICcpOwpAQCAtNDE4LDcgKzQ0Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRTQVNMTWVjaGFuaXNtcygpIHsKIAlpZiAoc2FzbE1lY2hhbmlzbXMgPT0gVU5LTk9XTl9TQSkgewotCSAgICBMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig1KTsKKwkgICAgTGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PD4oNSk7CiAJICAgIFN0cmluZyBzID0gc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC4iICsgbmFtZSArICIuc2FzbC5tZWNoYW5pc21zIik7CiAJICAgIGlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApIHsKIAkJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQpAQCAtNjU2LDExICs2ODEsMTQgQEAKICAgICAgKiBAcmV0dXJuCXRydWUgaWYgY29ubmVjdGlvbiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBhdXRoZW50aWNhdGlvbiBmYWlsZWQKICAgICAgKiBAZXhjZXB0aW9uIE1lc3NhZ2luZ0V4Y2VwdGlvbglmb3Igbm9uLWF1dGhlbnRpY2F0aW9uIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIHByb3RvY29sQ29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsCiAJCQkJU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKKwlQcm9wZXJ0aWVzIHByb3BzID0gc2Vzc2lvbi5nZXRQcm9wZXJ0aWVzKCk7CisKIAkvLyBzZXR0aW5nIG1haWwuc210cC5hdXRoIHRvIHRydWUgZW5hYmxlcyBhdHRlbXB0cyB0byB1c2UgQVVUSAotCWJvb2xlYW4gdXNlQXV0aCA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlib29sZWFuIHVzZUF1dGggPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5hdXRoIiwgZmFsc2UpOwogCiAJLyoKQEAgLTY4MSw3ICs3MDksNyBAQAogCX0KIAogCS8vIHNldHRpbmcgbWFpbC5zbXRwLmVobG8gdG8gZmFsc2UgZGlzYWJsZXMgYXR0ZW1wdHMgdG8gdXNlIEVITE8KLQlib29sZWFuIHVzZUVobG8gPSAgUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWJvb2xlYW4gdXNlRWhsbyA9ICBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5laGxvIiwgdHJ1ZSk7CiAJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQogCSAgICBsb2dnZXIuZmluZSgidXNlRWhsbyAiICsgdXNlRWhsbyArICIsIHVzZUF1dGggIiArIHVzZUF1dGgpOwpAQCAtNjkxLDcgKzcxOSw3IEBACiAgICAgICAgICAqIHByb3BlcnR5IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMjUuCiAJICovCiAgICAgICAgIGlmIChwb3J0ID09IC0xKQotCSAgICBwb3J0ID0gUHJvcFV0aWwuZ2V0SW50U2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJICAgIHBvcnQgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKIAkJCQkJIm1haWwuIiArIG5hbWUgKyAiLnBvcnQiLCAtMSk7CiAgICAgICAgIGlmIChwb3J0ID09IC0xKQogCSAgICBwb3J0ID0gZGVmYXVsdFBvcnQ7CkBAIC03MzcsNiArNzY1LDEwIEBACiAJCX0KIAkgICAgfQogCisJICAgIGlmIChhbGxvd3V0ZjggJiYgIXN1cHBvcnRzRXh0ZW5zaW9uKCJTTVRQVVRGOCIpKQorCQlsb2dnZXIubG9nKExldmVsLklORk8sICJtYWlsLm1pbWUuYWxsb3d1dGY4IHNldCAiICsKKwkJCSAgICAiYnV0IHNlcnZlciBkb2Vzbid0IGFkdmVydGlzZSBTTVRQVVRGOCBzdXBwb3J0Iik7CisKIAkgICAgaWYgKCh1c2VBdXRoIHx8ICh1c2VyICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkpICYmCiAJCSAgKHN1cHBvcnRzRXh0ZW5zaW9uKCJBVVRIIikgfHwKIAkJICAgc3VwcG9ydHNFeHRlbnNpb24oIkFVVEg9TE9HSU4iKSkpIHsKQEAgLTgyOCw4ICs4NjAsOSBAQAogCSAgICBpZiAobWVjaHMgPT0gZGVmYXVsdEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcykgewogCQlTdHJpbmcgZHByb3AgPSAibWFpbC4iICsgbmFtZSArICIuYXV0aC4iICsKIAkJCQkgICAgbS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkgKyAiLmRpc2FibGUiOwotCQlib29sZWFuIGRpc2FibGVkID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eSgKLQkJCQkJCXNlc3Npb24sIGRwcm9wLCAhYS5lbmFibGVkKCkpOworCQlib29sZWFuIGRpc2FibGVkID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KAorCQkJCQkJc2Vzc2lvbi5nZXRQcm9wZXJ0aWVzKCksCisJCQkJCQlkcHJvcCwgIWEuZW5hYmxlZCgpKTsKIAkJaWYgKGRpc2FibGVkKSB7CiAJCSAgICBpZiAobG9nZ2VyLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpCiAJCQlsb2dnZXIuZmluZSgibWVjaGFuaXNtICIgKyBtICsKQEAgLTk1NywxNSArOTkwLDE2IEBACiAJICAgIHN1cGVyKCJMT0dJTiIpOwogCX0KIAorCUBPdmVycmlkZQogCXZvaWQgZG9BdXRoKFN0cmluZyBob3N0LCBTdHJpbmcgYXV0aHppZCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd2QpCiAJCQkJICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkgICAgLy8gc2VuZCB1c2VybmFtZQotCSAgICByZXNwID0gc2ltcGxlQ29tbWFuZCgKLQkJQkFTRTY0RW5jb2RlclN0cmVhbS5lbmNvZGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHVzZXIpKSk7CisJICAgIHJlc3AgPSBzaW1wbGVDb21tYW5kKEJBU0U2NEVuY29kZXJTdHJlYW0uZW5jb2RlKAorCQkJCXVzZXIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpKTsKIAkgICAgaWYgKHJlc3AgPT0gMzM0KSB7CiAJCS8vIHNlbmQgcGFzc3dkCi0JCXJlc3AgPSBzaW1wbGVDb21tYW5kKAotCQkgICAgQkFTRTY0RW5jb2RlclN0cmVhbS5lbmNvZGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKHBhc3N3ZCkpKTsKKwkJcmVzcCA9IHNpbXBsZUNvbW1hbmQoQkFTRTY0RW5jb2RlclN0cmVhbS5lbmNvZGUoCisJCQkJcGFzc3dkLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSk7CiAJICAgIH0KIAl9CiAgICAgfQpAQCAtOTc4LDYgKzEwMTIsNyBAQAogCSAgICBzdXBlcigiUExBSU4iKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlTdHJpbmcgZ2V0SW5pdGlhbFJlc3BvbnNlKFN0cmluZyBob3N0LCBTdHJpbmcgYXV0aHppZCwgU3RyaW5nIHVzZXIsCiAJCQlTdHJpbmcgcGFzc3dkKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJICAgIC8vIHJldHVybiAiYXV0aHppZDxOVUw+dXNlcjxOVUw+cGFzc3dkIgpAQCAtOTg1LDE2ICsxMDIwLDE3IEBACiAJICAgIE91dHB1dFN0cmVhbSBiNjRvcyA9CiAJCQluZXcgQkFTRTY0RW5jb2RlclN0cmVhbShib3MsIEludGVnZXIuTUFYX1ZBTFVFKTsKIAkgICAgaWYgKGF1dGh6aWQgIT0gbnVsbCkKLQkJYjY0b3Mud3JpdGUoQVNDSUlVdGlsaXR5LmdldEJ5dGVzKGF1dGh6aWQpKTsKKwkJYjY0b3Mud3JpdGUoYXV0aHppZC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAJICAgIGI2NG9zLndyaXRlKDApOwotCSAgICBiNjRvcy53cml0ZShBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXModXNlcikpOworCSAgICBiNjRvcy53cml0ZSh1c2VyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKIAkgICAgYjY0b3Mud3JpdGUoMCk7Ci0JICAgIGI2NG9zLndyaXRlKEFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhwYXNzd2QpKTsKKwkgICAgYjY0b3Mud3JpdGUocGFzc3dkLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKIAkgICAgYjY0b3MuZmx1c2goKTsgCS8vIGNvbXBsZXRlIHRoZSBlbmNvZGluZwogCiAJICAgIHJldHVybiBBU0NJSVV0aWxpdHkudG9TdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCkpOwogCX0KIAorCUBPdmVycmlkZQogCXZvaWQgZG9BdXRoKFN0cmluZyBob3N0LCBTdHJpbmcgYXV0aHppZCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd2QpCiAJCQkJICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCkBAIC0xMDE4LDYgKzEwNTQsNyBAQAogCSAgICByZXR1cm4gbWQ1c3VwcG9ydDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAl2b2lkIGRvQXV0aChTdHJpbmcgaG9zdCwgU3RyaW5nIGF1dGh6aWQsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dkKQogCQkJCSAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJICAgIERpZ2VzdE1ENSBtZDUgPSBnZXRNRDUoKTsKQEAgLTEwNDksNiArMTA4Niw3IEBACiAJICAgIHN1cGVyKCJOVExNIik7CiAJfQogCisJQE92ZXJyaWRlCiAJU3RyaW5nIGdldEluaXRpYWxSZXNwb25zZShTdHJpbmcgaG9zdCwgU3RyaW5nIGF1dGh6aWQsIFN0cmluZyB1c2VyLAogCQlTdHJpbmcgcGFzc3dkKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJICAgIG50bG0gPSBuZXcgTnRsbShnZXROVExNRG9tYWluKCksIGdldExvY2FsSG9zdCgpLApAQCAtMTA2Miw2ICsxMTAwLDcgQEAKIAkgICAgcmV0dXJuIHR5cGUxOwogCX0KIAorCUBPdmVycmlkZQogCXZvaWQgZG9BdXRoKFN0cmluZyBob3N0LCBTdHJpbmcgYXV0aHppZCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd2QpCiAJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkgICAgYXNzZXJ0IG50bG0gIT0gbnVsbDsKQEAgLTEwODEsMTQgKzExMjAsMTcgQEAKIAkgICAgc3VwZXIoIlhPQVVUSDIiLCBmYWxzZSk7CS8vIGRpc2FibGVkIGJ5IGRlZmF1bHQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlTdHJpbmcgZ2V0SW5pdGlhbFJlc3BvbnNlKFN0cmluZyBob3N0LCBTdHJpbmcgYXV0aHppZCwgU3RyaW5nIHVzZXIsCiAJCVN0cmluZyBwYXNzd2QpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkgICAgU3RyaW5nIHJlc3AgPSAidXNlcj0iICsgdXNlciArICJcMDAxYXV0aD1CZWFyZXIgIiArCiAJCQkgICAgcGFzc3dkICsgIlwwMDFcMDAxIjsKLQkgICAgYnl0ZVtdIGIgPSBCQVNFNjRFbmNvZGVyU3RyZWFtLmVuY29kZShBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXMocmVzcCkpOworCSAgICBieXRlW10gYiA9IEJBU0U2NEVuY29kZXJTdHJlYW0uZW5jb2RlKAorCQkJCQlyZXNwLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKIAkgICAgcmV0dXJuIEFTQ0lJVXRpbGl0eS50b1N0cmluZyhiKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAl2b2lkIGRvQXV0aChTdHJpbmcgaG9zdCwgU3RyaW5nIGF1dGh6aWQsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dkKQogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQpAQCAtMTE0NCwxMyArMTE4NiwxMyBAQAogCUxpc3Q8U3RyaW5nPiB2OwogCWlmIChhbGxvd2VkICE9IG51bGwgJiYgYWxsb3dlZC5sZW5ndGggPiAwKSB7CiAJICAgIC8vIHJlbW92ZSBhbnl0aGluZyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKLQkgICAgdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhbGxvd2VkLmxlbmd0aCk7CisJICAgIHYgPSBuZXcgQXJyYXlMaXN0PD4oYWxsb3dlZC5sZW5ndGgpOwogCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbG93ZWQubGVuZ3RoOyBpKyspCiAJCWlmIChzdXBwb3J0c0F1dGhlbnRpY2F0aW9uKGFsbG93ZWRbaV0pKQkvLyBYWFggLSBjYXNlIG11c3QgbWF0Y2gKIAkJICAgIHYuYWRkKGFsbG93ZWRbaV0pOwogCX0gZWxzZSB7CiAJICAgIC8vIGV2ZXJ5dGhpbmcgaXMgYWxsb3dlZAotCSAgICB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJICAgIHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkgICAgaWYgKGV4dE1hcCAhPSBudWxsKSB7CiAJCVN0cmluZyBhID0gZXh0TWFwLmdldCgiQVVUSCIpOwogCQlpZiAoYSAhPSBudWxsKSB7CkBAIC0xMjA3LDYgKzEyNDksNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgb3Igbm90IGluIHRoZSBjb25uZWN0ZWQgc3RhdGUgb3IgaWYgdGhlIG1lc3NhZ2UgaXMKICAgICAgKiAgICAgICAgICAgICAgICAgIG5vdCBhIE1pbWVNZXNzYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZW5kTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UsIEFkZHJlc3NbXSBhZGRyZXNzZXMpCiAJCSAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uLCBTZW5kRmFpbGVkRXhjZXB0aW9uIHsKIApAQCAtMTIzNyw3ICsxMjgwLDcgQEAKIAlpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFNNVFBNZXNzYWdlKQogCSAgICB1c2U4Yml0ID0gKChTTVRQTWVzc2FnZSltZXNzYWdlKS5nZXRBbGxvdzhiaXRNSU1FKCk7CiAJaWYgKCF1c2U4Yml0KQotCSAgICB1c2U4Yml0ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICB1c2U4Yml0ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHNlc3Npb24uZ2V0UHJvcGVydGllcygpLAogCQkJCSJtYWlsLiIgKyBuYW1lICsgIi5hbGxvdzhiaXRtaW1lIiwgZmFsc2UpOwogCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkKIAkgICAgbG9nZ2VyLmZpbmUoInVzZThiaXQgIiArIHVzZThiaXQpOwpAQCAtMTI1Niw4ICsxMjk5LDIyIEBACiAJdHJ5IHsKIAkgICAgbWFpbEZyb20oKTsKIAkgICAgcmNwdFRvKCk7Ci0JICAgIHRoaXMubWVzc2FnZS53cml0ZVRvKGRhdGEoKSwgaWdub3JlTGlzdCk7Ci0JICAgIGZpbmlzaERhdGEoKTsKKwkgICAgaWYgKGNodW5rU2l6ZSA+IDAgJiYgc3VwcG9ydHNFeHRlbnNpb24oIkNIVU5LSU5HIikpIHsKKwkJLyoKKwkJICogVXNlIEJEQVQgdG8gc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MuCisJCSAqIE5vdGUgdGhhdCBldmVuIHRob3VnaCB0aGUgQkRBVCBjb21tYW5kIGlzIGFibGUgdG8gc2VuZAorCQkgKiBtZXNzYWdlcyB0aGF0IGNvbnRhaW4gYmluYXJ5IGRhdGEsIHdlIGNhbid0IHVzZSBpdCB0bworCQkgKiBkbyB0aGF0IGJlY2F1c2UgYSkgd2Ugc3RpbGwgbmVlZCB0byBjYW5vbmljYWxpemUgdGhlCisJCSAqIGxpbmUgdGVybWluYXRvcnMgZm9yIHRleHQgZGF0YSwgd2hpY2ggd2UgY2FuJ3QgdGVsbCBhcGFydAorCQkgKiBmcm9tIHRoZSBtZXNzYWdlIGNvbnRlbnQsIGFuZCBiKSB0aGUgbWVzc2FnZSBjb250ZW50IGlzCisJCSAqIGVuY29kZWQgYmVmb3JlIHdlIGV2ZW4ga25vdyB0aGF0IHdlIGNhbiB1c2UgQkRBVC4KKwkJICovCisJCXRoaXMubWVzc2FnZS53cml0ZVRvKGJkYXQoKSwgaWdub3JlTGlzdCk7CisJCWZpbmlzaEJkYXQoKTsKKwkgICAgfSBlbHNlIHsKKwkJdGhpcy5tZXNzYWdlLndyaXRlVG8oZGF0YSgpLCBpZ25vcmVMaXN0KTsKKwkJZmluaXNoRGF0YSgpOworCSAgICB9CiAJICAgIGlmIChzZW5kUGFydGlhbGx5RmFpbGVkKSB7CiAJCS8vIHRocm93IHRoZSBleGNlcHRpb24sCiAJCS8vIGZpcmUgVHJhbnNwb3J0RXZlbnQuTUVTU0FHRV9QQVJUSUFMTFlfREVMSVZFUkVEIGV2ZW50CkBAIC0xMzQzLDYgKzE0MDAsNyBAQAogICAgIC8qKgogICAgICAqIENsb3NlIHRoZSBUcmFuc3BvcnQgYW5kIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmICghc3VwZXIuaXNDb25uZWN0ZWQoKSkgLy8gQWxyZWFkeSBjbG9zZWQuCiAJICAgIHJldHVybjsKQEAgLTEzODEsNiArMTQzOSw3IEBACiAgICAgICogQ2hlY2sgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZC4gT3ZlcnJpZGUgc3VwZXJjbGFzcwogICAgICAqIG1ldGhvZCwgdG8gYWN0dWFsbHkgcGluZyBvdXIgc2VydmVyIGNvbm5lY3Rpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29ubmVjdGVkKCkgewogCWlmICghc3VwZXIuaXNDb25uZWN0ZWQoKSkKIAkgICAgLy8gaWYgd2UgaGF2ZW4ndCBiZWVuIGNvbm5lY3RlZCBhdCBhbGwsIGRvbid0IGJvdGhlciB3aXRoIE5PT1AKQEAgLTE0MzgsNiArMTQ5Nyw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS40LjIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlUcmFuc3BvcnRMaXN0ZW5lcnMoaW50IHR5cGUsIEFkZHJlc3NbXSB2YWxpZFNlbnQsCiAJCQkJCSAgICBBZGRyZXNzW10gdmFsaWRVbnNlbnQsCiAJCQkJCSAgICBBZGRyZXNzW10gaW52YWxpZCwgTWVzc2FnZSBtc2cpIHsKQEAgLTE0NTksNyArMTUxOSw3IEBACiAJICAgIGlmIChhLmlzR3JvdXAoKSkgewogCQlpZiAoZ3JvdXBzID09IG51bGwpIHsKIAkJICAgIC8vIGZpcnN0IGdyb3VwLCBjYXRjaCB1cCB3aXRoIHdoZXJlIHdlIGFyZQotCQkgICAgZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxBZGRyZXNzPigpOworCQkgICAgZ3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCSAgICBmb3IgKGludCBrID0gMDsgayA8IGk7IGsrKykKIAkJCWdyb3Vwcy5hZGQoYWRkcmVzc2VzW2tdKTsKIAkJfQpAQCAtMTU4NSw2ICsxNjQ1LDcgQEAKIAlyZXR1cm4gbmVlZDhiaXQ7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAl0cnkgewogCSAgICBjbG9zZUNvbm5lY3Rpb24oKTsKQEAgLTE2NDEsNyArMTcwMiw3IEBACiAJICAgIEJ1ZmZlcmVkUmVhZGVyIHJkID0KIAkJbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobGFzdFNlcnZlclJlc3BvbnNlKSk7CiAJICAgIFN0cmluZyBsaW5lOwotCSAgICBleHRNYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworCSAgICBleHRNYXAgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAkgICAgdHJ5IHsKIAkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CiAJCXdoaWxlICgobGluZSA9IHJkLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKQEAgLTE3MDcsNiArMTc2OCw5IEBACiAKIAlTdHJpbmcgY21kID0gIk1BSUwgRlJPTToiICsgbm9ybWFsaXplQWRkcmVzcyhmcm9tKTsKIAorCWlmIChhbGxvd3V0ZjggJiYgc3VwcG9ydHNFeHRlbnNpb24oIlNNVFBVVEY4IikpCisJICAgIGNtZCArPSAiIFNNVFBVVEY4IjsKKwogCS8vIHJlcXVlc3QgZGVsaXZlcnkgc3RhdHVzIG5vdGlmaWNhdGlvbj8KIAlpZiAoc3VwcG9ydHNFeHRlbnNpb24oIkRTTiIpKSB7CiAJICAgIFN0cmluZyByZXQgPSBudWxsOwpAQCAtMTczMyw3ICsxNzk3LDggQEAKIAkgICAgLy8gWFhYIC0gY2hlY2sgZm9yIGxlZ2FsIHN5bnRheD8KIAkgICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsKSB7CiAJCXRyeSB7Ci0JCSAgICBTdHJpbmcgcyA9IHh0ZXh0KHN1Ym1pdHRlcik7CisJCSAgICBTdHJpbmcgcyA9IHh0ZXh0KHN1Ym1pdHRlciwKKwkJCQkgICAgYWxsb3d1dGY4ICYmIHN1cHBvcnRzRXh0ZW5zaW9uKCJTTVRQVVRGOCIpKTsKIAkJICAgIGNtZCArPSAiIEFVVEg9IiArIHM7CiAJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogCQkgICAgaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQpAQCAtMTc5OSw5ICsxODY0LDkgQEAKICAgICAgKiB2YWxpZCBhZGRyOiA1NTIgKHF1b3RhKSwgNDUwLCA0NTEsIDQ1MiAocXVvdGEpLCA0MjEgKHNydnIgYWJvcnQpCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcmNwdFRvKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0JTGlzdDxJbnRlcm5ldEFkZHJlc3M+IHZhbGlkID0gbmV3IEFycmF5TGlzdDxJbnRlcm5ldEFkZHJlc3M+KCk7Ci0JTGlzdDxJbnRlcm5ldEFkZHJlc3M+IHZhbGlkVW5zZW50ID0gbmV3IEFycmF5TGlzdDxJbnRlcm5ldEFkZHJlc3M+KCk7Ci0JTGlzdDxJbnRlcm5ldEFkZHJlc3M+IGludmFsaWQgPSBuZXcgQXJyYXlMaXN0PEludGVybmV0QWRkcmVzcz4oKTsKKwlMaXN0PEludGVybmV0QWRkcmVzcz4gdmFsaWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlMaXN0PEludGVybmV0QWRkcmVzcz4gdmFsaWRVbnNlbnQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlMaXN0PEludGVybmV0QWRkcmVzcz4gaW52YWxpZCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCWludCByZXRDb2RlID0gLTE7CiAJTWVzc2FnaW5nRXhjZXB0aW9uIG1leCA9IG51bGw7CiAJYm9vbGVhbiBzZW5kRmFpbGVkID0gZmFsc2U7CkBAIC0xODExLDcgKzE4NzYsNyBAQAogCWlmIChtZXNzYWdlIGluc3RhbmNlb2YgU01UUE1lc3NhZ2UpCiAJICAgIHNlbmRQYXJ0aWFsID0gKChTTVRQTWVzc2FnZSltZXNzYWdlKS5nZXRTZW5kUGFydGlhbCgpOwogCWlmICghc2VuZFBhcnRpYWwpCi0JICAgIHNlbmRQYXJ0aWFsID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCSAgICBzZW5kUGFydGlhbCA9IFByb3BVdGlsLmdldEJvb2xlYW5Qcm9wZXJ0eShzZXNzaW9uLmdldFByb3BlcnRpZXMoKSwKIAkJCQkJIm1haWwuIiArIG5hbWUgKyAiLnNlbmRwYXJ0aWFsIiwgZmFsc2UpOwogCWlmIChzZW5kUGFydGlhbCkKIAkgICAgbG9nZ2VyLmZpbmUoInNlbmRQYXJ0aWFsIHNldCIpOwpAQCAtMjA0Niw2ICsyMTExLDMyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyZWFtIHRoYXQgd2lsbCB1c2UgdGhlIFNNVFAgQkRBVCBjb21tYW5kIHRvIHNlbmQgZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCXRoZSBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGJkYXQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKKwlhc3NlcnQgVGhyZWFkLmhvbGRzTG9jayh0aGlzKTsKKwlkYXRhU3RyZWFtID0gbmV3IEJEQVRPdXRwdXRTdHJlYW0oc2VydmVyT3V0cHV0LCBjaHVua1NpemUpOworCXJldHVybiBkYXRhU3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlcm1pbmF0ZSB0aGUgc2VudCBkYXRhLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbiBmb3IgSS9PIGVycm9ycworICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcworICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjYuMAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaEJkYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CisJYXNzZXJ0IFRocmVhZC5ob2xkc0xvY2sodGhpcyk7CisJZGF0YVN0cmVhbS5lbnN1cmVBdEJPTCgpOworCWRhdGFTdHJlYW0uY2xvc2UoKTsJLy8gZG9lc24ndCBjbG9zZSB1bmRlcmx5aW5nIHNvY2tldAorICAgIH0KKworICAgIC8qKgogICAgICAqIElzc3VlIHRoZSA8Y29kZT5TVEFSVFRMUzwvY29kZT4gY29tbWFuZCBhbmQgc3dpdGNoIHRoZSBzb2NrZXQgdG8KICAgICAgKiBUTFMgbW9kZSBpZiBpdCBzdWNjZWVkcy4KICAgICAgKgpAQCAtMjEwMiw3ICsyMTkzLDcgQEAKIAkJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQogCQkgICAgbG9nZ2VyLmZpbmUoImNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3QgXCIiICsKIAkJCQkgICAgaG9zdCArICJcIiwgcG9ydDogIiArIHBvcnQgKwotCQkJCSAgICAiLCByZXNwb25zZTogIiArIHIgKyAiXG4iKTsKKwkJCQkgICAgIiwgcmVzcG9uc2U6ICIgKyByKTsKIAkJdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigKIAkJCSJDb3VsZCBub3QgY29ubmVjdCB0byBTTVRQIGhvc3Q6ICIgKyBob3N0ICsKIAkJCQkgICAgIiwgcG9ydDogIiArIHBvcnQgKwpAQCAtMjExMCw3ICsyMjAxLDcgQEAKIAkgICAgfSBlbHNlIHsKIAkJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQogCQkgICAgbG9nZ2VyLmZpbmUoImNvbm5lY3RlZCB0byBob3N0IFwiIiArCi0JCQkJICAgICAgIGhvc3QgKyAiXCIsIHBvcnQ6ICIgKyBwb3J0ICsgIlxuIik7CisJCQkJICAgICAgIGhvc3QgKyAiXCIsIHBvcnQ6ICIgKyBwb3J0KTsKIAkgICAgfQogCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZXgpIHsKIAkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiVW5rbm93biBTTVRQIGhvc3Q6ICIgKyBob3N0LCB1aGV4KTsKQEAgLTIxNDgsNyArMjIzOSw3IEBACiAJCWlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkKIAkJICAgIGxvZ2dlci5maW5lKCJnb3QgYmFkIGdyZWV0aW5nIGZyb20gaG9zdCBcIiIgKwogCQkJCSAgICBob3N0ICsgIlwiLCBwb3J0OiAiICsgcG9ydCArCi0JCQkJICAgICIsIHJlc3BvbnNlOiAiICsgciArICJcbiIpOworCQkJCSAgICAiLCByZXNwb25zZTogIiArIHIpOwogCQl0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKAogCQkJIkdvdCBiYWQgZ3JlZXRpbmcgZnJvbSBTTVRQIGhvc3Q6ICIgKyBob3N0ICsKIAkJCQkgICAgIiwgcG9ydDogIiArIHBvcnQgKwpAQCAtMjE1Niw3ICsyMjQ3LDcgQEAKIAkgICAgfSBlbHNlIHsKIAkJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQogCQkgICAgbG9nZ2VyLmZpbmUoInByb3RvY29sIHN0YXJ0ZWQgdG8gaG9zdCBcIiIgKwotCQkJCSAgICAgICBob3N0ICsgIlwiLCBwb3J0OiAiICsgcG9ydCArICJcbiIpOworCQkJCSAgICAgICBob3N0ICsgIlwiLCBwb3J0OiAiICsgcG9ydCk7CiAJICAgIH0KIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKIAkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigKQEAgLTIxNjcsNyArMjI1OCw3IEBACiAKIAogICAgIHByaXZhdGUgdm9pZCBpbml0U3RyZWFtcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBxdW90ZSA9IFByb3BVdGlsLmdldEJvb2xlYW5TZXNzaW9uUHJvcGVydHkoc2Vzc2lvbiwKKwlib29sZWFuIHF1b3RlID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHNlc3Npb24uZ2V0UHJvcGVydGllcygpLAogCQkJCQkibWFpbC5kZWJ1Zy5xdW90ZSIsIGZhbHNlKTsKIAogCXRyYWNlSW5wdXQgPQpAQCAtMjMwOCw3ICsyMzk5LDcgQEAKICAgICAgKiBAc2luY2UgSmF2YU1haWwgMS40LjEKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kQ29tbWFuZChTdHJpbmcgY21kKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLQlzZW5kQ29tbWFuZChBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXMoY21kKSk7CisJc2VuZENvbW1hbmQodG9CeXRlcyhjbWQpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2VuZENvbW1hbmQoYnl0ZVtdIGNtZEJ5dGVzKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKQEAgLTIzMzgsNyArMjQyOSw3IEBACiAJYXNzZXJ0IFRocmVhZC5ob2xkc0xvY2sodGhpcyk7CiAgICAgICAgIFN0cmluZyBzZXJ2ZXJSZXNwb25zZSA9ICIiOwogICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IDA7Ci0JU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKKwlTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CiAKIAkvLyByZWFkIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgbGluZShzKSBhbmQgYWRkIHRoZW0gdG8gdGhlIGJ1ZmZlcgogCS8vIHRoYXQgc3RvcmVzIHRoZSByZXNwb25zZQpAQCAtMjUxOSwxNiArMjYxMCwzNSBAQAogICAgICAqIEByZXR1cm4JdGhlIHh0ZXh0IGZvcm1hdCBzdHJpbmcKICAgICAgKiBAc2luY2UgSmF2YU1haWwgMS40LjEKICAgICAgKi8KKyAgICAvLyBYWFggLSBrZWVwaW5nIHRoaXMgYXJvdW5kIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkKICAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB4dGV4dChTdHJpbmcgcykgewotCVN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JICAgIGlmIChjID49IDEyOCkJLy8gbm90IEFTQ0lJCisJcmV0dXJuIHh0ZXh0KHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHh0ZXh0KHMpLCBidXQgYWxsb3cgVVRGLTggc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbQlzCXRoZSBzdHJpbmcgdG8gY29udmVydAorICAgICAqIEBwYXJhbQl1dGY4CWNvbnZlcnQgc3RyaW5nIHRvIFVURi04IGZpcnN0PworICAgICAqIEByZXR1cm4JdGhlIHh0ZXh0IGZvcm1hdCBzdHJpbmcKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42LjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB4dGV4dChTdHJpbmcgcywgYm9vbGVhbiB1dGY4KSB7CisJU3RyaW5nQnVpbGRlciBzYiA9IG51bGw7CisJYnl0ZVtdIGJ5dGVzOworCWlmICh1dGY4KQorCSAgICBieXRlcyA9IHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJZWxzZQorCSAgICBieXRlcyA9IEFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhzKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisJICAgIGNoYXIgYyA9IChjaGFyKSgoKGludClieXRlc1tpXSkmMHhmZik7CisJICAgIGlmICghdXRmOCAmJiBjID49IDEyOCkJLy8gbm90IEFTQ0lJCiAJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCSAgICAiTm9uLUFTQ0lJIGNoYXJhY3RlciBpbiBTTVRQIHN1Ym1pdHRlcjogIiArIHMpOworCQkJICAgICJOb24tQVNDSUkgY2hhcmFjdGVyIGluIFNNVFAgc3VibWl0dGVyOiAiICsgcyk7CiAJICAgIGlmIChjIDwgJyEnIHx8IGMgPiAnficgfHwgYyA9PSAnKycgfHwgYyA9PSAnPScpIHsKKwkJLy8gbm90IHByaW50YWJsZSBBU0NJSQogCQlpZiAoc2IgPT0gbnVsbCkgewotCQkgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyA0KTsKKwkJICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSArIDQpOwogCQkgICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIGkpKTsKIAkJfQogCQlzYi5hcHBlbmQoJysnKTsKQEAgLTI1NTEsOSArMjY2MSwxNTUgQEAKIAkJCQkocGFzc3dvcmQgPT0gbnVsbCA/ICI8bnVsbD4iIDogIjxub24tbnVsbD4iKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBTdHJpbmcgdG8gZWl0aGVyIEFTQ0lJIG9yIFVURi04IGJ5dGVzCisgICAgICogZGVwZW5kaW5nIG9uIGFsbG93dXRmOC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSB0b0J5dGVzKFN0cmluZyBzKSB7CisJaWYgKGFsbG93dXRmOCkKKwkgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJZWxzZQorCSAgICAvLyBkb24ndCB1c2UgU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSBiZWNhdXNlIGl0IHJlamVjdHMgbm9uLUFTQ0lJCisJICAgIHJldHVybiBBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXMocyk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBQcm9iZSBwb2ludHMgZm9yIEdsYXNzRmlzaCBtb25pdG9yaW5nLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVN0YXJ0KFN0cmluZyBzdWJqZWN0KSB7IH0KICAgICBwcml2YXRlIHZvaWQgc2VuZE1lc3NhZ2VFbmQoKSB7IH0KKworCisgICAgLyoqCisgICAgICogQW4gU01UUE91dHB1dFN0cmVhbSB0aGF0IHdyYXBzIGEgQ2h1bmtlZE91dHB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEJEQVRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBTTVRQT3V0cHV0U3RyZWFtIHsKKworCS8qKgorCSAqIENyZWF0ZSBhIEJEQVRPdXRwdXRTdHJlYW0gdGhhdCB3cmFwcyBhIENodW5rZWRPdXRwdXRTdHJlYW0KKwkgKiBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgYnVpbHQgb24gdG9wIG9mIHRoZSBzcGVjaWZpZWQKKwkgKiB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uCisJICoKKwkgKiBAcGFyYW0Jb3V0CXRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KKwkgKiBAcGFyYW0Jc2l6ZQl0aGUgY2h1bmsgc2l6ZQorCSAqLworCXB1YmxpYyBCREFUT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIGludCBzaXplKSB7CisJICAgIHN1cGVyKG5ldyBDaHVua2VkT3V0cHV0U3RyZWFtKG91dCwgc2l6ZSkpOworCX0KKworCS8qKgorCSAqIENsb3NlIHRoaXMgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJICAgIG91dC5jbG9zZSgpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBPdXRwdXRTdHJlYW0gdGhhdCBidWZmZXJzIGRhdGEgaW4gY2h1bmtzIGFuZCB1c2VzIHRoZQorICAgICAqIFJGQyAzMDMwIEJEQVQgU01UUCBjb21tYW5kIHRvIHNlbmQgZWFjaCBjaHVuay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENodW5rZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCXByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKKwlwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWY7CisJcHJpdmF0ZSBpbnQgY291bnQgPSAwOworCisJLyoqCisJICogQ3JlYXRlIGEgQ2h1bmtlZE91dHB1dFN0cmVhbSBidWlsdCBvbiB0b3Agb2YgdGhlIHNwZWNpZmllZAorCSAqIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbQlvdXQJdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQorCSAqIEBwYXJhbQlzaXplCXRoZSBjaHVuayBzaXplCisJICovCisJcHVibGljIENodW5rZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgaW50IHNpemUpIHsKKwkgICAgdGhpcy5vdXQgPSBvdXQ7CisJICAgIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworCX0KKworCS8qKgorCSAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPmJ5dGU8L2NvZGU+IHRvIHRoaXMgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBwYXJhbQliCXRoZSBieXRlIHRvIHdyaXRlCisJICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbglmb3IgSS9PIGVycm9ycworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCSAgICBidWZbY291bnQrK10gPSAoYnl0ZSliOworCSAgICBpZiAoY291bnQgPj0gYnVmLmxlbmd0aCkKKwkJZmx1c2goKTsKKwl9CisJCQorCS8qKgorCSAqIFdyaXRlcyBsZW4gYnl0ZXMgdG8gdGhpcyBvdXRwdXQgc3RyZWFtIHN0YXJ0aW5nIGF0IG9mZi4KKwkgKgorCSAqIEBwYXJhbQliCWJ5dGVzIHRvIHdyaXRlCisJICogQHBhcmFtCW9mZglvZmZzZXQgaW4gYXJyYXkKKwkgKiBAcGFyYW0JbGVuCW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorCSAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkgICAgd2hpbGUgKGxlbiA+IDApIHsKKwkJaW50IHNpemUgPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gY291bnQsIGxlbik7CisJCWlmIChzaXplID09IGJ1Zi5sZW5ndGgpIHsKKwkJICAgIC8vIGF2b2lkIHRoZSBjb3B5CisJCSAgICBiZGF0KGIsIG9mZiwgc2l6ZSwgZmFsc2UpOworCQl9IGVsc2UgeworCQkgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ1ZiwgY291bnQsIHNpemUpOworCQkgICAgY291bnQgKz0gc2l6ZTsKKwkJfQorCQlvZmYgKz0gc2l6ZTsKKwkJbGVuIC09IHNpemU7CisJCWlmIChjb3VudCA+PSBidWYubGVuZ3RoKQorCQkgICAgZmx1c2goKTsKKwkgICAgfQorCX0KKworCS8qKgorCSAqIEZsdXNoIHRoaXMgb3V0cHV0IHN0cmVhbS4KKwkgKgorCSAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJICAgIGJkYXQoYnVmLCAwLCBjb3VudCwgZmFsc2UpOworCSAgICBjb3VudCA9IDA7CisJfQorCisJLyoqCisJICogQ2xvc2UgdGhpcyBvdXRwdXQgc3RyZWFtLgorCSAqCisJICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbglmb3IgSS9PIGVycm9ycworCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkgICAgYmRhdChidWYsIDAsIGNvdW50LCB0cnVlKTsKKwkgICAgY291bnQgPSAwOworCX0KKworCS8qKgorCSAqIFNlbmQgdGhlIHNwZWNpZmllZCBieXRlcyB1c2luZyB0aGUgQkRBVCBjb21tYW5kLgorCSAqLworCXByaXZhdGUgdm9pZCBiZGF0KGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuLCBib29sZWFuIGxhc3QpCisJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkgICAgaWYgKGxlbiA+IDAgfHwgbGFzdCkgeworCQl0cnkgeworCQkgICAgaWYgKGxhc3QpCisJCQlzZW5kQ29tbWFuZCgiQkRBVCAiICsgbGVuICsgIiBMQVNUIik7CisJCSAgICBlbHNlCisJCQlzZW5kQ29tbWFuZCgiQkRBVCAiICsgbGVuKTsKKwkJICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7CisJCSAgICBvdXQuZmx1c2goKTsKKwkJICAgIGludCByZXQgPSByZWFkU2VydmVyUmVzcG9uc2UoKTsKKwkJICAgIGlmIChyZXQgIT0gMjUwKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGxhc3RTZXJ2ZXJSZXNwb25zZSk7CisJCX0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBtZXgpIHsKKwkJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQkRBVCB3cml0ZSBleGNlcHRpb24iLCBtZXgpOworCQl9CisJICAgIH0KKwl9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC9zbXRwL1Nhc2xBdXRoZW50aWNhdG9yLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU2FzbEF1dGhlbnRpY2F0b3IuamF2YQppbmRleCAzMzAwODMxLi5mMzQ4NmFjIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU2FzbEF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvU2FzbEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9wYWNrYWdlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3NtdHAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmEzZjY4Li4wMDAwMDAwCi0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvc210cC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0KLQotICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKLSAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAotICAgIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gICAgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCi0gICAgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAgICBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCi0gICAgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gICAgZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgotCi0gICAgR1BMIENsYXNzcGF0aCBFeGNlcHRpb246Ci0gICAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKLSAgICBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAgICBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotCi0gICAgTW9kaWZpY2F0aW9uczoKLSAgICBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcwotICAgIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdIHJlcGxhY2VkIGJ5IHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uOgotICAgICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICBDb250cmlidXRvcihzKToKLSAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAgICBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZyAiW0NvbnRyaWJ1dG9yXQotICAgIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcyBkaXN0cmlidXRpb24gdW5kZXIgdGhlIFtDRERMIG9yIEdQTAotICAgIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAgICByZWNpcGllbnQgaGFzIHRoZSBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi0gICAgZWl0aGVyIHRoZSBDRERMLCB0aGUgR1BMIFZlcnNpb24gMiBvciB0byBleHRlbmQgdGhlIGNob2ljZSBvZiBsaWNlbnNlIHRvCi0gICAgaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gICAgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZSBvcHRpb24gYXBwbGllcwotICAgIG9ubHkgaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byBzdWNoIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0Ci0gICAgaG9sZGVyLgotCi0tLT4KLQotPC9IRUFEPgotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi1BbiBTTVRQIHByb3RvY29sIHByb3ZpZGVyIGZvciB0aGUgSmF2YU1haWwgQVBJCi10aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhbiBTTVRQIHNlcnZlci4KLVJlZmVyIHRvIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzgyMS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDgyMTwvQT4KLWZvciBtb3JlIGluZm9ybWF0aW9uLgotPFA+Ci1XaGVuIHNlbmRpbmcgYSBtZXNzYWdlLCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBlYWNoIGFkZHJlc3MgdGhhdAotZmFpbHMgaXMgYXZhaWxhYmxlIGluIGFuCi17QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUEFkZHJlc3NGYWlsZWRFeGNlcHRpb24gU01UUEFkZHJlc3NGYWlsZWRFeGNlcHRpb259Ci1jaGFpbmVkIG9mZiB0aGUgdG9wIGxldmVsCi17QGxpbmsgamF2YXgubWFpbC5TZW5kRmFpbGVkRXhjZXB0aW9uIFNlbmRGYWlsZWRFeGNlcHRpb259Ci10aGF0IGlzIHRocm93bi4KLUluIGFkZGl0aW9uLCBpZiB0aGUgPGNvZGU+bWFpbC5zbXRwLnJlcG9ydHN1Y2Nlc3M8L2NvZGU+IHByb3BlcnR5Ci1pcyBzZXQsIGFuCi17QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUEFkZHJlc3NTdWNjZWVkZWRFeGNlcHRpb24KLVNNVFBBZGRyZXNzU3VjY2VlZGVkRXhjZXB0aW9ufQotd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBmb3IgZWFjaCBhZGRyZXNzIHRoYXQgaXMgc3VjY2Vzc2Z1bC4KLU5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UgYSB0b3AgbGV2ZWwKLXtAbGluayBqYXZheC5tYWlsLlNlbmRGYWlsZWRFeGNlcHRpb24gU2VuZEZhaWxlZEV4Y2VwdGlvbn0KLXRvIGJlIHRocm93biBldmVuIHRob3VnaCB0aGUgc2VuZCB3YXMgc3VjY2Vzc2Z1bC4KLTxQPgotVGhlIFNNVFAgcHJvdmlkZXIgYWxzbyBzdXBwb3J0cyBFU01UUAotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE2NTEudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAxNjUxPC9BPikuCi1JdCBjYW4gb3B0aW9uYWxseSB1c2UgU01UUCBBdXRoZW50aWNhdGlvbiAKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNTU0LnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMjU1NDwvQT4pCi11c2luZyB0aGUgTE9HSU4sIFBMQUlOLCBESUdFU1QtTUQ1LCBhbmQgTlRMTSBtZWNoYW5pc21zCi0oPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjU5NS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDI1OTU8L0E+Ci1hbmQgPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgzMS50eHQiIFRBUkdFVD0iX3RvcCI+UkZDIDI4MzE8L0E+KS4KLTxQPgotVG8gdXNlIFNNVFAgYXV0aGVudGljYXRpb24geW91J2xsIG5lZWQgdG8gc2V0IHRoZSA8Y29kZT5tYWlsLnNtdHAuYXV0aDwvY29kZT4KLXByb3BlcnR5IChzZWUgYmVsb3cpIG9yIHByb3ZpZGUgdGhlIFNNVFAgVHJhbnNwb3J0Ci13aXRoIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdoZW4gY29ubmVjdGluZyB0byB0aGUgU01UUCBzZXJ2ZXIuICBZb3UKLWNhbiBkbyB0aGlzIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIGFwcHJvYWNoZXM6Ci08UD4KLTxVTD4KLTxMST4KLVByb3ZpZGUgYW4gQXV0aGVudGljYXRvciBvYmplY3Qgd2hlbiBjcmVhdGluZyB5b3VyIG1haWwgU2Vzc2lvbgotYW5kIHByb3ZpZGUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlCi1BdXRoZW50aWNhdG9yIGNhbGxiYWNrLgotPFA+Ci1Ob3RlIHRoYXQgdGhlIDxjb2RlPm1haWwuc210cC51c2VyPC9jb2RlPiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIHByb3ZpZGUgYQotZGVmYXVsdCB1c2VybmFtZSBmb3IgdGhlIGNhbGxiYWNrLCBidXQgdGhlIHBhc3N3b3JkIHdpbGwgc3RpbGwgbmVlZCB0byBiZQotc3VwcGxpZWQgZXhwbGljaXRseS4KLTxQPgotVGhpcyBhcHByb2FjaCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgc3RhdGljIFRyYW5zcG9ydCA8Y29kZT5zZW5kPC9jb2RlPiBtZXRob2QKLXRvIHNlbmQgbWVzc2FnZXMuCi08L0xJPgotPFA+Ci08TEk+Ci1DYWxsIHRoZSBUcmFuc3BvcnQgPGNvZGU+Y29ubmVjdDwvY29kZT4gbWV0aG9kIGV4cGxpY2l0bHkgd2l0aCB1c2VybmFtZSBhbmQKLXBhc3N3b3JkIGFyZ3VtZW50cy4KLTxQPgotVGhpcyBhcHByb2FjaCByZXF1aXJlcyB5b3UgdG8gZXhwbGljaXRseSBtYW5hZ2UgYSBUcmFuc3BvcnQgb2JqZWN0Ci1hbmQgdXNlIHRoZSBUcmFuc3BvcnQgPGNvZGU+c2VuZE1lc3NhZ2U8L2NvZGU+IG1ldGhvZCB0byBzZW5kIHRoZSBtZXNzYWdlLgotVGhlIHRyYW5zcG9ydC5qYXZhIGRlbW8gcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgaG93IHRvIG1hbmFnZSBhIFRyYW5zcG9ydAotb2JqZWN0LiAgVGhlIGZvbGxvd2luZyBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhlIHN0YXRpYwotVHJhbnNwb3J0IDxjb2RlPnNlbmQ8L2NvZGU+IG1ldGhvZCwgYnV0IHN1cHBsaWVzIHRoZSBuZWVkZWQgdXNlcm5hbWUgYW5kCi1wYXNzd29yZDoKLTxQPgotPEJMT0NLUVVPVEU+PFBSRT4KLVRyYW5zcG9ydCB0ciA9IHNlc3Npb24uZ2V0VHJhbnNwb3J0KCJzbXRwIik7Ci10ci5jb25uZWN0KHNtdHBob3N0LCB1c2VybmFtZSwgcGFzc3dvcmQpOwotbXNnLnNhdmVDaGFuZ2VzKCk7CS8vIGRvbid0IGZvcmdldCB0aGlzCi10ci5zZW5kTWVzc2FnZShtc2csIG1zZy5nZXRBbGxSZWNpcGllbnRzKCkpOwotdHIuY2xvc2UoKTsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLTwvTEk+Ci08L1VMPgotPFA+Ci1XaGVuIHVzaW5nIERJR0VTVC1NRDUgYXV0aGVudGljYXRpb24sCi15b3UnbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBhbiBhcHByb3ByaWF0ZSByZWFsbTsKLXlvdXIgbWFpbCBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBjYW4gc3VwcGx5IHRoaXMgaW5mb3JtYXRpb24uCi1Zb3UgY2FuIHNldCB0aGlzIHVzaW5nIHRoZSA8Y29kZT5tYWlsLnNtdHAuc2FzbC5yZWFsbTwvY29kZT4gcHJvcGVydHksCi1vciB0aGUgPGNvZGU+c2V0U0FTTFJlYWxtPC9jb2RlPiBtZXRob2Qgb24gPGNvZGU+U01UUFRyYW5zcG9ydDwvY29kZT4uCi08UD4KLVRoZSBTTVRQIHByb3RvY29sIHByb3ZpZGVyIGNhbiB1c2UgU0FTTAotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIyMjIudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyMjIyPC9BPikKLWF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlCi08Q09ERT5qYXZheC5zZWN1cml0eS5zYXNsPC9DT0RFPiBBUElzLCBzdWNoIGFzIEoyU0UgNS4wLgotSW4gYWRkaXRpb24gdG8gdGhlIFNBU0wgbWVjaGFuaXNtcyB0aGF0IGFyZSBidWlsdCBpbnRvIAotdGhlIFNBU0wgaW1wbGVtZW50YXRpb24sIHVzZXJzIGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbAotU0FTTCBtZWNoYW5pc21zIG9mIHRoZWlyIG93biBkZXNpZ24gdG8gc3VwcG9ydCBjdXN0b20gYXV0aGVudGljYXRpb24KLXNjaGVtZXMuICBTZWUgdGhlCi08QSBIUkVGPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS9zYXNsL3Nhc2wtcmVmZ3VpZGUuaHRtbCIgVEFSR0VUPSJfdG9wIj4KLUphdmEgU0FTTCBBUEkgUHJvZ3JhbW1pbmcgYW5kIERlcGxveW1lbnQgR3VpZGU8L0E+IGZvciBkZXRhaWxzLgotTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBTQVNMIG1lY2hhbmlzbXMKLXRoYXQgcHJvdmlkZSB0aGVpciBvd24gaW50ZWdyaXR5IG9yIGNvbmZpZGVudGlhbGl0eSBsYXllci4KLTxQPgotU3VwcG9ydCBmb3IgT0F1dGggMi4wIGF1dGhlbnRpY2F0aW9uIHZpYSB0aGUKLTxBIEhSRUY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2dtYWlsL3hvYXV0aDJfcHJvdG9jb2wiIFRBUkdFVD0iX3RvcCI+Ci1YT0FVVEgyIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbTwvQT4gaXMgcHJvdmlkZWQgZWl0aGVyIHRocm91Z2ggdGhlIFNBU0wKLXN1cHBvcnQgZGVzY3JpYmVkIGFib3ZlIG9yIGFzIGEgYnVpbHQtaW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGluIHRoZQotU01UUCBwcm92aWRlci4KLVRoZSBPQXV0aCAyLjAgQWNjZXNzIFRva2VuIHNob3VsZCBiZSBwYXNzZWQgYXMgdGhlIHBhc3N3b3JkIGZvciB0aGlzIG1lY2hhbmlzbS4KLVNlZSA8QSBIUkVGPSJodHRwczovL2phdmEubmV0L3Byb2plY3RzL2phdmFtYWlsL3BhZ2VzL09BdXRoMiIgVEFSR0VUPSJfdG9wIj4KLU9BdXRoMiBTdXBwb3J0PC9BPiBmb3IgZGV0YWlscy4KLTxQPgotU01UUCBjYW4gYWxzbyBvcHRpb25hbGx5IHJlcXVlc3QgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbnMKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxODkxLnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMTg5MTwvQT4pLgotVGhlIGRlbGl2ZXJ5IHN0YXR1cyB3aWxsIHR5cGljYWxseSBiZSByZXBvcnRlZCB1c2luZwotYSAibXVsdGlwYXJ0L3JlcG9ydCIKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxODkyLnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMTg5MjwvQT4pCi1tZXNzYWdlIHR5cGUgd2l0aCBhICJtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyIKLSg8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxODk0LnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMTg5NDwvQT4pCi1wYXJ0LgotWW91IGNhbiB1c2UgdGhlIGNsYXNzZXMgaW4gdGhlIHtAbGluayBjb20uc3VuLm1haWwuZHNufSBwYWNrYWdlIHRvCi1oYW5kbGUgdGhlc2UgTUlNRSB0eXBlcy4KLU5vdGUgdGhhdCB5b3UnbGwgbmVlZCB0byBpbmNsdWRlIDxjb2RlPmRzbi5qYXI8L2NvZGU+IGluIHlvdXIgQ0xBU1NQQVRICi1hcyB0aGlzIHN1cHBvcnQgaXMgbm90IGluY2x1ZGVkIGluIDxjb2RlPm1haWwuamFyPC9jb2RlPi4KLTxQPgotU2VlIGJlbG93IGZvciB0aGUgcHJvcGVydGllcyB0byBlbmFibGUgdGhlc2UgZmVhdHVyZXMuCi08UD4KLU5vdGUgYWxzbyB0aGF0IDxzdHJvbmc+VEhFUkUgSVMgTk9UIFNVRkZJQ0lFTlQgRE9DVU1FTlRBVElPTiBIRVJFIFRPIFVTRSBUSEVTRQotRkVBVFVSRVMhISE8L3N0cm9uZz4gIFlvdSB3aWxsIG5lZWQgdG8gcmVhZCB0aGUgYXBwcm9wcmlhdGUgUkZDcyBtZW50aW9uZWQgYWJvdmUKLXRvIHVuZGVyc3RhbmQgd2hhdCB0aGVzZSBmZWF0dXJlcyBkbyBhbmQgaG93IHRvIHVzZSB0aGVtLiAgRG9uJ3QganVzdAotc3RhcnQgc2V0dGluZyBwcm9wZXJ0aWVzIGFuZCB0aGVuIGNvbXBsYWluIHRvIHVzIHdoZW4gaXQgZG9lc24ndCB3b3JrCi1saWtlIHlvdSBleHBlY3QgaXQgdG8gd29yay4gIDxzdHJvbmc+UkVBRCBUSEUgUkZDcyBGSVJTVCEhITwvc3Ryb25nPgotPFA+Ci08QSBOQU1FPSJwcm9wZXJ0aWVzIj4KLTxIND5Qcm9wZXJ0aWVzPC9IND4KLTwvQT4KLVRoZSBTTVRQIHByb3RvY29sIHByb3ZpZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcywKLXdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIEphdmFNYWlsIDxjb2RlPlNlc3Npb248L2NvZGU+IG9iamVjdC4KLVRoZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgc2V0IGFzIHN0cmluZ3M7IHRoZSBUeXBlIGNvbHVtbiBkZXNjcmliZXMKLWhvdyB0aGUgc3RyaW5nIGlzIGludGVycHJldGVkLiAgRm9yIGV4YW1wbGUsIHVzZQotPFBSRT4KLQlwcm9wcy5wdXQoIm1haWwuc210cC5wb3J0IiwgIjg4OCIpOwotPC9QUkU+Ci10byBzZXQgdGhlIDxDT0RFPm1haWwuc210cC5wb3J0PC9DT0RFPiBwcm9wZXJ0eSwgd2hpY2ggaXMgb2YgdHlwZSBpbnQuCi08UD4KLU5vdGUgdGhhdCBpZiB5b3UncmUgdXNpbmcgdGhlICJzbXRwcyIgcHJvdG9jb2wgdG8gYWNjZXNzIFNNVFAgb3ZlciBTU0wsCi1hbGwgdGhlIHByb3BlcnRpZXMgd291bGQgYmUgbmFtZWQgIm1haWwuc210cHMuKiIuCi08UD4KLTxUQUJMRSBCT1JERVI+Ci08VFI+Ci08VEg+TmFtZTwvVEg+Ci08VEg+VHlwZTwvVEg+Ci08VEg+RGVzY3JpcHRpb248L1RIPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnVzZXIiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnVzZXIiPgotPFREPm1haWwuc210cC51c2VyPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPkRlZmF1bHQgdXNlciBuYW1lIGZvciBTTVRQLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuaG9zdCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuaG9zdCI+Ci08VEQ+bWFpbC5zbXRwLmhvc3Q8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+VGhlIFNNVFAgc2VydmVyIHRvIGNvbm5lY3QgdG8uPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5wb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5wb3J0Ij4KLTxURD5tYWlsLnNtdHAucG9ydDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD5UaGUgU01UUCBzZXJ2ZXIgcG9ydCB0byBjb25uZWN0IHRvLCBpZiB0aGUgY29ubmVjdCgpIG1ldGhvZCBkb2Vzbid0Ci1leHBsaWNpdGx5IHNwZWNpZnkgb25lLiBEZWZhdWx0cyB0byAyNS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmNvbm5lY3Rpb250aW1lb3V0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5jb25uZWN0aW9udGltZW91dCI+Ci08VEQ+bWFpbC5zbXRwLmNvbm5lY3Rpb250aW1lb3V0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPlNvY2tldCBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgotVGhpcyB0aW1lb3V0IGlzIGltcGxlbWVudGVkIGJ5IGphdmEubmV0LlNvY2tldC4KLURlZmF1bHQgaXMgaW5maW5pdGUgdGltZW91dC48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnRpbWVvdXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnRpbWVvdXQiPgotPFREPm1haWwuc210cC50aW1lb3V0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPlNvY2tldCByZWFkIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgotVGhpcyB0aW1lb3V0IGlzIGltcGxlbWVudGVkIGJ5IGphdmEubmV0LlNvY2tldC4KLURlZmF1bHQgaXMgaW5maW5pdGUgdGltZW91dC48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLndyaXRldGltZW91dCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAud3JpdGV0aW1lb3V0Ij4KLTxURD5tYWlsLnNtdHAud3JpdGV0aW1lb3V0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPlNvY2tldCB3cml0ZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KLVRoaXMgdGltZW91dCBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBhCi1qYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgcGVyIGNvbm5lY3Rpb24KLXRoYXQgc2NoZWR1bGVzIGEgdGhyZWFkIHRvIGNsb3NlIHRoZSBzb2NrZXQgaWYgdGhlIHRpbWVvdXQgZXhwaXJlcy4KLVRodXMsIHRoZSBvdmVyaGVhZCBvZiB1c2luZyB0aGlzIHRpbWVvdXQgaXMgb25lIHRocmVhZCBwZXIgY29ubmVjdGlvbi4KLURlZmF1bHQgaXMgaW5maW5pdGUgdGltZW91dC48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmZyb20iPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmZyb20iPgotPFREPm1haWwuc210cC5mcm9tPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotRW1haWwgYWRkcmVzcyB0byB1c2UgZm9yIFNNVFAgTUFJTCBjb21tYW5kLiAgVGhpcyBzZXRzIHRoZSBlbnZlbG9wZQotcmV0dXJuIGFkZHJlc3MuICBEZWZhdWx0cyB0byBtc2cuZ2V0RnJvbSgpIG9yCi1JbnRlcm5ldEFkZHJlc3MuZ2V0TG9jYWxBZGRyZXNzKCkuICBOT1RFOiBtYWlsLnNtdHAudXNlciB3YXMgcHJldmlvdXNseQotdXNlZCBmb3IgdGhpcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAubG9jYWxob3N0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5sb2NhbGhvc3QiPgotPFREPm1haWwuc210cC5sb2NhbGhvc3Q8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1Mb2NhbCBob3N0IG5hbWUgdXNlZCBpbiB0aGUgU01UUCBIRUxPIG9yIEVITE8gY29tbWFuZC4KLURlZmF1bHRzIHRvIDxjb2RlPkluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk8L2NvZGU+LgotU2hvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvCi1iZSBzZXQgaWYgeW91ciBKREsgYW5kIHlvdXIgbmFtZSBzZXJ2aWNlIGFyZSBjb25maWd1cmVkIHByb3Blcmx5LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5sb2NhbGFkZHJlc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmxvY2FsYWRkcmVzcyI+Ci08VEQ+bWFpbC5zbXRwLmxvY2FsYWRkcmVzczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUxvY2FsIGFkZHJlc3MgKGhvc3QgbmFtZSkgdG8gYmluZCB0byB3aGVuIGNyZWF0aW5nIHRoZSBTTVRQIHNvY2tldC4KLURlZmF1bHRzIHRvIHRoZSBhZGRyZXNzIHBpY2tlZCBieSB0aGUgU29ja2V0IGNsYXNzLgotU2hvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvIGJlIHNldCwgYnV0IHVzZWZ1bCB3aXRoIG11bHRpLWhvbWVkIGhvc3RzCi13aGVyZSBpdCdzIGltcG9ydGFudCB0byBwaWNrIGEgcGFydGljdWxhciBsb2NhbCBhZGRyZXNzIHRvIGJpbmQgdG8uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmxvY2FscG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAubG9jYWxwb3J0Ij4KLTxURD5tYWlsLnNtdHAubG9jYWxwb3J0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPgotTG9jYWwgcG9ydCBudW1iZXIgdG8gYmluZCB0byB3aGVuIGNyZWF0aW5nIHRoZSBTTVRQIHNvY2tldC4KLURlZmF1bHRzIHRvIHRoZSBwb3J0IG51bWJlciBwaWNrZWQgYnkgdGhlIFNvY2tldCBjbGFzcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuZWhsbyI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuZWhsbyI+Ci08VEQ+bWFpbC5zbXRwLmVobG88L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgZmFsc2UsIGRvIG5vdCBhdHRlbXB0IHRvIHNpZ24gb24gd2l0aCB0aGUgRUhMTyBjb21tYW5kLiAgRGVmYXVsdHMgdG8KLXRydWUuICBOb3JtYWxseSBmYWlsdXJlIG9mIHRoZSBFSExPIGNvbW1hbmQgd2lsbCBmYWxsYmFjayB0byB0aGUgSEVMTwotY29tbWFuZDsgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb25seSBmb3Igc2VydmVycyB0aGF0IGRvbid0IGZhaWwgRUhMTwotcHJvcGVybHkgb3IgZG9uJ3QgaW1wbGVtZW50IEVITE8gcHJvcGVybHkuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmF1dGgiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmF1dGgiPgotPFREPm1haWwuc210cC5hdXRoPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiB0cnVlLCBhdHRlbXB0IHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB1c2luZyB0aGUgQVVUSCBjb21tYW5kLgotRGVmYXVsdHMgdG8gZmFsc2UuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5hdXRoLm1lY2hhbmlzbXMiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmF1dGgubWVjaGFuaXNtcyI+Ci08VEQ+bWFpbC5zbXRwLmF1dGgubWVjaGFuaXNtczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgbGlzdHMgdGhlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgdG8gY29uc2lkZXIsIGFuZCB0aGUgb3JkZXIKLWluIHdoaWNoIHRvIGNvbnNpZGVyIHRoZW0uICBPbmx5IG1lY2hhbmlzbXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYW5kCi1zdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLgotVGhlIGRlZmF1bHQgaXMgPGNvZGU+IkxPR0lOIFBMQUlOIERJR0VTVC1NRDUgTlRMTSI8L2NvZGU+LCB3aGljaCBpbmNsdWRlcyBhbGwKLXRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotZXhjZXB0IFhPQVVUSDIuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmF1dGgubG9naW4uZGlzYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuYXV0aC5sb2dpbi5kaXNhYmxlIj4KLTxURD5tYWlsLnNtdHAuYXV0aC5sb2dpbi5kaXNhYmxlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiB0cnVlLCBwcmV2ZW50cyB1c2Ugb2YgdGhlIDxjb2RlPkFVVEggTE9HSU48L2NvZGU+IGNvbW1hbmQuCi1EZWZhdWx0IGlzIGZhbHNlLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuYXV0aC5wbGFpbi5kaXNhYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5hdXRoLnBsYWluLmRpc2FibGUiPgotPFREPm1haWwuc210cC5hdXRoLnBsYWluLmRpc2FibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPklmIHRydWUsIHByZXZlbnRzIHVzZSBvZiB0aGUgPGNvZGU+QVVUSCBQTEFJTjwvY29kZT4gY29tbWFuZC4KLURlZmF1bHQgaXMgZmFsc2UuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5hdXRoLmRpZ2VzdC1tZDUuZGlzYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuYXV0aC5kaWdlc3QtbWQ1LmRpc2FibGUiPgotPFREPm1haWwuc210cC5hdXRoLmRpZ2VzdC1tZDUuZGlzYWJsZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+SWYgdHJ1ZSwgcHJldmVudHMgdXNlIG9mIHRoZSA8Y29kZT5BVVRIIERJR0VTVC1NRDU8L2NvZGU+IGNvbW1hbmQuCi1EZWZhdWx0IGlzIGZhbHNlLjwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuYXV0aC5udGxtLmRpc2FibGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmF1dGgubnRsbS5kaXNhYmxlIj4KLTxURD5tYWlsLnNtdHAuYXV0aC5udGxtLmRpc2FibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPklmIHRydWUsIHByZXZlbnRzIHVzZSBvZiB0aGUgPGNvZGU+QVVUSCBOVExNPC9jb2RlPiBjb21tYW5kLgotRGVmYXVsdCBpcyBmYWxzZS48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmF1dGgubnRsbS5kb21haW4iPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmF1dGgubnRsbS5kb21haW4iPgotPFREPm1haWwuc210cC5hdXRoLm50bG0uZG9tYWluPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotVGhlIE5UTE0gYXV0aGVudGljYXRpb24gZG9tYWluLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5hdXRoLm50bG0uZmxhZ3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmF1dGgubnRsbS5mbGFncyI+Ci08VEQ+bWFpbC5zbXRwLmF1dGgubnRsbS5mbGFnczwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLU5UTE0gcHJvdG9jb2wtc3BlY2lmaWMgZmxhZ3MuCi1TZWUgPEEgSFJFRj0iaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sI3RoZU50bG1GbGFncyIgVEFSR0VUPSJfdG9wIj4KLWh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbCN0aGVOdGxtRmxhZ3M8L0E+IGZvciBkZXRhaWxzLgotPC9URD4KLTwvVFI+Ci0KLTwhLS0KLTxBIE5BTUU9Im1haWwuc210cC5hdXRoLm50bG0udW5pY29kZSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuYXV0aC5udGxtLnVuaWNvZGUiPgotPFREPm1haWwuc210cC5hdXRoLm50bG0udW5pY29kZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1TZXQgdGhpcyB0byAidHJ1ZSIgaWYgdGhlIHVzZXJuYW1lIG9yIHBhc3N3b3JkIG1heSB1c2UKLVVuaWNvZGUgVVRGLTggZW5jb2RlZCBjaGFyYWN0ZXJzLiAgRGVmYXVsdCBpcyAidHJ1ZSIuCi1DdXJyZW50bHkgaGFzIG5vIGVmZmVjdC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuYXV0aC5udGxtLmxtY29tcGF0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5hdXRoLm50bG0ubG1jb21wYXQiPgotPFREPm1haWwuc210cC5hdXRoLm50bG0ubG1jb21wYXQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+Ci1TZXRzIHRoZSBMTSBjb21wYXRpYmlsaXR5IGxldmVsLCBhcyBkZXNjcmliZWQgaGVyZToKLTxBIEhSRUY9Imh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbCNudGxtVmVyc2lvbjIiIFRBUkdFVD0iX3RvcCI+Ci1odHRwOi8vY3VybC5oYXh4LnNlL3JmYy9udGxtLmh0bWwjbnRsbVZlcnNpb24yPC9BPgotRGVmYXVsdHMgdG8gIjMiLiAgQ3VycmVudGx5IG5vdCB1c2VkLgotPC9URD4KLTwvVFI+Ci0tLT4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmF1dGgueG9hdXRoMi5kaXNhYmxlIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5hdXRoLnhvYXV0aDIuZGlzYWJsZSI+Ci08VEQ+bWFpbC5zbXRwLmF1dGgueG9hdXRoMi5kaXNhYmxlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD5JZiB0cnVlLCBwcmV2ZW50cyB1c2Ugb2YgdGhlIDxjb2RlPkFVVEhFTlRJQ0FURSBYT0FVVEgyPC9jb2RlPiBjb21tYW5kLgotQmVjYXVzZSB0aGUgT0F1dGggMi4wIHByb3RvY29sIHJlcXVpcmVzIGEgc3BlY2lhbCBhY2Nlc3MgdG9rZW4gaW5zdGVhZCBvZgotYSBwYXNzd29yZCwgdGhpcyBtZWNoYW5pc20gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIEVuYWJsZSBpdCBieSBleHBsaWNpdGx5Ci1zZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gImZhbHNlIiBvciBieSBzZXR0aW5nIHRoZSAibWFpbC5zbXRwLmF1dGgubWVjaGFuaXNtcyIKLXByb3BlcnR5IHRvICJYT0FVVEgyIi48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnN1Ym1pdHRlciI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3VibWl0dGVyIj4KLTxURD5tYWlsLnNtdHAuc3VibWl0dGVyPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPlRoZSBzdWJtaXR0ZXIgdG8gdXNlIGluIHRoZSBBVVRIIHRhZyBpbiB0aGUgTUFJTCBGUk9NIGNvbW1hbmQuCi1UeXBpY2FsbHkgdXNlZCBieSBhIG1haWwgcmVsYXkgdG8gcGFzcyBhbG9uZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLW9yaWdpbmFsIHN1Ym1pdHRlciBvZiB0aGUgbWVzc2FnZS4KLVNlZSBhbHNvIHRoZSB7QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUE1lc3NhZ2Ujc2V0U3VibWl0dGVyIHNldFN1Ym1pdHRlcn0KLW1ldGhvZCBvZiB7QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUE1lc3NhZ2UgU01UUE1lc3NhZ2V9LgotTWFpbCBjbGllbnRzIHR5cGljYWxseSBkbyBub3QgdXNlIHRoaXMuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmRzbi5ub3RpZnkiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmRzbi5ub3RpZnkiPgotPFREPm1haWwuc210cC5kc24ubm90aWZ5PC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPlRoZSBOT1RJRlkgb3B0aW9uIHRvIHRoZSBSQ1BUIGNvbW1hbmQuICBFaXRoZXIgTkVWRVIsIG9yIHNvbWUKLWNvbWJpbmF0aW9uIG9mIFNVQ0NFU1MsIEZBSUxVUkUsIGFuZCBERUxBWSAoc2VwYXJhdGVkIGJ5IGNvbW1hcykuPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5kc24ucmV0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5kc24ucmV0Ij4KLTxURD5tYWlsLnNtdHAuZHNuLnJldDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD5UaGUgUkVUIG9wdGlvbiB0byB0aGUgTUFJTCBjb21tYW5kLiAgRWl0aGVyIEZVTEwgb3IgSERSUy48L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLmFsbG93OGJpdG1pbWUiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLmFsbG93OGJpdG1pbWUiPgotPFREPm1haWwuc210cC5hbGxvdzhiaXRtaW1lPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCBhbmQgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGUgOEJJVE1JTUUgZXh0ZW5zaW9uLCB0ZXh0Ci1wYXJ0cyBvZiBtZXNzYWdlcyB0aGF0IHVzZSB0aGUgInF1b3RlZC1wcmludGFibGUiIG9yICJiYXNlNjQiIGVuY29kaW5ncwotYXJlIGNvbnZlcnRlZCB0byB1c2UgIjhiaXQiIGVuY29kaW5nIGlmIHRoZXkgZm9sbG93IHRoZSBSRkMyMDQ1IHJ1bGVzCi1mb3IgOGJpdCB0ZXh0LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zZW5kcGFydGlhbCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc2VuZHBhcnRpYWwiPgotPFREPm1haWwuc210cC5zZW5kcGFydGlhbDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgYW5kIGEgbWVzc2FnZSBoYXMgc29tZSB2YWxpZCBhbmQgc29tZSBpbnZhbGlkCi1hZGRyZXNzZXMsIHNlbmQgdGhlIG1lc3NhZ2UgYW55d2F5LCByZXBvcnRpbmcgdGhlIHBhcnRpYWwgZmFpbHVyZSB3aXRoCi1hIFNlbmRGYWlsZWRFeGNlcHRpb24uICBJZiBzZXQgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlIG1lc3NhZ2UgaXMKLW5vdCBzZW50IHRvIGFueSBvZiB0aGUgcmVjaXBpZW50cyBpZiB0aGVyZSBpcyBhbiBpbnZhbGlkIHJlY2lwaWVudAotYWRkcmVzcy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuc2FzbC5lbmFibGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNhc2wuZW5hYmxlIj4KLTxURD5tYWlsLnNtdHAuc2FzbC5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIGF0dGVtcHQgdG8gdXNlIHRoZSBqYXZheC5zZWN1cml0eS5zYXNsIHBhY2thZ2UgdG8KLWNob29zZSBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gZm9yIGxvZ2luLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNhc2wubWVjaGFuaXNtcyI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc2FzbC5tZWNoYW5pc21zIj4KLTxURD5tYWlsLnNtdHAuc2FzbC5tZWNoYW5pc21zPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotQSBzcGFjZSBvciBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBTQVNMIG1lY2hhbmlzbSBuYW1lcyB0byB0cnkKLXRvIHVzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuc2FzbC5hdXRob3JpemF0aW9uaWQiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNhc2wuYXV0aG9yaXphdGlvbmlkIj4KLTxURD5tYWlsLnNtdHAuc2FzbC5hdXRob3JpemF0aW9uaWQ8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgYXV0aG9yaXphdGlvbiBJRCB0byB1c2UgaW4gdGhlIFNBU0wgYXV0aGVudGljYXRpb24uCi1JZiBub3Qgc2V0LCB0aGUgYXV0aGVudGljYXRpb24gSUQgKHVzZXIgbmFtZSkgaXMgdXNlZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuc2FzbC5yZWFsbSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc2FzbC5yZWFsbSI+Ci08VEQ+bWFpbC5zbXRwLnNhc2wucmVhbG08L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+VGhlIHJlYWxtIHRvIHVzZSB3aXRoIERJR0VTVC1NRDUgYXV0aGVudGljYXRpb24uPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zYXNsLnVzZWNhbm9uaWNhbGhvc3RuYW1lIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zYXNsLnVzZWNhbm9uaWNhbGhvc3RuYW1lIj4KLTxURD5tYWlsLnNtdHAuc2FzbC51c2VjYW5vbmljYWxob3N0bmFtZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgdGhlIGNhbm9uaWNhbCBob3N0IG5hbWUgcmV0dXJuZWQgYnkKLXtAbGluayBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRDYW5vbmljYWxIb3N0TmFtZSBJbmV0QWRkcmVzcy5nZXRDYW5vbmljYWxIb3N0TmFtZX0KLWlzIHBhc3NlZCB0byB0aGUgU0FTTCBtZWNoYW5pc20sIGluc3RlYWQgb2YgdGhlIGhvc3QgbmFtZSB1c2VkIHRvIGNvbm5lY3QuCi1EZWZhdWx0cyB0byBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAucXVpdHdhaXQiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnF1aXR3YWl0Ij4KLTxURD5tYWlsLnNtdHAucXVpdHdhaXQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIGZhbHNlLCB0aGUgUVVJVCBjb21tYW5kIGlzIHNlbnQKLWFuZCB0aGUgY29ubmVjdGlvbiBpcyBpbW1lZGlhdGVseSBjbG9zZWQuCi1JZiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLCBjYXVzZXMgdGhlIHRyYW5zcG9ydCB0byB3YWl0Ci1mb3IgdGhlIHJlc3BvbnNlIHRvIHRoZSBRVUlUIGNvbW1hbmQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnJlcG9ydHN1Y2Nlc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnJlcG9ydHN1Y2Nlc3MiPgotPFREPm1haWwuc210cC5yZXBvcnRzdWNjZXNzPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCBjYXVzZXMgdGhlIHRyYW5zcG9ydCB0byBpbmNsdWRlIGFuCi17QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUEFkZHJlc3NTdWNjZWVkZWRFeGNlcHRpb24KLVNNVFBBZGRyZXNzU3VjY2VlZGVkRXhjZXB0aW9ufQotZm9yIGVhY2ggYWRkcmVzcyB0aGF0IGlzIHN1Y2Nlc3NmdWwuCi1Ob3RlIGFsc28gdGhhdCB0aGlzIHdpbGwgY2F1c2UgYQote0BsaW5rIGphdmF4Lm1haWwuU2VuZEZhaWxlZEV4Y2VwdGlvbiBTZW5kRmFpbGVkRXhjZXB0aW9ufQotdG8gYmUgdGhyb3duIGZyb20gdGhlCi17QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUFRyYW5zcG9ydCNzZW5kTWVzc2FnZSBzZW5kTWVzc2FnZX0KLW1ldGhvZCBvZgote0BsaW5rIGNvbS5zdW4ubWFpbC5zbXRwLlNNVFBUcmFuc3BvcnQgU01UUFRyYW5zcG9ydH0KLWV2ZW4gaWYgYWxsIGFkZHJlc3NlcyB3ZXJlIGNvcnJlY3QgYW5kIHRoZSBtZXNzYWdlIHdhcyBzZW50Ci1zdWNjZXNzZnVsbHkuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkiPgotPFREPm1haWwuc210cC5zb2NrZXRGYWN0b3J5PC9URD4KLTxURD5Tb2NrZXRGYWN0b3J5PC9URD4KLTxURD4KLUlmIHNldCB0byBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLTxjb2RlPmphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5PC9jb2RlPiBpbnRlcmZhY2UsIHRoaXMgY2xhc3MKLXdpbGwgYmUgdXNlZCB0byBjcmVhdGUgU01UUCBzb2NrZXRzLiAgTm90ZSB0aGF0IHRoaXMgaXMgYW4KLWluc3RhbmNlIG9mIGEgY2xhc3MsIG5vdCBhIG5hbWUsIGFuZCBtdXN0IGJlIHNldCB1c2luZyB0aGUKLTxjb2RlPnB1dDwvY29kZT4gbWV0aG9kLCBub3QgdGhlIDxjb2RlPnNldFByb3BlcnR5PC9jb2RlPiBtZXRob2QuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkuY2xhc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkuY2xhc3MiPgotPFREPm1haWwuc210cC5zb2NrZXRGYWN0b3J5LmNsYXNzPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotSWYgc2V0LCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlCi08Y29kZT5qYXZheC5uZXQuU29ja2V0RmFjdG9yeTwvY29kZT4gaW50ZXJmYWNlLiAgVGhpcyBjbGFzcwotd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBTTVRQIHNvY2tldHMuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkuZmFsbGJhY2siPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkuZmFsbGJhY2siPgotPFREPm1haWwuc210cC5zb2NrZXRGYWN0b3J5LmZhbGxiYWNrPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlLCBmYWlsdXJlIHRvIGNyZWF0ZSBhIHNvY2tldCB1c2luZyB0aGUgc3BlY2lmaWVkCi1zb2NrZXQgZmFjdG9yeSBjbGFzcyB3aWxsIGNhdXNlIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCB1c2luZwotdGhlIDxjb2RlPmphdmEubmV0LlNvY2tldDwvY29kZT4gY2xhc3MuCi1EZWZhdWx0cyB0byB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zb2NrZXRGYWN0b3J5LnBvcnQiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNvY2tldEZhY3RvcnkucG9ydCI+Ci08VEQ+bWFpbC5zbXRwLnNvY2tldEZhY3RvcnkucG9ydDwvVEQ+Ci08VEQ+aW50PC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvIHdoZW4gdXNpbmcgdGhlIHNwZWNpZmllZCBzb2NrZXQKLWZhY3RvcnkuCi1JZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBwb3J0IHdpbGwgYmUgdXNlZC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuc3NsLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3NsLmVuYWJsZSI+Ci08VEQ+bWFpbC5zbXRwLnNzbC5lbmFibGU8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIHVzZSBTU0wgdG8gY29ubmVjdCBhbmQgdXNlIHRoZSBTU0wgcG9ydCBieSBkZWZhdWx0LgotRGVmYXVsdHMgdG8gZmFsc2UgZm9yIHRoZSAic210cCIgcHJvdG9jb2wgYW5kIHRydWUgZm9yIHRoZSAic210cHMiIHByb3RvY29sLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zc2wuY2hlY2tzZXJ2ZXJpZGVudGl0eSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3NsLmNoZWNrc2VydmVyaWRlbnRpdHkiPgotPFREPm1haWwuc210cC5zc2wuY2hlY2tzZXJ2ZXJpZGVudGl0eTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gdHJ1ZSwgY2hlY2sgdGhlIHNlcnZlciBpZGVudGl0eSBhcyBzcGVjaWZpZWQgYnkKLTxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI1OTUudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyNTk1PC9BPi4KLVRoZXNlIGFkZGl0aW9uYWwgY2hlY2tzIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZQotYXJlIGludGVuZGVkIHRvIHByZXZlbnQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zc2wudHJ1c3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNzbC50cnVzdCI+Ci08VEQ+bWFpbC5zbXRwLnNzbC50cnVzdDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgYW5kIGEgc29ja2V0IGZhY3RvcnkgaGFzbid0IGJlZW4gc3BlY2lmaWVkLCBlbmFibGVzIHVzZSBvZiBhCi17QGxpbmsgY29tLnN1bi5tYWlsLnV0aWwuTWFpbFNTTFNvY2tldEZhY3RvcnkgTWFpbFNTTFNvY2tldEZhY3Rvcnl9LgotSWYgc2V0IHRvICIqIiwgYWxsIGhvc3RzIGFyZSB0cnVzdGVkLgotSWYgc2V0IHRvIGEgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0cywgdGhvc2UgaG9zdHMgYXJlIHRydXN0ZWQuCi1PdGhlcndpc2UsIHRydXN0IGRlcGVuZHMgb24gdGhlIGNlcnRpZmljYXRlIHRoZSBzZXJ2ZXIgcHJlc2VudHMuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNzbC5zb2NrZXRGYWN0b3J5Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zc2wuc29ja2V0RmFjdG9yeSI+Ci08VEQ+bWFpbC5zbXRwLnNzbC5zb2NrZXRGYWN0b3J5PC9URD4KLTxURD5TU0xTb2NrZXRGYWN0b3J5PC9URD4KLTxURD4KLUlmIHNldCB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUKLTxjb2RlPmphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTwvY29kZT4gY2xhc3MsIHRoaXMgY2xhc3MKLXdpbGwgYmUgdXNlZCB0byBjcmVhdGUgU01UUCBTU0wgc29ja2V0cy4gIE5vdGUgdGhhdCB0aGlzIGlzIGFuCi1pbnN0YW5jZSBvZiBhIGNsYXNzLCBub3QgYSBuYW1lLCBhbmQgbXVzdCBiZSBzZXQgdXNpbmcgdGhlCi08Y29kZT5wdXQ8L2NvZGU+IG1ldGhvZCwgbm90IHRoZSA8Y29kZT5zZXRQcm9wZXJ0eTwvY29kZT4gbWV0aG9kLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zc2wuc29ja2V0RmFjdG9yeS5jbGFzcyI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3NsLnNvY2tldEZhY3RvcnkuY2xhc3MiPgotPFREPm1haWwuc210cC5zc2wuc29ja2V0RmFjdG9yeS5jbGFzczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUlmIHNldCwgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZQotPGNvZGU+amF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5PC9jb2RlPiBjbGFzcy4gIFRoaXMgY2xhc3MKLXdpbGwgYmUgdXNlZCB0byBjcmVhdGUgU01UUCBTU0wgc29ja2V0cy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAuc3NsLnNvY2tldEZhY3RvcnkucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3NsLnNvY2tldEZhY3RvcnkucG9ydCI+Ci08VEQ+bWFpbC5zbXRwLnNzbC5zb2NrZXRGYWN0b3J5LnBvcnQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+Ci1TcGVjaWZpZXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0byB3aGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgc29ja2V0Ci1mYWN0b3J5LgotSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgcG9ydCB3aWxsIGJlIHVzZWQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnNzbC5wcm90b2NvbHMiPjwvQT4KLTxUUiBpZD0ibWFpbC5zbXRwLnNzbC5wcm90b2NvbHMiPgotPFREPm1haWwuc210cC5zc2wucHJvdG9jb2xzPC9URD4KLTxURD5zdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBTU0wgcHJvdG9jb2xzIHRoYXQgd2lsbCBiZSBlbmFibGVkIGZvciBTU0wgY29ubmVjdGlvbnMuCi1UaGUgcHJvcGVydHkgdmFsdWUgaXMgYSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHRva2VucyBhY2NlcHRhYmxlCi10byB0aGUgPGNvZGU+amF2YXgubmV0LnNzbC5TU0xTb2NrZXQuc2V0RW5hYmxlZFByb3RvY29sczwvY29kZT4gbWV0aG9kLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zc2wuY2lwaGVyc3VpdGVzIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zc2wuY2lwaGVyc3VpdGVzIj4KLTxURD5tYWlsLnNtdHAuc3NsLmNpcGhlcnN1aXRlczwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgU1NMIGNpcGhlciBzdWl0ZXMgdGhhdCB3aWxsIGJlIGVuYWJsZWQgZm9yIFNTTCBjb25uZWN0aW9ucy4KLVRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zIGFjY2VwdGFibGUKLXRvIHRoZSA8Y29kZT5qYXZheC5uZXQuc3NsLlNTTFNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzPC9jb2RlPiBtZXRob2QuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnN0YXJ0dGxzLmVuYWJsZSI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAuc3RhcnR0bHMuZW5hYmxlIj4KLTxURD5tYWlsLnNtdHAuc3RhcnR0bHMuZW5hYmxlPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHRydWUsIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgPGNvZGU+U1RBUlRUTFM8L2NvZGU+IGNvbW1hbmQgKGlmCi1zdXBwb3J0ZWQgYnkgdGhlIHNlcnZlcikgdG8gc3dpdGNoIHRoZSBjb25uZWN0aW9uIHRvIGEgVExTLXByb3RlY3RlZAotY29ubmVjdGlvbiBiZWZvcmUgaXNzdWluZyBhbnkgbG9naW4gY29tbWFuZHMuICBOb3RlIHRoYXQgYW4gYXBwcm9wcmlhdGUKLXRydXN0IHN0b3JlIG11c3QgY29uZmlndXJlZCBzbyB0aGF0IHRoZSBjbGllbnQgd2lsbCB0cnVzdCB0aGUgc2VydmVyJ3MKLWNlcnRpZmljYXRlLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLnN0YXJ0dGxzLnJlcXVpcmVkIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zdGFydHRscy5yZXF1aXJlZCI+Ci08VEQ+bWFpbC5zbXRwLnN0YXJ0dGxzLnJlcXVpcmVkPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHRydWUsIHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPlNUQVJUVExTPC9jb2RlPiBjb21tYW5kLgotSWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFNUQVJUVExTIGNvbW1hbmQsIG9yIHRoZSBjb21tYW5kCi1mYWlscywgdGhlIGNvbm5lY3QgbWV0aG9kIHdpbGwgZmFpbC4KLURlZmF1bHRzIHRvIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zb2Nrcy5ob3N0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zb2Nrcy5ob3N0Ij4KLTxURD5tYWlsLnNtdHAuc29ja3MuaG9zdDwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgaG9zdCBuYW1lIG9mIGEgU09DS1M1IHByb3h5IHNlcnZlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IKLWNvbm5lY3Rpb25zIHRvIHRoZSBtYWlsIHNlcnZlci4KLShOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIEpESyAxLjUgb3IgbmV3ZXIuKQotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5zb2Nrcy5wb3J0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5zb2Nrcy5wb3J0Ij4KLTxURD5tYWlsLnNtdHAuc29ja3MucG9ydDwvVEQ+Ci08VEQ+c3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgcG9ydCBudW1iZXIgZm9yIHRoZSBTT0NLUzUgcHJveHkgc2VydmVyLgotVGhpcyBzaG91bGQgb25seSBuZWVkIHRvIGJlIHVzZWQgaWYgdGhlIHByb3h5IHNlcnZlciBpcyBub3QgdXNpbmcKLXRoZSBzdGFuZGFyZCBwb3J0IG51bWJlciBvZiAxMDgwLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc210cC5tYWlsZXh0ZW5zaW9uIj48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5tYWlsZXh0ZW5zaW9uIj4KLTxURD5tYWlsLnNtdHAubWFpbGV4dGVuc2lvbjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUV4dGVuc2lvbiBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBNQUlMIGNvbW1hbmQuCi1UaGUgZXh0ZW5zaW9uIHN0cmluZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHN0YW5kYXJkIFNNVFAKLXNlcnZpY2UgZXh0ZW5zaW9ucyBhcyB3ZWxsIGFzIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zLgotVHlwaWNhbGx5IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5zbXRwLlNNVFBUcmFuc3BvcnQgU01UUFRyYW5zcG9ydH0KLW1ldGhvZCB7QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAuU01UUFRyYW5zcG9ydCNzdXBwb3J0c0V4dGVuc2lvbgotc3VwcG9ydHNFeHRlbnNpb259Ci10byB2ZXJpZnkgdGhhdCB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZSBkZXNpcmVkIHNlcnZpY2UgZXh0ZW5zaW9uLgotU2VlIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE4NjkudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAxODY5PC9BPgotYW5kIG90aGVyIFJGQ3MgdGhhdCBkZWZpbmUgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnNtdHAudXNlcnNldCI+PC9BPgotPFRSIGlkPSJtYWlsLnNtdHAudXNlcnNldCI+Ci08VEQ+bWFpbC5zbXRwLnVzZXJzZXQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIHRydWUsIHVzZSB0aGUgUlNFVCBjb21tYW5kIGluc3RlYWQgb2YgdGhlIE5PT1AgY29tbWFuZAotaW4gdGhlIHtAbGluayBqYXZheC5tYWlsLlRyYW5zcG9ydCNpc0Nvbm5lY3RlZCBpc0Nvbm5lY3RlZH0gbWV0aG9kLgotSW4gc29tZSBjYXNlcyBzZW5kbWFpbCB3aWxsIHJlc3BvbmQgc2xvd2x5IGFmdGVyIG1hbnkgTk9PUCBjb21tYW5kczsKLXVzZSBvZiBSU0VUIGF2b2lkcyB0aGlzIHNlbmRtYWlsIGlzc3VlLgotRGVmYXVsdHMgdG8gZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zbXRwLm5vb3Auc3RyaWN0Ij48L0E+Ci08VFIgaWQ9Im1haWwuc210cC5ub29wLnN0cmljdCI+Ci08VEQ+bWFpbC5zbXRwLm5vb3Auc3RyaWN0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCksIGluc2lzdCBvbiBhIDI1MCByZXNwb25zZSBjb2RlIGZyb20gdGhlIE5PT1AKLWNvbW1hbmQgdG8gaW5kaWNhdGUgc3VjY2Vzcy4gIFRoZSBOT09QIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUKLXtAbGluayBqYXZheC5tYWlsLlRyYW5zcG9ydCNpc0Nvbm5lY3RlZCBpc0Nvbm5lY3RlZH0gbWV0aG9kIHRvIGRldGVybWluZQotaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUuCi1Tb21lIG9sZGVyIHNlcnZlcnMgcmV0dXJuIHRoZSB3cm9uZyByZXNwb25zZSBjb2RlIG9uIHN1Y2Nlc3MsIHNvbWUKLXNlcnZlcnMgZG9uJ3QgaW1wbGVtZW50IHRoZSBOT09QIGNvbW1hbmQgYXQgYWxsIGFuZCBzbyBhbHdheXMgcmV0dXJuCi1hIGZhaWx1cmUgY29kZS4gIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhhbmRsZSBzZXJ2ZXJzCi10aGF0IGFyZSBicm9rZW4gaW4gdGhpcyB3YXkuCi1Ob3JtYWxseSwgd2hlbiBhIHNlcnZlciB0aW1lcyBvdXQgYSBjb25uZWN0aW9uLCBpdCB3aWxsIHNlbmQgYSA0MjEKLXJlc3BvbnNlIGNvZGUsIHdoaWNoIHRoZSBjbGllbnQgd2lsbCBzZWUgYXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBuZXh0Ci1jb21tYW5kIGl0IGlzc3Vlcy4KLVNvbWUgc2VydmVycyBzZW5kIHRoZSB3cm9uZyBmYWlsdXJlIHJlc3BvbnNlIGNvZGUgd2hlbiB0aW1pbmcgb3V0IGEKLWNvbm5lY3Rpb24uCi1EbyBub3Qgc2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2Ugd2hlbiBkZWFsaW5nIHdpdGggc2VydmVycyB0aGF0IGFyZQotYnJva2VuIGluIHRoaXMgd2F5LgotPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci08UD4KLUluIGdlbmVyYWwsIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IG5lZWQgdG8gdXNlIHRoZSBjbGFzc2VzIGluIHRoaXMKLXBhY2thZ2UgZGlyZWN0bHkuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgdGhlIEFQSXMgZGVmaW5lZCBieQotPGNvZGU+amF2YXgubWFpbDwvY29kZT4gcGFja2FnZSAoYW5kIHN1YnBhY2thZ2VzKS4gIEFwcGxpY2F0aW9ucyBzaG91bGQKLW5ldmVyIGNvbnN0cnVjdCBpbnN0YW5jZXMgb2YgPGNvZGU+U01UUFRyYW5zcG9ydDwvY29kZT4gZGlyZWN0bHkuCi1JbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgdGhlCi08Y29kZT5TZXNzaW9uPC9jb2RlPiBtZXRob2QgPGNvZGU+Z2V0VHJhbnNwb3J0PC9jb2RlPiB0byBhY3F1aXJlIGFuCi1hcHByb3ByaWF0ZSA8Y29kZT5UcmFuc3BvcnQ8L2NvZGU+IG9iamVjdC4KLTxQPgotSW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgZGVidWdnaW5nIG91dHB1dCBhcyBjb250cm9sbGVkIGJ5IHRoZQote0BsaW5rIGphdmF4Lm1haWwuU2Vzc2lvbiBTZXNzaW9ufSBjb25maWd1cmF0aW9uLAotdGhlIGNvbS5zdW4ubWFpbC5zbXRwIHByb3ZpZGVyIGxvZ3MgdGhlIHNhbWUgaW5mb3JtYXRpb24gdXNpbmcKLXtAbGluayBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXJ9IGFzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPkxvZ2dlciBOYW1lPC9USD4KLTxUSD5Mb2dnaW5nIExldmVsPC9USD4KLTxUSD5QdXJwb3NlPC9USD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwuc210cDwvVEQ+Ci08VEQ+Q09ORklHPC9URD4KLTxURD5Db25maWd1cmF0aW9uIG9mIHRoZSBTTVRQVHJhbnNwb3J0PC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwuc210cDwvVEQ+Ci08VEQ+RklORTwvVEQ+Ci08VEQ+R2VuZXJhbCBkZWJ1Z2dpbmcgb3V0cHV0PC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwuc210cC5wcm90b2NvbDwvVEQ+Ci08VEQ+RklORVNUPC9URD4KLTxURD5Db21wbGV0ZSBwcm90b2NvbCB0cmFjZTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08c3Ryb25nPldBUk5JTkc6PC9zdHJvbmc+IFRoZSBBUElzIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlCi1jb25zaWRlcmVkIDxzdHJvbmc+RVhQRVJJTUVOVEFMPC9zdHJvbmc+LiAgVGhleSBtYXkgYmUgY2hhbmdlZCBpbiB0aGUKLWZ1dHVyZSBpbiB3YXlzIHRoYXQgYXJlIGluY29tcGF0aWJsZSB3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLWN1cnJlbnQgQVBJcy4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0FTQ0lJVXRpbGl0eS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0FTQ0lJVXRpbGl0eS5qYXZhCmluZGV4IDJmYzk2OTAuLjFjMDUwYTkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9BU0NJSVV0aWxpdHkuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQVNDSUlVdGlsaXR5LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQkFTRTY0RGVjb2RlclN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0JBU0U2NERlY29kZXJTdHJlYW0uamF2YQppbmRleCA1YTlhMTYyLi44YTY1YjZlIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQkFTRTY0RGVjb2RlclN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9CQVNFNjREZWNvZGVyU3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMDUsNiArMTA1LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAc2VlICAgICAgICBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI2luCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoaW5kZXggPj0gYnVmc2l6ZSkgewogCSAgICBidWZzaXplID0gZGVjb2RlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CkBAIC0xMjksNiArMTMwLDcgQEAKICAgICAgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJLy8gZW1wdHkgb3V0IHNpbmdsZSBieXRlIHJlYWQgYnVmZmVyCiAJaW50IG9mZjAgPSBvZmY7CkBAIC0xNzAsNiArMTcyLDcgQEAKICAgICAvKioKICAgICAgKiBTa2lwcyBvdmVyIGFuZCBkaXNjYXJkcyBuIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGlzIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlsb25nIHNraXBwZWQgPSAwOwogCXdoaWxlIChuLS0gPiAwICYmIHJlYWQoKSA+PSAwKQpAQCAtMTgxLDYgKzE4NCw3IEBACiAgICAgICogVGVzdHMgaWYgdGhpcyBpbnB1dCBzdHJlYW0gc3VwcG9ydHMgbWFya3MuIEN1cnJlbnRseSB0aGlzIGNsYXNzCiAgICAgICogZG9lcyBub3Qgc3VwcG9ydCBtYXJrcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CiAJcmV0dXJuIGZhbHNlOyAvLyBNYXliZSBsYXRlciAuLgogICAgIH0KQEAgLTE5MSw2ICsxOTUsNyBAQAogICAgICAqIGEgY2xvc2UgYXBwcm94aW1hdGlvbiBpbiBjYXNlIHRoZSBvcmlnaW5hbCBlbmNvZGVkIHN0cmVhbQogICAgICAqIGNvbnRhaW5zIGVtYmVkZGVkIENSTEZzOyBzaW5jZSB0aGUgQ1JMRnMgYXJlIGRpc2NhcmRlZCwgbm90IGRlY29kZWQKICAgICAgKi8gCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAvLyBUaGlzIGlzIG9ubHkgYW4gZXN0aW1hdGUsIHNpbmNlIGluLmF2YWlsYWJsZSgpCiAJIC8vIG1pZ2h0IGluY2x1ZGUgQ1JMRnMgdG9vIC4uCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQkFTRTY0RW5jb2RlclN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0JBU0U2NEVuY29kZXJTdHJlYW0uamF2YQppbmRleCAwMDgzNGI2Li5mMTc4NjJlIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQkFTRTY0RW5jb2RlclN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9CQVNFNjRFbmNvZGVyU3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMTMsNiArMTEzLDcgQEAKICAgICAgKiBAcGFyYW0gICAgICBsZW4gICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCWludCBlbmQgPSBvZmYgKyBsZW47CkBAIC0xNjEsNiArMTYyLDcgQEAKICAgICAgKiBAcGFyYW0gICAgICBiICAgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl3cml0ZShiLCAwLCBiLmxlbmd0aCk7CiAgICAgfQpAQCAtMTcxLDYgKzE3Myw3IEBACiAgICAgICogQHBhcmFtICAgICAgYyAgIHRoZSA8Y29kZT5ieXRlPC9jb2RlPi4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJYnVmZmVyW2J1ZnNpemUrK10gPSAoYnl0ZSljOwogCWlmIChidWZzaXplID09IDMpIHsgLy8gRW5jb2RpbmcgdW5pdCA9IDMgYnl0ZXMKQEAgLTE4NSw2ICsxODgsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoYnVmc2l6ZSA+IDApIHsgLy8gSWYgdGhlcmUncyB1bmVuY29kZWQgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIC4uCiAJICAgIGVuY29kZSgpOyAgICAgIC8vIC4uIGVuY29kZSB0aGVtCkBAIC0xOTcsNiArMjAxLDcgQEAKICAgICAgKiBGb3JjZXMgYW55IGJ1ZmZlcmVkIG91dHB1dCBieXRlcyB0byBiZSBlbmNvZGVkIG91dCB0byB0aGUgc3RyZWFtCiAgICAgICogYW5kIGNsb3NlcyB0aGlzIG91dHB1dCBzdHJlYW0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWZsdXNoKCk7CiAJaWYgKGNvdW50ID4gMCAmJiAhbm9DUkxGKSB7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQkVuY29kZXJTdHJlYW0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9CRW5jb2RlclN0cmVhbS5qYXZhCmluZGV4IGFiYWIzYmEuLmI2YmY1NjUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9CRW5jb2RlclN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9CRW5jb2RlclN0cmVhbS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0NSTEZPdXRwdXRTdHJlYW0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9DUkxGT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZjY4NWIxOC4uNGFmMzQ1OSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0NSTEZPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvQ1JMRk91dHB1dFN0cmVhbS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNTgsNiArNTgsNyBAQAogCXN1cGVyKG9zKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoYiA9PSAnXHInKSB7CiAJICAgIHdyaXRlbG4oKTsKQEAgLTcxLDEwICs3MiwxMiBAQAogCWxhc3RiID0gYjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl3cml0ZShiLCAwLCBiLmxlbmd0aCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaW50IHN0YXJ0ID0gb2ZmOwogCQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0RlY29kaW5nRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvRGVjb2RpbmdFeGNlcHRpb24uamF2YQppbmRleCBhNDJkOTYwLi4zMmJiYzQyIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvRGVjb2RpbmdFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvRGVjb2RpbmdFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9Gb2xkZXJDbG9zZWRJT0V4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0ZvbGRlckNsb3NlZElPRXhjZXB0aW9uLmphdmEKaW5kZXggOTQ1Zjc0ZC4uZTYxYTY5NCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0ZvbGRlckNsb3NlZElPRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0ZvbGRlckNsb3NlZElPRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTGluZUlucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTGluZUlucHV0U3RyZWFtLmphdmEKaW5kZXggMWRlYzFmMy4uN2NlYzk0ZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0xpbmVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9MaW5lSW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQxLDYgKzQxLDcgQEAKIHBhY2thZ2UgY29tLnN1bi5tYWlsLnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdG8gc3VwcG9ydCByZWFkaW5nIENSTEYgdGVybWluYXRlZCBsaW5lcyB0aGF0CkBAIC01MywxNSArNTQsMjcgQEAKICAqIHRoaXMgY2xhc3MgYXJvdW5kIGFueSBpbnB1dCBzdHJlYW0gYW5kIHJlYWQgYnl0ZXMgZnJvbSB0aGlzIGZpbHRlci4KICAqIAogICogQGF1dGhvciBKb2huIE1hbmkKKyAqIEBhdXRob3IgQmlsbCBTaGFubm9uCiAgKi8KIAogcHVibGljIGNsYXNzIExpbmVJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKIAotICAgIHByaXZhdGUgY2hhcltdIGxpbmVCdWZmZXIgPSBudWxsOyAvLyByZXVzYWJsZSBieXRlIGJ1ZmZlcgorICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd3V0Zjg7CisgICAgcHJpdmF0ZSBieXRlW10gbGluZUJ1ZmZlciA9IG51bGw7IC8vIHJldXNhYmxlIGJ5dGUgYnVmZmVyCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9JTkNSID0gMTAyNCoxMDI0OwkvLyAxTUIKIAogICAgIHB1YmxpYyBMaW5lSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKwl0aGlzKGluLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtCWluCXRoZSBJbnB1dFN0cmVhbQorICAgICAqIEBwYXJhbQlhbGxvd3V0ZjgJYWxsb3cgVVRGLTggY2hhcmFjdGVycz8KKyAgICAgKiBAc2luY2UJSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIExpbmVJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBhbGxvd3V0ZjgpIHsKIAlzdXBlcihpbik7CisJdGhpcy5hbGxvd3V0ZjggPSBhbGxvd3V0Zjg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OCwxMiArOTEsMTMgQEAKICAgICAgKiBAcmV0dXJuCQl0aGUgbGluZQogICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQkvLyBmb3Igb2xkIFN0cmluZyBjb25zdHJ1Y3RvcgogICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCS8vSW5wdXRTdHJlYW0gaW4gPSB0aGlzLmluOwotCWNoYXJbXSBidWYgPSBsaW5lQnVmZmVyOworCWJ5dGVbXSBidWYgPSBsaW5lQnVmZmVyOwogCiAJaWYgKGJ1ZiA9PSBudWxsKQotCSAgICBidWYgPSBsaW5lQnVmZmVyID0gbmV3IGNoYXJbMTI4XTsKKwkgICAgYnVmID0gbGluZUJ1ZmZlciA9IG5ldyBieXRlWzEyOF07CiAKIAlpbnQgYzE7CiAJaW50IHJvb20gPSBidWYubGVuZ3RoOwpAQCAtMTMyLDE5ICsxNDYsMjIgQEAKIAkgICAgLy8gLi4gSW5zZXJ0IHRoZSBieXRlIGludG8gb3VyIGJ5dGUgYnVmZmVyCiAJICAgIGlmICgtLXJvb20gPCAwKSB7IC8vIE5vIHJvb20sIG5lZWQgdG8gZ3Jvdy4KIAkJaWYgKGJ1Zi5sZW5ndGggPCBNQVhfSU5DUikKLQkJICAgIGJ1ZiA9IG5ldyBjaGFyW2J1Zi5sZW5ndGggKiAyXTsKKwkJICAgIGJ1ZiA9IG5ldyBieXRlW2J1Zi5sZW5ndGggKiAyXTsKIAkJZWxzZQotCQkgICAgYnVmID0gbmV3IGNoYXJbYnVmLmxlbmd0aCArIE1BWF9JTkNSXTsKKwkJICAgIGJ1ZiA9IG5ldyBieXRlW2J1Zi5sZW5ndGggKyBNQVhfSU5DUl07CiAJCXJvb20gPSBidWYubGVuZ3RoIC0gb2Zmc2V0IC0gMTsKIAkJU3lzdGVtLmFycmF5Y29weShsaW5lQnVmZmVyLCAwLCBidWYsIDAsIG9mZnNldCk7CiAJCWxpbmVCdWZmZXIgPSBidWY7CiAJICAgIH0KLQkgICAgYnVmW29mZnNldCsrXSA9IChjaGFyKWMxOworCSAgICBidWZbb2Zmc2V0KytdID0gKGJ5dGUpYzE7CiAJfQogCiAJaWYgKChjMSA9PSAtMSkgJiYgKG9mZnNldCA9PSAwKSkKIAkgICAgcmV0dXJuIG51bGw7Ci0JCi0JcmV0dXJuIFN0cmluZy5jb3B5VmFsdWVPZihidWYsIDAsIG9mZnNldCk7CisKKwlpZiAoYWxsb3d1dGY4KQorCSAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIG9mZnNldCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJZWxzZQorCSAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIDAsIG9mZnNldCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0xpbmVPdXRwdXRTdHJlYW0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9MaW5lT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNjU4NmY2OC4uMmUxNDc5MiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0xpbmVPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTGluZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDEsNiArNDEsNyBAQAogcGFja2FnZSBjb20uc3VuLm1haWwudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0byBzdXBwb3J0IHdyaXRpbmcgb3V0IFN0cmluZ3MgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcwpAQCAtNTEsOSArNTIsMTIgQEAKICAqIHN0cmVhbS4gPHA+CiAgKgogICogQGF1dGhvciBKb2huIE1hbmkKKyAqIEBhdXRob3IgQmlsbCBTaGFubm9uCiAgKi8KIAogcHVibGljIGNsYXNzIExpbmVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0geworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd3V0Zjg7CisKICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gbmV3bGluZTsKIAogICAgIHN0YXRpYyB7CkBAIC02MywxMSArNjcsMjUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgTGluZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CisJdGhpcyhvdXQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0Jb3V0CXRoZSBPdXRwdXRTdHJlYW0KKyAgICAgKiBAcGFyYW0JYWxsb3d1dGY4CWFsbG93IFVURi04IGNoYXJhY3RlcnM/CisgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNgorICAgICAqLworICAgIHB1YmxpYyBMaW5lT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gYWxsb3d1dGY4KSB7CiAJc3VwZXIob3V0KTsKKwl0aGlzLmFsbG93dXRmOCA9IGFsbG93dXRmODsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZWxuKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJ5dGVbXSBieXRlcyA9IEFTQ0lJVXRpbGl0eS5nZXRCeXRlcyhzKTsKKwlieXRlW10gYnl0ZXM7CisJaWYgKGFsbG93dXRmOCkKKwkgICAgYnl0ZXMgPSBzLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCWVsc2UKKwkgICAgYnl0ZXMgPSBBU0NJSVV0aWxpdHkuZ2V0Qnl0ZXMocyk7CiAJb3V0LndyaXRlKGJ5dGVzKTsKIAlvdXQud3JpdGUobmV3bGluZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0xvZ091dHB1dFN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL0xvZ091dHB1dFN0cmVhbS5qYXZhCmluZGV4IGI5MWUwNjEuLjdjNTg0ODQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9Mb2dPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTG9nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02NSw2ICs2NSw3IEBACiAJdGhpcy5sZXZlbCA9IExldmVsLkZJTkVTVDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoIWxvZ2dlci5pc0xvZ2dhYmxlKGxldmVsKSkKIAkgICAgcmV0dXJuOwpAQCAtODEsMTAgKzgyLDEyIEBACiAJbGFzdGIgPSBiOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXdyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgc3RhcnQgPSBvZmY7CiAJCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTWFpbENvbm5lY3RFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsQ29ubmVjdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDRiODMyOTMuLjFjNWM5NmEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsQ29ubmVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsQ29ubmVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01haWxMb2dnZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsTG9nZ2VyLmphdmEKaW5kZXggYjY4ZDA3Zi4uZjdkOWZhYiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01haWxMb2dnZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTWFpbExvZ2dlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgICAgICogQHBhcmFtCXByZWZpeAl0aGUgcHJlZml4IGZvciBkZWJ1ZyBvdXRwdXQsIG9yIG51bGwgZm9yIG5vbmUKICAgICAgKiBAcGFyYW0Jc2Vzc2lvbgl3aGVyZSB0byBnZXQgdGhlIGRlYnVnIGZsYWcgYW5kIFByaW50U3RyZWFtCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgTWFpbExvZ2dlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgU2Vzc2lvbiBzZXNzaW9uKSB7CiAJdGhpcyhuYW1lLCBwcmVmaXgsIHNlc3Npb24uZ2V0RGVidWcoKSwgc2Vzc2lvbi5nZXREZWJ1Z091dCgpKTsKICAgICB9CkBAIC0xNjEsNiArMTYyLDcgQEAKICAgICAgKiBAcGFyYW0JcHJlZml4CXRoZSBwcmVmaXggZm9yIGRlYnVnIG91dHB1dCwgb3IgbnVsbCBmb3Igbm9uZQogICAgICAqIEBwYXJhbQlzZXNzaW9uCXdoZXJlIHRvIGdldCB0aGUgZGVidWcgZmxhZyBhbmQgUHJpbnRTdHJlYW0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBNYWlsTG9nZ2VyKENsYXNzPD8+IGNsYXp6LCBTdHJpbmcgcHJlZml4LCBTZXNzaW9uIHNlc3Npb24pIHsKIAl0aGlzKGNsYXp6LCBwcmVmaXgsIHNlc3Npb24uZ2V0RGVidWcoKSwgc2Vzc2lvbi5nZXREZWJ1Z091dCgpKTsKICAgICB9CkBAIC0yNjMsNyArMjY1LDcgQEAKICAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2coTGV2ZWwgbGV2ZWwsIFN0cmluZyBtc2csIE9iamVjdCBwYXJhbXNbXSkgeworICAgIHB1YmxpYyB2b2lkIGxvZyhMZXZlbCBsZXZlbCwgU3RyaW5nIG1zZywgT2JqZWN0Li4uIHBhcmFtcykgewogCWlmIChkZWJ1ZykgewogCSAgICBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIHBhcmFtcyk7CiAJICAgIGRlYnVnT3V0KG1zZyk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTWFpbFNTTFNvY2tldEZhY3RvcnkuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsU1NMU29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IDQ2OTFkYTguLmRmYjIwODEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsU1NMU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NYWlsU1NMU29ja2V0RmFjdG9yeS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMzUwLDYgKzM1MCw3IEBACiAJICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIjY2hlY2tDbGllbnRUcnVzdGVkKAogCSAqCQlqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10sIGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNlcnRzLCBTdHJpbmcgYXV0aFR5cGUpCiAJCQkJCXRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CiAJICAgIGlmICghKGlzVHJ1c3RBbGxIb3N0cygpIHx8IGdldFRydXN0ZWRIb3N0cygpICE9IG51bGwpKQpAQCAtMzYwLDYgKzM2MSw3IEBACiAJICogQHNlZSBqYXZheC5uZXQuc3NsLlg1MDlUcnVzdE1hbmFnZXIjY2hlY2tTZXJ2ZXJUcnVzdGVkKAogCSAqCQlqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlW10sIGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNlcnRzLCBTdHJpbmcgYXV0aFR5cGUpCiAJCQkJCXRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CiAKQEAgLTM3MCw2ICszNzIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlciNnZXRBY2NlcHRlZElzc3VlcnMoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBYNTA5Q2VydGlmaWNhdGVbXSBnZXRBY2NlcHRlZElzc3VlcnMoKSB7CiAJICAgIHJldHVybiBhZGFwdGVlVHJ1c3RNYW5hZ2VyLmdldEFjY2VwdGVkSXNzdWVycygpOwogCX0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NZXNzYWdlUmVtb3ZlZElPRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvTWVzc2FnZVJlbW92ZWRJT0V4Y2VwdGlvbi5qYXZhCmluZGV4IGM0ZTY1MTkuLmE0ZTllODEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NZXNzYWdlUmVtb3ZlZElPRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01lc3NhZ2VSZW1vdmVkSU9FeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9NaW1lVXRpbC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01pbWVVdGlsLmphdmEKaW5kZXggY2E0NWRiMS4uM2YwZDJkMiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01pbWVVdGlsLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL01pbWVVdGlsLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMTUsNiArMTE1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7CiAJcmV0dXJuCiAJQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+KCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKIAkJQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1Byb3BVdGlsLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUHJvcFV0aWwuamF2YQppbmRleCBkOTJkNDA1Li44N2NlODVhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUHJvcFV0aWwuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUHJvcFV0aWwuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTg4LDYgKzg4LDcgQEAKICAgICAgKiBAcGFyYW0JZGVmCWRlZmF1bHQgdmFsdWUgaWYgcHJvcGVydHkgbm90IGZvdW5kCiAgICAgICogQHJldHVybgkJdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbnRTZXNzaW9uUHJvcGVydHkoU2Vzc2lvbiBzZXNzaW9uLAogCQkJCVN0cmluZyBuYW1lLCBpbnQgZGVmKSB7CiAJcmV0dXJuIGdldEludChnZXRQcm9wKHNlc3Npb24uZ2V0UHJvcGVydGllcygpLCBuYW1lKSwgZGVmKTsKQEAgLTEwMSw2ICsxMDIsNyBAQAogICAgICAqIEBwYXJhbQlkZWYJZGVmYXVsdCB2YWx1ZSBpZiBwcm9wZXJ0eSBub3QgZm91bmQKICAgICAgKiBAcmV0dXJuCQl0aGUgcHJvcGVydHkgdmFsdWUKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KFNlc3Npb24gc2Vzc2lvbiwKIAkJCQlTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHsKIAlyZXR1cm4gZ2V0Qm9vbGVhbihnZXRQcm9wKHNlc3Npb24uZ2V0UHJvcGVydGllcygpLCBuYW1lKSwgZGVmKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9RRGVjb2RlclN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FEZWNvZGVyU3RyZWFtLmphdmEKaW5kZXggYTA2NTRkOS4uNmVhOGEwZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FEZWNvZGVyU3RyZWFtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FEZWNvZGVyU3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03MSw2ICs3MSw3IEBACiAgICAgICogICAgICAgICAgICAgc3RyZWFtIGlzIHJlYWNoZWQuCiAgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgYyA9IGluLnJlYWQoKTsKIApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FFbmNvZGVyU3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUUVuY29kZXJTdHJlYW0uamF2YQppbmRleCBiMTE4ZjdlLi5jYjlkMzFkIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUUVuY29kZXJTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUUVuY29kZXJTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc3LDYgKzc3LDcgQEAKICAgICAgKiBAcGFyYW0gICAgICBjICAgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+LgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWMgPSBjICYgMHhmZjsgLy8gVHVybiBvZmYgdGhlIE1TQi4KIAlpZiAoYyA9PSAnICcpCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUVBEZWNvZGVyU3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUVBEZWNvZGVyU3RyZWFtLmphdmEKaW5kZXggODc2MGNkNi4uMjBjZDE0MCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FQRGVjb2RlclN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9RUERlY29kZXJTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc2LDYgKzc2LDcgQEAKICAgICAgKiAgICAgICAgICAgICBzdHJlYW0gaXMgcmVhY2hlZC4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmIChzcGFjZXMgPiAwKSB7CiAJICAgIC8vIFdlIGhhdmUgY2FjaGVkIHNwYWNlIGNoYXJhY3RlcnMsIHJldHVybiBvbmUKQEAgLTE1OSw2ICsxNjAsNyBAQAogICAgICAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgaSwgYzsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTE3NSw2ICsxNzcsNyBAQAogICAgIC8qKgogICAgICAqIFNraXBzIG92ZXIgYW5kIGRpc2NhcmRzIG4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoaXMgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWxvbmcgc2tpcHBlZCA9IDA7CiAJd2hpbGUgKG4tLSA+IDAgJiYgcmVhZCgpID49IDApCkBAIC0xODYsNiArMTg5LDcgQEAKICAgICAgKiBUZXN0cyBpZiB0aGlzIGlucHV0IHN0cmVhbSBzdXBwb3J0cyBtYXJrcy4gQ3VycmVudGx5IHRoaXMgY2xhc3MKICAgICAgKiBkb2VzIG5vdCBzdXBwb3J0IG1hcmtzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTk3LDYgKzIwMSw3IEBACiAgICAgICogdGhpcyBtZXRob2QganVzdCBpbnZva2VzIHRoZSA8Y29kZT5hdmFpbGFibGU8L2NvZGU+IG1ldGhvZAogICAgICAqIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCS8vIFRoaXMgaXMgYm9ndXMgISBXZSBkb24ndCByZWFsbHkga25vdyBob3cgbXVjaAogCS8vIGJ5dGVzIGFyZSBhdmFpbGFibGUgKmFmdGVyKiBkZWNvZGluZwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FQRW5jb2RlclN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1FQRW5jb2RlclN0cmVhbS5qYXZhCmluZGV4IDdjNjI2MDYuLmI1MTg2NTggMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9RUEVuY29kZXJTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUVBFbmNvZGVyU3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC05MCw2ICs5MCw3IEBACiAgICAgICogQHBhcmFtICAgICAgbGVuICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQogCSAgICB3cml0ZShiW29mZiArIGldKTsKQEAgLTEwMCw2ICsxMDEsNyBAQAogICAgICAqIEBwYXJhbSAgICAgIGIgICB0aGUgZGF0YSB0byBiZSB3cml0dGVuLgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXdyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICB9CkBAIC0xMDksNiArMTExLDcgQEAKICAgICAgKiBAcGFyYW0gICAgICBjICAgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+LgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWMgPSBjICYgMHhmZjsgLy8gVHVybiBvZmYgdGhlIE1TQi4KIAlpZiAoZ290U3BhY2UpIHsgLy8gcHJldmlvdXMgY2hhcmFjdGVyIHdhcyA8U1BBQ0U+CkBAIC0xNDgsNiArMTUxLDcgQEAKICAgICAgKiB0byBiZSBlbmNvZGVkIG91dCB0byB0aGUgc3RyZWFtLgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoZ290U3BhY2UpIHsKIAkgICAgb3V0cHV0KCcgJywgdHJ1ZSk7CkBAIC0xNjIsNiArMTY2LDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJZmx1c2goKTsKIAlvdXQuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9SZWFkYWJsZU1pbWUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9SZWFkYWJsZU1pbWUuamF2YQppbmRleCAyYjA5Nzg3Li5kOGE0YzA2IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvUmVhZGFibGVNaW1lLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1JlYWRhYmxlTWltZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NoYXJlZEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NoYXJlZEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDUyMWIxMjYuLjRiYjlmZDMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9TaGFyZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvU2hhcmVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NvY2tldENvbm5lY3RFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9Tb2NrZXRDb25uZWN0RXhjZXB0aW9uLmphdmEKaW5kZXggNzU0MGNhNC4uYTU1YzFlZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NvY2tldENvbm5lY3RFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvU29ja2V0Q29ubmVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NvY2tldEZldGNoZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9Tb2NrZXRGZXRjaGVyLmphdmEKaW5kZXggNDE5NThhMS4uMTY5M2NjNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1NvY2tldEZldGNoZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvU29ja2V0RmV0Y2hlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDQsNiArNDQsNyBAQAogaW1wb3J0IGphdmEubmV0Lio7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7CkBAIC01MSw3ICs1Miw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Lio7CiBpbXBvcnQgamF2YXgubmV0Lio7CiBpbXBvcnQgamF2YXgubmV0LnNzbC4qOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZXQgU29ja2V0cy4gRGVwZW5kaW5nIG9uIHRoZSBhcmd1bWVudHMgcGFzc2VkCkBAIC0yNzQsMTkgKzI3NCw0NCBAQAogCQkiLCBob3N0ICIgKyBob3N0ICsgIiwgcG9ydCAiICsgcG9ydCArCiAJCSIsIGNvbm5lY3Rpb24gdGltZW91dCAiICsgY3RvICsgIiwgdGltZW91dCAiICsgdG8gKwogCQkiLCBzb2NrZXQgZmFjdG9yeSAiICsgc2YgKyAiLCB1c2VTU0wgIiArIHVzZVNTTCk7Ci0JCQotCVN0cmluZyBzb2Nrc0hvc3QgPSBwcm9wcy5nZXRQcm9wZXJ0eShwcmVmaXggKyAiLnNvY2tzLmhvc3QiLCBudWxsKTsKKworCVN0cmluZyBwcm94eUhvc3QgPSBwcm9wcy5nZXRQcm9wZXJ0eShwcmVmaXggKyAiLnByb3h5Lmhvc3QiLCBudWxsKTsKKwlTdHJpbmcgcHJveHlVc2VyID0gcHJvcHMuZ2V0UHJvcGVydHkocHJlZml4ICsgIi5wcm94eS51c2VyIiwgbnVsbCk7CisJU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBwcm9wcy5nZXRQcm9wZXJ0eShwcmVmaXggKyAiLnByb3h5LnBhc3N3b3JkIiwgbnVsbCk7CisJaW50IHByb3h5UG9ydCA9IDgwOworCVN0cmluZyBzb2Nrc0hvc3QgPSBudWxsOwogCWludCBzb2Nrc1BvcnQgPSAxMDgwOwogCVN0cmluZyBlcnIgPSBudWxsOwotCWlmIChzb2Nrc0hvc3QgIT0gbnVsbCkgeworCisJaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7CisJICAgIGludCBpID0gcHJveHlIb3N0LmluZGV4T2YoJzonKTsKKwkgICAgaWYgKGkgPj0gMCkgeworCQl0cnkgeworCQkgICAgcHJveHlQb3J0ID0gSW50ZWdlci5wYXJzZUludChwcm94eUhvc3Quc3Vic3RyaW5nKGkgKyAxKSk7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworCQkgICAgLy8gaWdub3JlIGl0CisJCX0KKwkJcHJveHlIb3N0ID0gcHJveHlIb3N0LnN1YnN0cmluZygwLCBpKTsKKwkgICAgfQorCSAgICBwcm94eVBvcnQgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKKwkJCQkJcHJlZml4ICsgIi5wcm94eS5wb3J0IiwgcHJveHlQb3J0KTsKKwkgICAgZXJyID0gIlVzaW5nIHdlYiBwcm94eSBob3N0LCBwb3J0OiAiICsgcHJveHlIb3N0ICsgIiwgIiArIHByb3h5UG9ydDsKKwkgICAgaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworCQlsb2dnZXIuZmluZXIoIndlYiBwcm94eSBob3N0ICIgKyBwcm94eUhvc3QgKyAiLCBwb3J0ICIgKyBwcm94eVBvcnQpOworCQlpZiAocHJveHlVc2VyICE9IG51bGwpCisJCSAgICBsb2dnZXIuZmluZXIoIndlYiBwcm94eSB1c2VyICIgKyBwcm94eVVzZXIgKyAiLCBwYXNzd29yZCAiICsKKwkJCShwcm94eVBhc3N3b3JkID09IG51bGwgPyAiPG51bGw+IiA6ICI8bm9uLW51bGw+IikpOworCSAgICB9CisJfSBlbHNlIGlmICgoc29ja3NIb3N0ID0KKwkJICAgIHByb3BzLmdldFByb3BlcnR5KHByZWZpeCArICIuc29ja3MuaG9zdCIsIG51bGwpKSAhPSBudWxsKSB7CiAJICAgIGludCBpID0gc29ja3NIb3N0LmluZGV4T2YoJzonKTsKIAkgICAgaWYgKGkgPj0gMCkgewotCQlzb2Nrc0hvc3QgPSBzb2Nrc0hvc3Quc3Vic3RyaW5nKDAsIGkpOwogCQl0cnkgewogCQkgICAgc29ja3NQb3J0ID0gSW50ZWdlci5wYXJzZUludChzb2Nrc0hvc3Quc3Vic3RyaW5nKGkgKyAxKSk7CiAJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewogCQkgICAgLy8gaWdub3JlIGl0CiAJCX0KKwkJc29ja3NIb3N0ID0gc29ja3NIb3N0LnN1YnN0cmluZygwLCBpKTsKIAkgICAgfQogCSAgICBzb2Nrc1BvcnQgPSBQcm9wVXRpbC5nZXRJbnRQcm9wZXJ0eShwcm9wcywKIAkJCQkJcHJlZml4ICsgIi5zb2Nrcy5wb3J0Iiwgc29ja3NQb3J0KTsKQEAgLTMyNSw3ICszNTAsMTAgQEAKIAkgICAgc29ja2V0LmJpbmQobmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsYWRkciwgbG9jYWxwb3J0KSk7CiAJdHJ5IHsKIAkgICAgbG9nZ2VyLmZpbmVzdCgiY29ubmVjdGluZy4uLiIpOwotCSAgICBpZiAoY3RvID49IDApCisJICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkKKwkJcHJveHlDb25uZWN0KHNvY2tldCwgcHJveHlIb3N0LCBwcm94eVBvcnQsCisJCQkJcHJveHlVc2VyLCBwcm94eVBhc3N3b3JkLCBob3N0LCBwb3J0LCBjdG8pOworCSAgICBlbHNlIGlmIChjdG8gPj0gMCkKIAkJc29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpLCBjdG8pOwogCSAgICBlbHNlCiAJCXNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KSk7CkBAIC0zODUsNyArNDEzLDcgQEAKIAlpZiAoc2ZDbGFzcyA9PSBudWxsIHx8IHNmQ2xhc3MubGVuZ3RoKCkgPT0gMCkKIAkgICAgcmV0dXJuIG51bGw7CiAKLQkvLyBkeW5hbWljYWxseSBsb2FkIHRoZSBjbGFzcyAKKwkvLyBkeW5hbWljYWxseSBsb2FkIHRoZSBjbGFzcwogCiAJQ2xhc3NMb2FkZXIgY2wgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKIAlDbGFzczw/PiBjbHNTb2NrRmFjdCA9IG51bGw7CkBAIC0zOTcsNyArNDI1LDcgQEAKIAlpZiAoY2xzU29ja0ZhY3QgPT0gbnVsbCkKIAkgICAgY2xzU29ja0ZhY3QgPSBDbGFzcy5mb3JOYW1lKHNmQ2xhc3MpOwogCS8vIGdldCAmIGludm9rZSB0aGUgZ2V0RGVmYXVsdCgpIG1ldGhvZAotCU1ldGhvZCBtdGhHZXREZWZhdWx0ID0gY2xzU29ja0ZhY3QuZ2V0TWV0aG9kKCJnZXREZWZhdWx0IiwgCisJTWV0aG9kIG10aEdldERlZmF1bHQgPSBjbHNTb2NrRmFjdC5nZXRNZXRob2QoImdldERlZmF1bHQiLAogCQkJCQkJICAgICBuZXcgQ2xhc3M8Pz5bXXt9KTsKIAlTb2NrZXRGYWN0b3J5IHNmID0gKFNvY2tldEZhY3RvcnkpCiAJICAgIG10aEdldERlZmF1bHQuaW52b2tlKG5ldyBPYmplY3QoKSwgbmV3IE9iamVjdFtde30pOwpAQCAtNTcyLDcgKzYwMCw3IEBACiAJICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpCiAJCWxvZ2dlci5maW5lcigiU1NMIGVuYWJsZWQgcHJvdG9jb2xzIGJlZm9yZSAiICsKIAkJICAgIEFycmF5cy5hc0xpc3QocHJvdHMpKTsKLQkgICAgTGlzdDxTdHJpbmc+IGVwcm90cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCSAgICBMaXN0PFN0cmluZz4gZXByb3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdHMubGVuZ3RoOyBpKyspIHsKIAkJaWYgKHByb3RzW2ldICE9IG51bGwgJiYgIXByb3RzW2ldLnN0YXJ0c1dpdGgoIlNTTCIpKQogCQkgICAgZXByb3RzLmFkZChwcm90c1tpXSk7CkBAIC02MDcsMTkgKzYzNSw0MCBAQAogCWlmIChzZiBpbnN0YW5jZW9mIE1haWxTU0xTb2NrZXRGYWN0b3J5KSB7CiAJICAgIE1haWxTU0xTb2NrZXRGYWN0b3J5IG1zZiA9IChNYWlsU1NMU29ja2V0RmFjdG9yeSlzZjsKIAkgICAgaWYgKCFtc2YuaXNTZXJ2ZXJUcnVzdGVkKGhvc3QsIHNzbHNvY2tldCkpIHsKLQkJdHJ5IHsKLQkJICAgIHNzbHNvY2tldC5jbG9zZSgpOwotCQl9IGZpbmFsbHkgewotCQkgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTZXJ2ZXIgaXMgbm90IHRydXN0ZWQ6ICIgKyBob3N0KTsKLQkJfQorCQl0aHJvdyBjbGVhbnVwQW5kVGhyb3coc3Nsc29ja2V0LAorCQkJbmV3IElPRXhjZXB0aW9uKCJTZXJ2ZXIgaXMgbm90IHRydXN0ZWQ6ICIgKyBob3N0KSk7CiAJICAgIH0KIAl9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgSU9FeGNlcHRpb24gY2xlYW51cEFuZFRocm93KFNvY2tldCBzb2NrZXQsIElPRXhjZXB0aW9uIGlmZSkgeworCXRyeSB7CisJICAgIHNvY2tldC5jbG9zZSgpOworCX0gY2F0Y2ggKFRocm93YWJsZSB0aHIpIHsKKwkgICAgaWYgKGlzUmVjb3ZlcmFibGUodGhyKSkgeworCQlpZmUuYWRkU3VwcHJlc3NlZCh0aHIpOworCSAgICB9IGVsc2UgeworCQl0aHIuYWRkU3VwcHJlc3NlZChpZmUpOworCQlpZiAodGhyIGluc3RhbmNlb2YgRXJyb3IpIHsKKwkJICAgIHRocm93IChFcnJvcikgdGhyOworCQl9CisJCWlmICh0aHIgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisJCSAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgdGhyOworCQl9CisJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIHRocik7CisJICAgIH0KKwl9CisJcmV0dXJuIGlmZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVjb3ZlcmFibGUoVGhyb3dhYmxlIHQpIHsKKwlyZXR1cm4gKHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHx8ICh0IGluc3RhbmNlb2YgTGlua2FnZUVycm9yKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgc2VydmVyIGZyb20gdGhlIFNvY2tldCBjb25uZWN0aW9uIGFnYWluc3QgdGhlIHNlcnZlciBuYW1lKHMpCiAgICAgICogYXMgZXhwcmVzc2VkIGluIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgKFJGQyAyNTk1IGNoZWNrKS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbQlzZXJ2ZXIJCW5hbWUgb2YgdGhlIHNlcnZlciBleHBlY3RlZAogICAgICAqIEBwYXJhbSAgIHNzbFNvY2tldAlTU0xTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXIKICAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCWlmIHdlIGNhbid0IHZlcmlmeSBpZGVudGl0eSBvZiBzZXJ2ZXIKQEAgLTY1MCw3ICs2OTksNyBAQAogCiAgICAgLyoqCiAgICAgICogRG8gYW55IG9mIHRoZSBuYW1lcyBpbiB0aGUgY2VydCBtYXRjaCB0aGUgc2VydmVyIG5hbWU/Ci0gICAgICogIAorICAgICAqCiAgICAgICogQHBhcmFtCXNlcnZlcgluYW1lIG9mIHRoZSBzZXJ2ZXIgZXhwZWN0ZWQKICAgICAgKiBAcGFyYW0gICBjZXJ0CVg1MDlDZXJ0aWZpY2F0ZSB0byBnZXQgdGhlIHN1YmplY3QncyBuYW1lIGZyb20KICAgICAgKiBAcmV0dXJuICB0cnVlIGlmIGl0IG1hdGNoZXMKQEAgLTY3MSw3ICs3MjAsNyBAQAogCSAgICAvLyBpbnZva2UgSG9zdG5hbWVDaGVja2VyLmdldEluc3RhbmNlKEhvc3RuYW1lQ2hlY2tlci5UWVBFX0xEQVApCiAJICAgIC8vIEhvc3RuYW1lQ2hlY2tlci5UWVBFX0xEQVAgPT0gMgogCSAgICAvLyBMREFQIHJlcXVpcmVzIHRoZSBzYW1lIHJlZ2V4IGhhbmRsaW5nIGFzIHdlIG5lZWQKLQkgICAgTWV0aG9kIGdldEluc3RhbmNlID0gaG5jLmdldE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCAKKwkgICAgTWV0aG9kIGdldEluc3RhbmNlID0gaG5jLmdldE1ldGhvZCgiZ2V0SW5zdGFuY2UiLAogCQkJCQluZXcgQ2xhc3M8Pz5bXSB7IGJ5dGUuY2xhc3MgfSk7CiAJICAgIE9iamVjdCBob3N0bmFtZUNoZWNrZXIgPSBnZXRJbnN0YW5jZS5pbnZva2UobmV3IE9iamVjdCgpLAogCQkJCQluZXcgT2JqZWN0W10geyBCeXRlLnZhbHVlT2YoKGJ5dGUpMikgfSk7CkBAIC03NjEsMTIgKzgxMCw4OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFVzZSB0aGUgSFRUUCBDT05ORUNUIHByb3RvY29sIHRvIGNvbm5lY3QgdG8gYQorICAgICAqIHNpdGUgdGhyb3VnaCBhbiBIVFRQIHByb3h5IHNlcnZlci4gPHA+CisgICAgICoKKyAgICAgKiBQcm90b2NvbCBpcyByb3VnaGx5OgorICAgICAqIDxwcmU+CisgICAgICogQ09OTkVDVCA8aG9zdD46PHBvcnQ+IEhUVFAvMS4xCisgICAgICogSG9zdDogPGhvc3Q+Ojxwb3J0PgorICAgICAqIDxibGFuayBsaW5lPgorICAgICAqCisgICAgICogSFRUUC8xLjEgMjAwIENvbm5lY3QgZXN0YWJsaXNoZWQKKyAgICAgKiA8aGVhZGVycz4KKyAgICAgKiA8YmxhbmsgbGluZT4KKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb3h5Q29ubmVjdChTb2NrZXQgc29ja2V0LAorCQkJCVN0cmluZyBwcm94eUhvc3QsIGludCBwcm94eVBvcnQsCisJCQkJU3RyaW5nIHByb3h5VXNlciwgU3RyaW5nIHByb3h5UGFzc3dvcmQsCisJCQkJU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgY3RvKQorCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKQorCSAgICBsb2dnZXIuZmluZSgiY29ubmVjdGluZyB0aHJvdWdoIHByb3h5ICIgKworCQkJcHJveHlIb3N0ICsgIjoiICsgcHJveHlQb3J0ICsgIiB0byAiICsKKwkJCWhvc3QgKyAiOiIgKyBwb3J0KTsKKwlpZiAoY3RvID49IDApCisJICAgIHNvY2tldC5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwcm94eUhvc3QsIHByb3h5UG9ydCksIGN0byk7CisJZWxzZQorCSAgICBzb2NrZXQuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MocHJveHlIb3N0LCBwcm94eVBvcnQpKTsKKwlQcmludFN0cmVhbSBvcyA9IG5ldyBQcmludFN0cmVhbShzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGZhbHNlLAorCQkJCQkgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOC5uYW1lKCkpOworCVN0cmluZ0J1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCXJlcXVlc3RCdWlsZGVyLmFwcGVuZCgiQ09OTkVDVCAiKS5hcHBlbmQoaG9zdCkuYXBwZW5kKCI6IikuYXBwZW5kKHBvcnQpLgorCQkJYXBwZW5kKCIgSFRUUC8xLjFcclxuIik7CisJcmVxdWVzdEJ1aWxkZXIuYXBwZW5kKCJIb3N0OiAiKS5hcHBlbmQoaG9zdCkuYXBwZW5kKCI6IikuYXBwZW5kKHBvcnQpLgorCQkJYXBwZW5kKCJcclxuIik7CisJaWYgKHByb3h5VXNlciAhPSBudWxsICYmIHByb3h5UGFzc3dvcmQgIT0gbnVsbCkgeworCSAgICBieXRlW10gdXBieXRlcyA9IChwcm94eVVzZXIgKyAnOicgKyBwcm94eVBhc3N3b3JkKS4KKwkJCQlnZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwkgICAgU3RyaW5nIHByb3h5SGVhZGVyVmFsdWUgPSBuZXcgU3RyaW5nKAorCQlCQVNFNjRFbmNvZGVyU3RyZWFtLmVuY29kZSh1cGJ5dGVzKSwKKwkJU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7CisJICAgIHJlcXVlc3RCdWlsZGVyLmFwcGVuZCgiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgIikuCisJCQkJYXBwZW5kKHByb3h5SGVhZGVyVmFsdWUpLmFwcGVuZCgiXHJcbiIpOworCX0KKwlyZXF1ZXN0QnVpbGRlci5hcHBlbmQoIlByb3h5LUNvbm5lY3Rpb246IGtlZXAtYWxpdmVcclxuXHJcbiIpOworCW9zLnByaW50KHJlcXVlc3RCdWlsZGVyLnRvU3RyaW5nKCkpOworCW9zLmZsdXNoKCk7CisJQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisJCQkgICAgc29ja2V0LmdldElucHV0U3RyZWFtKCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwlTdHJpbmcgbGluZTsKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwl3aGlsZSAoKGxpbmUgPSByLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkKKwkJYnJlYWs7CisJICAgIGxvZ2dlci5maW5lc3QobGluZSk7CisJICAgIGlmIChmaXJzdCkgeworCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUpOworCQlTdHJpbmcgaHR0cCA9IHN0Lm5leHRUb2tlbigpOworCQlTdHJpbmcgY29kZSA9IHN0Lm5leHRUb2tlbigpOworCQlpZiAoIWNvZGUuZXF1YWxzKCIyMDAiKSkgeworCQkgICAgdHJ5IHsKKwkJCXNvY2tldC5jbG9zZSgpOworCQkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgeworCQkJLy8gaWdub3JlZAorCQkgICAgfQorCQkgICAgQ29ubmVjdEV4Y2VwdGlvbiBleCA9IG5ldyBDb25uZWN0RXhjZXB0aW9uKAorCQkJImNvbm5lY3Rpb24gdGhyb3VnaCBwcm94eSAiICsKKwkJCXByb3h5SG9zdCArICI6IiArIHByb3h5UG9ydCArICIgdG8gIiArCisJCQlob3N0ICsgIjoiICsgcG9ydCArICIgZmFpbGVkOiAiICsgbGluZSk7CisJCSAgICBsb2dnZXIubG9nKExldmVsLkZJTkUsICJjb25uZWN0IGZhaWxlZCIsIGV4KTsKKwkJICAgIHRocm93IGV4OworCQl9CisJCWZpcnN0ID0gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFyc2UgYSBzdHJpbmcgaW50byB3aGl0ZXNwYWNlIHNlcGFyYXRlZCB0b2tlbnMKICAgICAgKiBhbmQgcmV0dXJuIHRoZSB0b2tlbnMgaW4gYW4gYXJyYXkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3RyaW5nQXJyYXkoU3RyaW5nIHMpIHsKIAlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMpOwotCUxpc3Q8U3RyaW5nPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwlMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKIAkgICAgdG9rZW5zLmFkZChzdC5uZXh0VG9rZW4oKSk7CiAJcmV0dXJuIHRva2Vucy50b0FycmF5KG5ldyBTdHJpbmdbdG9rZW5zLnNpemUoKV0pOwpAQCAtNzgwLDYgKzkwNiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewogCXJldHVybgogCUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7CiAJCUNsYXNzTG9hZGVyIGNsID0gbnVsbDsKIAkJdHJ5IHsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9UcmFjZUlucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvVHJhY2VJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDI3YzY3NTQuLjU3NmI4MDEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9UcmFjZUlucHV0U3RyZWFtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1RyYWNlSW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTIgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwMyw2ICsxMDMsNyBAQAogICAgICAqIDxjb2RlPi0xPC9jb2RlPiBpZiBubyBkYXRhIGlzIGF2YWlsYWJsZS4gV3JpdGVzIG91dCB0aGUgcmVhZAogICAgICAqIGJ5dGUgaW50byB0aGUgdHJhY2Ugc3RyZWFtLCBpZiB0cmFjZSBtb2RlIGlzIDxjb2RlPnRydWU8L2NvZGU+CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgYiA9IGluLnJlYWQoKTsKIAlpZiAodHJhY2UgJiYgYiAhPSAtMSkgewpAQCAtMTIwLDYgKzEyMSw3IEBACiAgICAgICogaXMgYXZhaWxhYmxlLiBXcml0ZXMgb3V0IHRoZSByZWFkIGJ5dGVzIGludG8gdGhlIHRyYWNlIHN0cmVhbSwgaWYgCiAgICAgICogdHJhY2UgbW9kZSBpcyA8Y29kZT50cnVlPC9jb2RlPgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgY291bnQgPSBpbi5yZWFkKGIsIG9mZiwgbGVuKTsKIAlpZiAodHJhY2UgJiYgY291bnQgIT0gLTEpIHsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9UcmFjZU91dHB1dFN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1RyYWNlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMWMwYzNjNy4uOTU1OTVkNCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1RyYWNlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1RyYWNlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgKiBAcGFyYW0JYgl0aGUgYnl0ZSB0byB3cml0ZQogICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JZm9yIEkvTyBlcnJvcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAodHJhY2UpIHsKIAkgICAgaWYgKHF1b3RlKQpAQCAtMTI3LDYgKzEyOCw3IEBACiAgICAgICogQHBhcmFtCWxlbgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCWZvciBJL08gZXJyb3JzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJaWYgKHRyYWNlKSB7CiAJICAgIGlmIChxdW90ZSkgewpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1VVRGVjb2RlclN0cmVhbS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1VVRGVjb2RlclN0cmVhbS5qYXZhCmluZGV4IDBmMjVhYjYuLjg3MTdhZTkgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9VVURlY29kZXJTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvVVVEZWNvZGVyU3RyZWFtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEyIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMTQsNiArMTE0LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAc2VlICAgICAgICBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtI2luCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpZiAoaW5kZXggPj0gYnVmc2l6ZSkgewogCSAgICByZWFkUHJlZml4KCk7CkBAIC0xMjQsNiArMTI1LDcgQEAKIAlyZXR1cm4gYnVmZmVyW2luZGV4KytdICYgMHhmZjsgLy8gcmV0dXJuIGxvd2VyIGJ5dGUKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlpbnQgaSwgYzsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEzNywxMCArMTM5LDEyIEBACiAJcmV0dXJuIGk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAvLyBUaGlzIGlzIG9ubHkgYW4gZXN0aW1hdGUsIHNpbmNlIGluLmF2YWlsYWJsZSgpCiAJIC8vIG1pZ2h0IGluY2x1ZGUgQ1JMRnMgdG9vIC4uCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvVVVFbmNvZGVyU3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvVVVFbmNvZGVyU3RyZWFtLmphdmEKaW5kZXggMmZhYTg1Mi4uNzZlNWQwYyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1VVRW5jb2RlclN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9VVUVuY29kZXJTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwMywxNSArMTAzLDE4IEBACiAJdGhpcy5tb2RlID0gbW9kZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQogCSAgICB3cml0ZShiW29mZiArIGldKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl3cml0ZShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJLyogYnVmZmVyIHVwIGNoYXJhY3RlcnMgdGlsbCB3ZSBnZXQgYSBsaW5lJ3Mgd29ydGgsIHRoZW4gZW5jb2RlCiAJICogYW5kIHdyaXRlIHRoZW0gb3V0LiBNYXggbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBwZXIgCkBAIC0xMjUsNiArMTI4LDcgQEAKIAl9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmIChidWZzaXplID4gMCkgeyAvLyBJZiB0aGVyZSdzIHVuZW5jb2RlZCBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIKIAkgICAgd3JpdGVQcmVmaXgoKTsKQEAgLTEzNSw2ICsxMzksNyBAQAogCW91dC5mbHVzaCgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlmbHVzaCgpOwogCW91dC5jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1dyaXRlVGltZW91dFNvY2tldC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL1dyaXRlVGltZW91dFNvY2tldC5qYXZhCmluZGV4IGEyOTUzZDcuLjAxODg0ZjEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9Xcml0ZVRpbWVvdXRTb2NrZXQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvV3JpdGVUaW1lb3V0U29ja2V0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00Myw2ICs0Myw4IEBACiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmV0Lio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CiAKQEAgLTMxNCw4ICszMTYsMzQgQEAKICAgICAgICAgcmV0dXJuIHNvY2tldC5pc091dHB1dFNodXRkb3duKCk7CiAgICAgfQogCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMgd2VyZSBhZGRlZCB0byBqYXZhLm5ldC5Tb2NrZXQgaW4gSmF2YSBTRSA5LgorICAgICAqIFNpbmNlIHRoZXkncmUgbm90IHN1cHBvcnRlZCBvbiBBbmRyb2lkLCBhbmQgc2luY2Ugd2Uga25vdyB0aGF0IHdlCisgICAgICogbmV2ZXIgdXNlIHRoZW0gaW4gSmF2YU1haWwsIHdlIGp1c3Qgc3R1YiB0aGVtIG91dCBoZXJlLgorICAgICAqLworICAgIC8vQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBTb2NrZXQgc2V0T3B0aW9uKFNvY2tldE9wdGlvbjxUPiBzbywgVCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJLy8gc29ja2V0LnNldE9wdGlvbihzbywgdmFsKTsKKwkvLyByZXR1cm4gdGhpczsKKwl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIldyaXRlVGltZW91dFNvY2tldC5zZXRPcHRpb24iKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRPcHRpb24oU29ja2V0T3B0aW9uPFQ+IHNvKSB0aHJvd3MgSU9FeGNlcHRpb24geworCS8vIHJldHVybiBzb2NrZXQuZ2V0T3B0aW9uKHNvKTsKKwl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIldyaXRlVGltZW91dFNvY2tldC5nZXRPcHRpb24iKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U29ja2V0T3B0aW9uPD8+PiBzdXBwb3J0ZWRPcHRpb25zKCkgeworCS8vIHJldHVybiBzb2NrZXQuc3VwcG9ydGVkT3B0aW9ucygpOworCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEtMVURHRSBmb3IgQW5kcm9pZCwgd2hpY2ggaGFzIHRoaXMgaWxsZWdhbCBub24tSmF2YSBDb21wYXRpYmxlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JdGhlIEZpbGVEZXNjcmlwdG9yIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlRGVzY3JpcHRvciQoKSB7CiAJdHJ5IHsKQEAgLTM0Niw2ICszNzQsNyBAQAogCXRoaXMuc2VzID0gc2VzOwogCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7CiAJdGltZW91dFRhc2sgPSBuZXcgQ2FsbGFibGU8T2JqZWN0PigpIHsKKwkgICAgQE92ZXJyaWRlCiAJICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogCQlvcy5jbG9zZSgpOwkvLyBjbG9zZSB0aGUgc3RyZWFtIHRvIGFib3J0IHRoZSB3cml0ZQogCQlyZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL0NvbGxlY3RvckZvcm1hdHRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvQ29sbGVjdG9yRm9ybWF0dGVyLmphdmEKaW5kZXggYjdjOGY3NC4uZWU4NTkxYyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvQ29sbGVjdG9yRm9ybWF0dGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvQ29sbGVjdG9yRm9ybWF0dGVyLmphdmEKQEAgLTEsNjI1ICsxLDYyNSBAQAotLyoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1IEphc29uIE1laHJlbnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQotICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCi0gKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCi0gKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0gKgotICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246Ci0gKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICogZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlCi0gKiBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIE1vZGlmaWNhdGlvbnM6Ci0gKiBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcwotICogZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gKiAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotICoKLSAqIENvbnRyaWJ1dG9yKHMpOgotICogSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yCi0gKiBvbmx5IHRoZSBHUEwgVmVyc2lvbiAyLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGFkZGluZyAiW0NvbnRyaWJ1dG9yXQotICogZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gKiBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhCi0gKiByZWNpcGllbnQgaGFzIHRoZSBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi0gKiBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAqIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQotICogYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZSBvcHRpb24gYXBwbGllcwotICogb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAqIGhvbGRlci4KLSAqLwotcGFja2FnZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlclByb3BlcnRpZXMuZnJvbUxvZ01hbmFnZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7Ci0KLS8qKgotICogQSBMb2dSZWNvcmQgZm9ybWF0dGVyIHRoYXQgdGFrZXMgYSBzZXF1ZW5jZSBvZiBMb2dSZWNvcmRzIGFuZCBjb21iaW5lcyB0aGVtCi0gKiBpbnRvIGEgc2luZ2xlIHN1bW1hcnkgcmVzdWx0LiBGb3JtYXRpbmcgb2YgdGhlIGhlYWQsIExvZ1JlY29yZCwgYW5kIHRhaWwgYXJlCi0gKiBkZWxlZ2F0ZWQgdG8gdGhlIHdyYXBwZWQgZm9ybWF0dGVyLgotICoKLSAqIDxwPgotICogQnkgZGVmYXVsdCBlYWNoIDx0dD5Db2xsZWN0b3JGb3JtYXR0ZXI8L3R0PiBpcyBpbml0aWFsaXplZCB1c2luZyB0aGUKLSAqIGZvbGxvd2luZyBMb2dNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB3aGVyZQotICogPHR0PiZsdDtmb3JtYXR0ZXItbmFtZSZndDs8L3R0PiByZWZlcnMgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yCi0gKiB0aGUgZnVsbHkgcXVhbGlmaWVkIGRlcml2ZWQgY2xhc3MgbmFtZSBvZiB0aGUgZm9ybWF0dGVyLiAgSWYgcHJvcGVydGllcyBhcmUKLSAqIG5vdCBkZWZpbmVkLCBvciBjb250YWluIGludmFsaWQgdmFsdWVzLCB0aGVuIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMgYXJlCi0gKiB1c2VkLgotICogPHVsPgotICogPGxpPiZsdDtmb3JtYXR0ZXItbmFtZSZndDsuY29tcGFyYXRvciBuYW1lIG9mIGEKLSAqIHtAbGlua3BsYWluIGphdmEudXRpbC5Db21wYXJhdG9yfSBjbGFzcyB1c2VkIHRvIGNob29zZSB0aGUgY29sbGVjdGVkCi0gKiA8dHQ+TG9nUmVjb3JkPC90dD4uIElmIGEgY29tcGFyYXRvciBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgbWF4Ci0gKiA8dHQ+TG9nUmVjb3JkPC90dD4gaXMgY2hvc2VuLiBJZiBjb21wYXJhdG9yIGlzIHNldCB0byB0aGUgc3RyaW5nIGxpdGVyYWwKLSAqIG51bGwsIHRoZW4gdGhlIGxhc3QgcmVjb3JkIGlzIGNob3Nlbi4gKGRlZmF1bHRzIHRvCi0gKiB7QGxpbmtwbGFpbiBTZXZlcml0eUNvbXBhcmF0b3J9KQotICoKLSAqIDxsaT4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7LmNvbXBhcmF0b3IucmV2ZXJzZSBhIGJvb2xlYW4KLSAqIDx0dD50cnVlPC90dD4gdG8gY29sbGVjdCB0aGUgbWluIDx0dD5Mb2dSZWNvcmQ8L3R0PiBvciA8dHQ+ZmFsc2U8L3R0PiB0bwotICogY29sbGVjdCB0aGUgbWF4IDx0dD5Mb2dSZWNvcmQ8L3R0Pi4gKGRlZmF1bHRzIHRvIDx0dD5mYWxzZTwvdHQ+KQotICoKLSAqIDxsaT4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7LmZvcm1hdCB0aGUKLSAqIHtAbGlua3BsYWluIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IE1lc3NhZ2VGb3JtYXR9IHN0cmluZyB1c2VkIHRvIGZvcm1hdCB0aGUKLSAqIGNvbGxlY3RlZCBzdW1tYXJ5IHN0YXRpc3RpY3MuIFRoZSBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gdGhlCi0gKiB7QGxpbmtwbGFpbiAjZ2V0VGFpbChqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKSBnZXRUYWlsfSBkb2N1bWVudGF0aW9uLgotICogKGRlZmF1bHRzIHRvIDx0dD57MH17MX17Mn17NCxjaG9pY2UsLTEjfDAjfDAmbHQ7Li4uIHs0LG51bWJlcixpbnRlZ2VyfQotICogbW9yZX1cbjwvdHQ+KQotICoKLSAqIDxsaT4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7LmZvcm1hdHRlciBuYW1lIG9mIGEgPHR0PkZvcm1hdHRlcjwvdHQ+IGNsYXNzIHVzZWQKLSAqIHRvIGZvcm1hdCB0aGUgY29sbGVjdGVkIExvZ1JlY29yZC4gKGRlZmF1bHRzIHRvIHtAbGlua3BsYWluIENvbXBhY3RGb3JtYXR0ZXJ9KQotICoKLSAqIDwvdWw+Ci0gKgotICogQGF1dGhvciBKYXNvbiBNZWhyZW5zCi0gKiBAc2luY2UgSmF2YU1haWwgMS41LjIKLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3RvckZvcm1hdHRlciBleHRlbmRzIEZvcm1hdHRlciB7Ci0gICAgLyoqCi0gICAgICogQXZvaWQgZGVwZW5kaW5nIG9uIEpNWCBydW50aW1lIGJlYW4gdG8gZ2V0IHRoZSBzdGFydCB0aW1lLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSU5JVF9USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgLyoqCi0gICAgICogVGhlIG1lc3NhZ2UgZm9ybWF0IHN0cmluZyB1c2VkIGFzIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZtdDsKLSAgICAvKioKLSAgICAgKiBUaGUgZm9ybWF0dGVyIHVzZWQgdG8gZm9ybWF0IHRoZSBjaG9zZW4gbG9nIHJlY29yZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEZvcm1hdHRlciBmb3JtYXR0ZXI7Ci0gICAgLyoqCi0gICAgICogVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBwaWNrIHRoZSBsb2cgcmVjb3JkIHRvIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8PyBzdXBlciBMb2dSZWNvcmQ+IGNvbXBhcmF0b3I7Ci0gICAgLyoqCi0gICAgICogVGhlIGxhc3QgYWNjZXB0ZWQgcmVjb3JkLiBTeW5jaHJvbml6ZWQgYWNjZXNzIGlzIHByZWZlcnJlZCBvdmVyIHZvbGF0aWxlCi0gICAgICogZm9yIHRoaXMgY2xhc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb2dSZWNvcmQgbGFzdDsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGxvZyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGZvcm1hdHRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgY291bnQ7Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBsb2cgcHJvZHVjZWQgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgbG9nIHJlY29yZC4KLSAgICAgKiBPbmx5IGluY3JlbWVudGVkIHdoZW4gdGhpcyBmb3JtYXR0ZXIgaXMgcmVzZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGdlbmVyYXRpb24gPSAxTDsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGxvZyByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGZvcm1hdHRlZCB3aXRoIGEgdGhyb3duIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgdGhyb3duOwotICAgIC8qKgotICAgICAqIFRoZSBlbGRlc3QgbG9nIHJlY29yZCB0aW1lIG9yIGVsZGVzdCB0aW1lIHBvc3NpYmxlIGZvciB0aGlzIGluc3RhbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBtaW5NaWxsaXMgPSBJTklUX1RJTUU7Ci0gICAgLyoqCi0gICAgICogVGhlIG5ld2VzdCBsb2cgcmVjb3JkIHRpbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIG1heE1pbGxpcyA9IExvbmcuTUlOX1ZBTFVFOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9ybWF0dGVyIHVzaW5nIHRoZSBMb2dNYW5hZ2VyIGRlZmF1bHRzLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCB0aGUgY2FsbGVyCi0gICAgICogZG9lcyBub3QgaGF2ZSA8dHQ+TG9nZ2luZ1Blcm1pc3Npb24oImNvbnRyb2wiKTwvdHQ+LgotICAgICAqIEB0aHJvd3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgbG9hZGluZyBmcm9tCi0gICAgICogdGhlIExvZ01hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3RvckZvcm1hdHRlcigpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHAgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5mbXQgPSBpbml0Rm9ybWF0KHApOwotICAgICAgICB0aGlzLmZvcm1hdHRlciA9IGluaXRGb3JtYXR0ZXIocCk7Ci0gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGluaXRDb21wYXJhdG9yKHApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGZvcm1hdHRlciB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0LgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCB0aGUgbWVzc2FnZSBmb3JtYXQgb3IgbnVsbCB0byB1c2UgdGhlIExvZ01hbmFnZXIgZGVmYXVsdC4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZSBjYWxsZXIKLSAgICAgKiBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCi0gICAgICogQHRocm93cyBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBsb2FkaW5nIGZyb20KLSAgICAgKiB0aGUgTG9nTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdG9yRm9ybWF0dGVyKFN0cmluZyBmb3JtYXQpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHAgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5mbXQgPSBmb3JtYXQgPT0gbnVsbCA/IGluaXRGb3JtYXQocCkgOiBmb3JtYXQ7Ci0gICAgICAgIHRoaXMuZm9ybWF0dGVyID0gaW5pdEZvcm1hdHRlcihwKTsKLSAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gaW5pdENvbXBhcmF0b3IocCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9ybWF0dGVyIHVzaW5nIHRoZSBnaXZlbiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgc3RyaW5nIG9yIG51bGwgdG8gdXNlIHRoZSBMb2dNYW5hZ2VyIGRlZmF1bHQuCi0gICAgICogQHBhcmFtIGYgdGhlIGZvcm1hdHRlciB1c2VkIG9uIHRoZSBjb2xsZWN0ZWQgbG9nIHJlY29yZCBvciBudWxsIHRvCi0gICAgICogc3BlY2lmeSBubyBmb3JtYXR0ZXIuCi0gICAgICogQHBhcmFtIGMgdGhlIGNvbXBhcmF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggbG9nIHJlY29yZCB0byBmb3JtYXQgb3IKLSAgICAgKiBudWxsIHRvIHNwZWNpZnkgbm8gY29tcGFyYXRvci4KLSAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZSBjYWxsZXIKLSAgICAgKiBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCi0gICAgICogQHRocm93cyBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBsb2FkaW5nIGZyb20KLSAgICAgKiB0aGUgTG9nTWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdG9yRm9ybWF0dGVyKFN0cmluZyBmb3JtYXQsIEZvcm1hdHRlciBmLAotICAgICAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIExvZ1JlY29yZD4gYykgewotICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICB0aGlzLmZtdCA9IGZvcm1hdCA9PSBudWxsID8gaW5pdEZvcm1hdChwKSA6IGZvcm1hdDsKLSAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSBmOwotICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjY3VtdWxhdGVzIGxvZyByZWNvcmRzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwcm9kdWNlIHRoZSBmaW5hbCBvdXRwdXQuCi0gICAgICogVGhlIG91dHB1dCBpcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjZ2V0VGFpbH0gbWV0aG9kIHdoaWNoIGFsc28KLSAgICAgKiByZXNldHMgdGhpcyBmb3JtYXR0ZXIgYmFjayB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQgdG8gc3RvcmUuCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICBpZiAocmVjb3JkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBhY2NlcHRlZDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgZmluYWwgTG9nUmVjb3JkIHBlZWsgPSBwZWVrKCk7Ci0gICAgICAgICAgICAvL1RoZSBzZWxmIGNvbXBhcmUgb2YgdGhlIGZpcnN0IHJlY29yZCBhY3RzIGxpa2UgYSB0eXBlIGNoZWNrLgotICAgICAgICAgICAgTG9nUmVjb3JkIHVwZGF0ZSA9IGFwcGx5KHBlZWsgIT0gbnVsbCA/IHBlZWsgOiByZWNvcmQsIHJlY29yZCk7Ci0gICAgICAgICAgICBpZiAocGVlayAhPSB1cGRhdGUpIHsgLy9Ob3QgaWRlbnRpY2FsLgotICAgICAgICAgICAgICAgIHVwZGF0ZS5nZXRTb3VyY2VNZXRob2ROYW1lKCk7IC8vSW5mZXIgY2FsbGVyLCBudWxsIGNoZWNrLgotICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gYWNjZXB0QW5kVXBkYXRlKHBlZWssIHVwZGF0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gYWNjZXB0KHBlZWssIHJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCFhY2NlcHRlZCk7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIHRoZSBjb2xsZWN0ZWQgTG9nUmVjb3JkIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MuIFRoZSBjb2xsZWN0ZWQKLSAgICAgKiByZXN1bHRzIGFyZSByZXNldCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLiBUaGUKLSAgICAgKiB7QGxpbmtwbGFpbiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHR9IGFyZ3VtZW50IGluZGV4ZXMgYXJlIGFzc2lnbmVkCi0gICAgICogdG8gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotICAgICAqCi0gICAgICogPG9sIHN0YXJ0PScwJz4KLSAgICAgKiA8bGk+e0Bjb2RlIGhlYWR9IHRoZQotICAgICAqIHtAbGlua3BsYWluIEZvcm1hdHRlciNnZXRIZWFkKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpIGhlYWR9IHN0cmluZwotICAgICAqIHJldHVybmVkIGZyb20gdGhlIHRhcmdldCBmb3JtYXR0ZXIgYW5kCi0gICAgICoge0BsaW5rcGxhaW4gI2ZpbmlzaChqYXZhLmxhbmcuU3RyaW5nKSBmaW5pc2hlZH0gYnkgdGhpcyBmb3JtYXR0ZXIuCi0gICAgICogPGxpPntAY29kZSBmb3JtYXR0ZWR9IHRoZSBjdXJyZW50IGxvZyByZWNvcmQKLSAgICAgKiB7QGxpbmtwbGFpbiBGb3JtYXR0ZXIjZm9ybWF0KGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkgZm9ybWF0dGVkfSBieQotICAgICAqIHRoZSB0YXJnZXQgZm9ybWF0dGVyIGFuZCB7QGxpbmtwbGFpbiAjZmluaXNoKGphdmEubGFuZy5TdHJpbmcpIGZpbmlzaGVkfQotICAgICAqIGJ5IHRoaXMgZm9ybWF0dGVyLiAgSWYgdGhlIGZvcm1hdHRlciBpcyBudWxsIHRoZW4gcmVjb3JkIGlzIGZvcm1hdHRlZCBieQotICAgICAqIHRoaXMge0BsaW5rcGxhaW4gI2Zvcm1hdE1lc3NhZ2UoamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKSBmb3JtYXR0ZXJ9LgotICAgICAqIDxsaT57QGNvZGUgdGFpbH0gdGhlCi0gICAgICoge0BsaW5rcGxhaW4gRm9ybWF0dGVyI2dldFRhaWwoamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcikgdGFpbH0gc3RyaW5nCi0gICAgICogcmV0dXJuZWQgZnJvbSB0aGUgdGFyZ2V0IGZvcm1hdHRlciBhbmQKLSAgICAgKiB7QGxpbmtwbGFpbiAjZmluaXNoKGphdmEubGFuZy5TdHJpbmcpIGZpbmlzaGVkfSBieSB0aGlzIGZvcm1hdHRlci4KLSAgICAgKiA8bGk+e0Bjb2RlIGNvdW50fSB0aGUgdG90YWwgbnVtYmVyIG9mIGxvZyByZWNvcmRzCi0gICAgICoge0BsaW5rcGxhaW4gI2Zvcm1hdCBjb25zdW1lZH0gYnkgdGhpcyBmb3JtYXR0ZXIuCi0gICAgICogPGxpPntAY29kZSByZW1haW5pbmd9IHRoZSBjb3VudCBtaW51cyBvbmUuCi0gICAgICogPGxpPntAY29kZSB0aHJvd259IHRoZSB0b3RhbCBudW1iZXIgb2YgbG9nIHJlY29yZHMKLSAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBieSB0aGlzIGZvcm1hdHRlciB3aXRoIGFuIGFzc2lnbmVkCi0gICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkI2dldFRocm93biB0aHJvd2FibGV9LgotICAgICAqIDxsaT57QGNvZGUgbm9ybWFsIG1lc3NhZ2VzfSB0aGUgY291bnQgbWludXMgdGhlIHRocm93bi4KLSAgICAgKiA8bGk+e0Bjb2RlIG1pbk1pbGxpc30gdGhlIGVsZGVzdCBsb2cgcmVjb3JkCi0gICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkI2dldE1pbGxpcyBldmVudCB0aW1lfQotICAgICAqIHtAbGlua3BsYWluICNmb3JtYXQgY29uc3VtZWR9IGJ5IHRoaXMgZm9ybWF0dGVyLiBJZiB0aGUgY291bnQgaXMgemVybwotICAgICAqIHRoZW4gdGhpcyBpcyBzZXQgdG8gdGhlIHByZXZpb3VzIG1heCBvciBhcHByb3hpbWF0ZSBzdGFydCB0aW1lIGlmIHRoZXJlCi0gICAgICogd2FzIG5vIHByZXZpb3VzIG1heC4gQnkgZGVmYXVsdCB0aGlzIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGEgbnVtYmVyLgotICAgICAqIFRoZSBmb3JtYXQgdHlwZSBhbmQgZm9ybWF0IHN0eWxlIHJ1bGVzIGZyb20gdGhlCi0gICAgICoge0BsaW5rcGxhaW4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9IHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgdGhpcyBmcm9tCi0gICAgICogbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLgotICAgICAqIDxsaT57QGNvZGUgbWF4TWlsbGlzfSB0aGUgbW9zdCByZWNlbnQgbG9nIHJlY29yZAotICAgICAqIHtAbGlua3BsYWluIGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCNnZXRNaWxsaXMgZXZlbnQgdGltZX0KLSAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBieSB0aGlzIGZvcm1hdHRlci4gSWYgdGhlIGNvdW50IGlzIHplcm8KLSAgICAgKiB0aGVuIHRoaXMgaXMgc2V0IHRvIHRoZSB7QGxpbmtwbGFpbiBTeXN0ZW0jY3VycmVudFRpbWVNaWxsaXMoKSBjdXJyZW50IHRpbWV9LgotICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBhIG51bWJlci4gVGhlIGZvcm1hdCB0eXBlIGFuZAotICAgICAqIGZvcm1hdCBzdHlsZSBydWxlcyBmcm9tIHRoZSB7QGxpbmtwbGFpbiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0gc2hvdWxkIGJlCi0gICAgICogdXNlZCB0byBjb252ZXJ0IHRoaXMgZnJvbSBtaWxsaXNlY29uZHMgdG8gYSBkYXRlIG9yIHRpbWUuCi0gICAgICogPGxpPntAY29kZSBlbGFwc2VkfSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZQotICAgICAqIHtAY29kZSBtYXhNaWxsaXN9IGFuZCB7QGNvZGUgbWluTWlsbGlzfS4KLSAgICAgKiA8bGk+e0Bjb2RlIHN0YXJ0VGltZX0gdGhlIGFwcHJveGltYXRlIHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiAgQnkKLSAgICAgKiBkZWZhdWx0IHRoaXMgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgYSBudW1iZXIuIFRoZSBmb3JtYXQgdHlwZSBhbmQgZm9ybWF0Ci0gICAgICogc3R5bGUgcnVsZXMgZnJvbSB0aGUge0BsaW5rcGxhaW4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9IHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICogY29udmVydCB0aGlzIGZyb20gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLgotICAgICAqIDxsaT57QGNvZGUgY3VycmVudFRpbWV9IHRoZQotICAgICAqIHtAbGlua3BsYWluIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpIGN1cnJlbnQgdGltZX0gaW4gbWlsbGlzZWNvbmRzLiAgQnkKLSAgICAgKiBkZWZhdWx0IHRoaXMgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgYSBudW1iZXIuIFRoZSBmb3JtYXQgdHlwZSBhbmQgZm9ybWF0Ci0gICAgICogc3R5bGUgcnVsZXMgZnJvbSB0aGUge0BsaW5rcGxhaW4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9IHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICogY29udmVydCB0aGlzIGZyb20gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLgotICAgICAqIDxsaT57QGNvZGUgdXB0aW1lfSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZQotICAgICAqIHtAY29kZSBjdXJyZW50VGltZX0gYW5kIHtAY29kZSBzdGFydFRpbWV9LgotICAgICAqIDxsaT57QGNvZGUgZ2VuZXJhdGlvbn0gdGhlIG51bWJlciB0aW1lcyB0aGlzIG1ldGhvZCBwcm9kdWNlZCBvdXRwdXQgd2l0aAotICAgICAqIGF0IGxlYXN0IG9uZSB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBsb2cgcmVjb3JkLiAgVGhpcyBjYW4gYmUgdXNlZAotICAgICAqIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgY29tcGxldGUgcmVwb3J0cyB0aGlzIGZvcm1hdHRlciBoYXMgcHJvZHVjZWQuCi0gICAgICogPC9vbD4KLSAgICAgKgotICAgICAqIDxwPgotICAgICAqIFNvbWUgZXhhbXBsZSBmb3JtYXRzOjxicj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAY29kZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkNvbGxlY3RvckZvcm1hdHRlci5mb3JtYXQ9ezB9ezF9ezJ9ezQsY2hvaWNlLC0xI3wwI3wwPC4uLiB7NCxudW1iZXIsaW50ZWdlcn0gbW9yZX1cbn0KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHByaW50cyB0aGUgaGVhZCAoe0Bjb2RlIHswfX0pLCBmb3JtYXQgKHtAY29kZSB7MX19KSwgYW5kIHRhaWwKLSAgICAgKiAoe0Bjb2RlIHsyfX0pIGZyb20gdGhlIHRhcmdldCBmb3JtYXR0ZXIgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZgotICAgICAqIHJlbWFpbmluZyAoe0Bjb2RlIHs0fX0pIGxvZyByZWNvcmRzIGNvbnN1bWVkIGJ5IHRoaXMgZm9ybWF0dGVyIGlmIHRoZXJlCi0gICAgICogYXJlIGFueSByZW1haW5pbmcgcmVjb3Jkcy4KLSAgICAgKiA8cHJlPgotICAgICAqIEVuY29kaW5nIGZhaWxlZC58TnVsbFBvaW50ZXJFeGNlcHRpb246IG51bGwgU3RyaW5nLmdldEJ5dGVzKDo5MTMpLi4uIDMgbW9yZQotICAgICAqIDwvcHJlPgotICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db2xsZWN0b3JGb3JtYXR0ZXIuZm9ybWF0PVRoZXNlIHszfSBtZXNzYWdlcyBvY2N1cnJlZCBiZXR3ZWVuXG57NyxkYXRlLEVFRSwgTU1NIGRkIEhIOm1tOnNzOlMgWlpaIHl5eXl9IGFuZCB7OCx0aW1lLEVFRSwgTU1NIGRkIEhIOm1tOnNzOlMgWlpaIHl5eXl9XG59Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBwcmludHMgdGhlIGNvdW50ICh7QGNvZGUgezN9fSkgZm9sbG93ZWQgYnkgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlCi0gICAgICogZWxkZXN0IGxvZyByZWNvcmQgKHtAY29kZSB7N319KSBhbmQgdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50Ci0gICAgICogbG9nIHJlY29yZCAoe0Bjb2RlIHs4fX0pLgotICAgICAqIDxwcmU+Ci0gICAgICogVGhlc2UgMjkyIG1lc3NhZ2VzIG9jY3VycmVkIGJldHdlZW4KLSAgICAgKiBUdWUsIEp1bCAyMSAxNDoxMTo0Mjo0NDkgLTA1MDAgMjAwOSBhbmQgRnJpLCBOb3YgMjAgMDc6Mjk6MjQ6MCAtMDYwMCAyMDA5Ci0gICAgICogPC9wcmU+Ci0gICAgICogPGxpPntAY29kZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkNvbGxlY3RvckZvcm1hdHRlci5mb3JtYXQ9VGhlc2UgezN9IG1lc3NhZ2VzIG9jY3VycmVkIGJldHdlZW4gezksY2hvaWNlLDg2NDAwMDAwI3s3LGRhdGV9IHs3LHRpbWV9IGFuZCB7OCx0aW1lfXw4NjQwMDAwMDx7NyxkYXRlfSBhbmQgezgsZGF0ZX19XG59Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBwcmludHMgdGhlIGNvdW50ICh7QGNvZGUgezN9fSkgYW5kIHRoZW4gY2hvb3NlcyB0aGUgZm9ybWF0IGJhc2VkIG9uCi0gICAgICogdGhlIGVsYXBzZWQgdGltZSAoe0Bjb2RlIHs5fX0pLiBJZiB0aGUgZWxhcHNlZCB0aW1lIGlzIGxlc3MgdGhhbiBvbmUgZGF5Ci0gICAgICogdGhlbiB0aGUgZWxkZXN0IGxvZyByZWNvcmQgKHtAY29kZSB7N319KSBkYXRlIGFuZCB0aW1lIGlzIGZvcm1hdHRlZAotICAgICAqIGZvbGxvd2VkIGJ5IGp1c3QgdGhlIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50IGxvZyByZWNvcmQgKHtAY29kZSB7OH19LgotICAgICAqIE90aGVyd2lzZSwgdGhlIGp1c3QgdGhlIGRhdGUgb2YgdGhlIGVsZGVzdCBsb2cgcmVjb3JkICh7QGNvZGUgezd9fSkgYW5kCi0gICAgICoganVzdCB0aGUgZGF0ZSBvZiBtb3N0IHJlY2VudCBsb2cgcmVjb3JkICh7QGNvZGUgezh9fSBpcyBmb3JtYXR0ZWQuCi0gICAgICogPHByZT4KLSAgICAgKiBUaGVzZSA3MyBtZXNzYWdlcyBvY2N1cnJlZCBiZXR3ZWVuIEp1bCAyMSwgMjAwOSAyOjExOjQyIFBNIGFuZCAyOjEzOjMyIFBNCi0gICAgICoKLSAgICAgKiBUaGVzZSAxMTYgbWVzc2FnZXMgb2NjdXJyZWQgYmV0d2VlbiBKdWwgMjEsIDIwMDkgYW5kIEF1ZyAyMCwgMjAwOQotICAgICAqIDwvcHJlPgotICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db2xsZWN0b3JGb3JtYXR0ZXIuZm9ybWF0PXsxM30gYWxlcnQgcmVwb3J0cyBzaW5jZSB7MTAsZGF0ZX0uXG59Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBwcmludHMgdGhlIGdlbmVyYXRpb24gKHtAY29kZSB7MTN9fSkgZm9sbG93ZWQgYnkgdGhlIHN0YXJ0IHRpbWUKLSAgICAgKiAoe0Bjb2RlIHsxMH19KSBmb3JtYXR0ZWQgYXMgYSBkYXRlLgotICAgICAqIDxwcmU+Ci0gICAgICogNCwzMjAgYWxlcnQgcmVwb3J0cyBzaW5jZSBKdWwgMjEsIDIwMTIuCi0gICAgICogPC9wcmU+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoIHRoZSBoYW5kbGVyIG9yIG51bGwuCi0gICAgICogQHJldHVybiB0aGUgb3V0cHV0IHN0cmluZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhaWwoZmluYWwgSGFuZGxlciBoKSB7Ci0gICAgICAgIHN1cGVyLmdldFRhaWwoaCk7ICAvL0JlIGZvcndhcmQgY29tcGF0aWJsZSB3aXRoIHN1cGVyLmdldEhlYWQuCi0gICAgICAgIHJldHVybiBmb3JtYXRSZWNvcmQoaCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgY29sbGVjdGVkIExvZ1JlY29yZCBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzLiBUaGUgTG9nUmVjb3JkIGFuZAotICAgICAqIHN1bW1hcnkgc3RhdGlzdGljcyBhcmUgbm90IGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcmVjb3JkIGZvcm1hdHRlZCBvciB0aGUgZGVmYXVsdCB0b1N0cmluZy4KLSAgICAgKiBAc2VlICNnZXRUYWlsKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdFJlY29yZCgoSGFuZGxlcikgbnVsbCwgZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY2hvb3NlIHRoZSBjb2xsZWN0ZWQgTG9nUmVjb3JkLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlCi0gICAgICogZ3JlYXRlciBvZiB0d28gTG9nUmVjb3Jkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0IHRoZSBjdXJyZW50IHJlY29yZC4KLSAgICAgKiBAcGFyYW0gdSB0aGUgcmVjb3JkIHRoYXQgY291bGQgcmVwbGFjZSB0aGUgY3VycmVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoZSBnaXZlbiBsb2cgcmVjb3Jkcy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIG1heSBvY2N1ciBpZiBlaXRoZXIgcmVjb3JkIGlzIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExvZ1JlY29yZCBhcHBseShmaW5hbCBMb2dSZWNvcmQgdCwgZmluYWwgTG9nUmVjb3JkIHUpIHsKLSAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB1ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXBhcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZSh0LCB1KSA+PSAwID8gdCA6IHU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBvbmx5IGlmIHRoZSBleHBlY3RlZCByZWNvcmQgbWF0Y2hlcyB0aGUKLSAgICAgKiBsYXN0IHJlY29yZC4gIFRoZSB1cGRhdGUgcmVjb3JkIGlzIG5vdCBzdG9yZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZSB0aGUgTG9nUmVjb3JkIHRoYXQgaXMgZXhwZWN0ZWQuCi0gICAgICogQHBhcmFtIHUgdGhlIExvZ1JlY29yZCB1c2VkIHRvIGNvbGxlY3Qgc3RhdGlzdGljcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxhc3QgcmVjb3JkIHdhcyB0aGUgZXhwZWN0ZWQgcmVjb3JkLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHVwZGF0ZSByZWNvcmQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChmaW5hbCBMb2dSZWNvcmQgZSwgZmluYWwgTG9nUmVjb3JkIHUpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvZ1JlY29yZCBtZXRob2RzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2hlY2sgb2YgdGhlIGxhc3Qgc3RvcmVkCi0gICAgICAgICAqIHJlY29yZCB0byBndWFyZCBhZ2FpbnN0IHN1YmNsYXNzZXMgb2YgTG9nUmVjb3JkIHRoYXQgbWlnaHQgYXR0ZW1wdCB0bwotICAgICAgICAgKiByZXNldCB0aGUgc3RhdGUgYnkgdHJpZ2dlcmluZyBhIGNhbGwgdG8gZ2V0VGFpbC4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIGxvbmcgbWlsbGlzID0gdS5nZXRNaWxsaXMoKTsgLy9OdWxsIGNoZWNrLgotICAgICAgICBmaW5hbCBUaHJvd2FibGUgZXggPSB1LmdldFRocm93bigpOwotICAgICAgICBpZiAobGFzdCA9PSBlKSB7ICAvL09ubHkgaWYgdGhlIGV4YWN0IHNhbWUgcmVmZXJlbmNlLgotICAgICAgICAgICAgaWYgKCsrY291bnQgIT0gMUwpIHsKLSAgICAgICAgICAgICAgICBtaW5NaWxsaXMgPSBNYXRoLm1pbihtaW5NaWxsaXMsIG1pbGxpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvL1Nob3cgc2luZ2xlIHJlY29yZHMgYXMgaW5zdGFudCBhbmQgbm90IGEgdGltZSBwZXJpb2QuCi0gICAgICAgICAgICAgICAgbWluTWlsbGlzID0gbWlsbGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4TWlsbGlzID0gTWF0aC5tYXgobWF4TWlsbGlzLCBtaWxsaXMpOwotCi0gICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICsrdGhyb3duOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgYWxsIG9mIHRoZSBjb2xsZWN0ZWQgc3VtbWFyeSBzdGF0aXN0aWNzIGluY2x1ZGluZyB0aGUgTG9nUmVjb3JkLgotICAgICAqIEBwYXJhbSBtaW4gdGhlIGN1cnJlbnQgbWluIG1pbGxpc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KGZpbmFsIGxvbmcgbWluKSB7Ci0gICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxhc3QgPSBudWxsOwotICAgICAgICAgICAgKytnZW5lcmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAwTDsKLSAgICAgICAgdGhyb3duID0gMEw7Ci0gICAgICAgIG1pbk1pbGxpcyA9IG1pbjsKLSAgICAgICAgbWF4TWlsbGlzID0gTG9uZy5NSU5fVkFMVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgZ2l2ZW4gcmVjb3JkIHdpdGggdGhlIGhlYWQgYW5kIHRhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaCB0aGUgSGFuZGxlciBvciBudWxsLgotICAgICAqIEBwYXJhbSByZXNldCB0cnVlIGlmIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIExvZ1JlY29yZCBzaG91bGQgYmUgcmVzZXQKLSAgICAgKiBiYWNrIHRvIGluaXRpYWwgdmFsdWVzLgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzdHJpbmcuCi0gICAgICogQHNlZSAjZ2V0VGFpbChqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdFJlY29yZChmaW5hbCBIYW5kbGVyIGgsIGZpbmFsIGJvb2xlYW4gcmVzZXQpIHsKLSAgICAgICAgZmluYWwgTG9nUmVjb3JkIHJlY29yZDsKLSAgICAgICAgZmluYWwgbG9uZyBjOwotICAgICAgICBmaW5hbCBsb25nIHQ7Ci0gICAgICAgIGZpbmFsIGxvbmcgZzsKLSAgICAgICAgbG9uZyBtc2w7Ci0gICAgICAgIGxvbmcgbXNoOwotICAgICAgICBsb25nIG5vdzsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBsYXN0OwotICAgICAgICAgICAgYyA9IGNvdW50OwotICAgICAgICAgICAgZyA9IGdlbmVyYXRpb247Ci0gICAgICAgICAgICB0ID0gdGhyb3duOwotICAgICAgICAgICAgbXNsID0gbWluTWlsbGlzOwotICAgICAgICAgICAgbXNoID0gbWF4TWlsbGlzOwotICAgICAgICAgICAgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAwTCkgewotICAgICAgICAgICAgICAgIG1zaCA9IG5vdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc2V0KSB7IC8vQlVHIElEIDYzNTE2ODUKLSAgICAgICAgICAgICAgICByZXNldChtc2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGhlYWQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2c7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0YWlsOwotICAgICAgICBmaW5hbCBGb3JtYXR0ZXIgZiA9IHRoaXMuZm9ybWF0dGVyOwotICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGYpIHsKLSAgICAgICAgICAgICAgICBoZWFkID0gZi5nZXRIZWFkKGgpOwotICAgICAgICAgICAgICAgIG1zZyA9IHJlY29yZCAhPSBudWxsID8gZi5mb3JtYXQocmVjb3JkKSA6ICIiOwotICAgICAgICAgICAgICAgIHRhaWwgPSBmLmdldFRhaWwoaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWFkID0gIiI7Ci0gICAgICAgICAgICBtc2cgPSByZWNvcmQgIT0gbnVsbCA/IGZvcm1hdE1lc3NhZ2UocmVjb3JkKSA6ICIiOwotICAgICAgICAgICAgdGFpbCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9jYWxlIGwgPSBudWxsOwotICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gcmVjb3JkLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgICAgICBsID0gcmIgPT0gbnVsbCA/IG51bGwgOiByYi5nZXRMb2NhbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE1lc3NhZ2VGb3JtYXQgbWY7Ci0gICAgICAgIGlmIChsID09IG51bGwpIHsgLy9CVUcgSUQgODAzOTE2NQotICAgICAgICAgICAgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChmbXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChmbXQsIGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZXNlIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBnZXRUYWlsIGRvY3VtZW50YXRpb24uCi0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gbWYuZm9ybWF0KG5ldyBPYmplY3RbXXtmaW5pc2goaGVhZCksIGZpbmlzaChtc2cpLCBmaW5pc2godGFpbCksCi0gICAgICAgICAgICBjLCAoYyAtIDFMKSwgdCwgKGMgLSB0KSwgbXNsLCBtc2gsIChtc2ggLSBtc2wpLCBJTklUX1RJTUUsIG5vdywKLSAgICAgICAgICAgIChub3cgLSBJTklUX1RJTUUpLCBnfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGllZCB0byB0aGUgaGVhZCwgZm9ybWF0LCBhbmQgdGFpbCByZXR1cm5lZCBieSB0aGUgdGFyZ2V0IGZvcm1hdHRlci4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRyaW1zIGFsbCBpbnB1dCBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmluaXNoKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZWVrIGF0IHRoZSBjdXJyZW50IGxvZyByZWNvcmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgb3IgdGhlIGN1cnJlbnQgbG9nIHJlY29yZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBMb2dSZWNvcmQgcGVlaygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGFzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIHN0b3JlcyBnaXZlbiBMb2dSZWNvcmQgaWYgdGhlIGV4cGVjdGVkCi0gICAgICogcmVjb3JkIG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVjb3JkLgotICAgICAqCi0gICAgICogQHBhcmFtIGUgdGhlIGV4cGVjdGVkIHJlY29yZC4KLSAgICAgKiBAcGFyYW0gdSB0aGUgdXBkYXRlIHJlY29yZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVwZGF0ZSB3YXMgcGVyZm9ybWVkLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHVwZGF0ZSByZWNvcmQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdEFuZFVwZGF0ZShMb2dSZWNvcmQgZSwgTG9nUmVjb3JkIHUpIHsKLSAgICAgICAgaWYgKGFjY2VwdChlLCB1KSkgewotICAgICAgICAgICAgdGhpcy5sYXN0ID0gdTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVzc2FnZSBmb3JtYXQgc3RyaW5nIGZyb20gdGhlIExvZ01hbmFnZXIgb3IgY3JlYXRlcyB0aGUgZGVmYXVsdAotICAgICAqIG1lc3NhZ2UgZm9ybWF0IHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwIHRoZSBjbGFzcyBuYW1lIHByZWZpeC4KLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXQgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdEZvcm1hdChmaW5hbCBTdHJpbmcgcCkgewotICAgICAgICBTdHJpbmcgdiA9IGZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuZm9ybWF0IikpOwotICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdiA9ICJ7MH17MX17Mn17NCxjaG9pY2UsLTEjfDAjfDA8Li4uIHs0LG51bWJlcixpbnRlZ2VyfSBtb3JlfVxuIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuZCBjcmVhdGVzIHRoZSBmb3JtYXR0ZXIgZnJvbSB0aGUgTG9nTWFuYWdlciBvciBjcmVhdGVzIHRoZSBkZWZhdWx0Ci0gICAgICogZm9ybWF0dGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHAgdGhlIGNsYXNzIG5hbWUgcHJlZml4LgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlci4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBudWxsLgotICAgICAqIEB0aHJvd3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpZiB0aGUgZm9ybWF0dGVyIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZvcm1hdHRlciBpbml0Rm9ybWF0dGVyKGZpbmFsIFN0cmluZyBwKSB7Ci0gICAgICAgIEZvcm1hdHRlciBmOwotICAgICAgICBTdHJpbmcgdiA9IGZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuZm9ybWF0dGVyIikpOwotICAgICAgICBpZiAodiAhPSBudWxsICYmIHYubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKCEibnVsbCIuZXF1YWxzSWdub3JlQ2FzZSh2KSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBMb2dNYW5hZ2VyUHJvcGVydGllcy5uZXdGb3JtYXR0ZXIodik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9Eb24ndCBmb3JjZSB0aGUgYnl0ZSBjb2RlIHZlcmlmaWVyIHRvIGxvYWQgdGhlIGZvcm1hdHRlci4KLSAgICAgICAgICAgIGYgPSBGb3JtYXR0ZXIuY2xhc3MuY2FzdChuZXcgQ29tcGFjdEZvcm1hdHRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuZCBjcmVhdGVzIHRoZSBjb21wYXJhdG9yIGZyb20gdGhlIExvZ01hbmFnZXIgb3IgcmV0dXJucyB0aGUKLSAgICAgKiBkZWZhdWx0IGNvbXBhcmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcCB0aGUgY2xhc3MgbmFtZSBwcmVmaXguCi0gICAgICogQHJldHVybiB0aGUgY29tcGFyYXRvciBvciBudWxsLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGl0IHdhcyBzcGVjaWZpZWQgdGhhdCB0aGUgY29tcGFyYXRvcgotICAgICAqIHNob3VsZCBiZSByZXZlcnNlZCBidXQgbm8gaW5pdGlhbCBjb21wYXJhdG9yIHdhcyBzcGVjaWZpZWQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24gaWYgdGhlIGNvbXBhcmF0b3IgY2FuIG5vdCBiZQotICAgICAqIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBDb21wYXJhdG9yPD8gc3VwZXIgTG9nUmVjb3JkPiBpbml0Q29tcGFyYXRvcihmaW5hbCBTdHJpbmcgcCkgewotICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgTG9nUmVjb3JkPiBjOwotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuY29tcGFyYXRvciIpKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJldmVyc2UgPSBmcm9tTG9nTWFuYWdlcihwLmNvbmNhdCgiLmNvbXBhcmF0b3IucmV2ZXJzZSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEibnVsbCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBjID0gTG9nTWFuYWdlclByb3BlcnRpZXMubmV3Q29tcGFyYXRvcihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHJldmVyc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYyAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLnJldmVyc2VPcmRlcihjKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb21wYXJhdG9yIHRvIHJldmVyc2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsgLy9ObyBvcmRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJldmVyc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb21wYXJhdG9yIHRvIHJldmVyc2UuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9Eb24ndCBmb3JjZSB0aGUgYnl0ZSBjb2RlIHZlcmlmaWVyIHRvIGxvYWQgdGhlIGNvbXBhcmF0b3IuCi0gICAgICAgICAgICAgICAgICAgIGMgPSBDb21wYXJhdG9yLmNsYXNzLmNhc3QoU2V2ZXJpdHlDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgdGhyb3cgcmU7IC8vQXZvaWQgY2F0Y2ggYWxsLgotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotfQorLyoNCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLg0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKYXNvbiBNZWhyZW5zLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUNCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudA0KKyAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91DQorICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuDQorICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xDQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYw0KKyAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaA0KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4NCisgKg0KKyAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOg0KKyAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiDQorICogZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlDQorICogZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4NCisgKg0KKyAqIE1vZGlmaWNhdGlvbnM6DQorICogSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMNCisgKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoNCisgKiAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIg0KKyAqDQorICogQ29udHJpYnV0b3Iocyk6DQorICogSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yDQorICogb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0NCisgKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwNCisgKiBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhDQorICogcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKyAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bw0KKyAqIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQ0KKyAqIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMNCisgKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodA0KKyAqIGhvbGRlci4NCisgKi8NCitwYWNrYWdlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmc7DQorDQoraW1wb3J0IHN0YXRpYyBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXJQcm9wZXJ0aWVzLmZyb21Mb2dNYW5hZ2VyOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5VbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQoraW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7DQorDQorLyoqDQorICogQSBMb2dSZWNvcmQgZm9ybWF0dGVyIHRoYXQgdGFrZXMgYSBzZXF1ZW5jZSBvZiBMb2dSZWNvcmRzIGFuZCBjb21iaW5lcyB0aGVtDQorICogaW50byBhIHNpbmdsZSBzdW1tYXJ5IHJlc3VsdC4gRm9ybWF0aW5nIG9mIHRoZSBoZWFkLCBMb2dSZWNvcmQsIGFuZCB0YWlsIGFyZQ0KKyAqIGRlbGVnYXRlZCB0byB0aGUgd3JhcHBlZCBmb3JtYXR0ZXIuDQorICoNCisgKiA8cD4NCisgKiBCeSBkZWZhdWx0IGVhY2ggPHR0PkNvbGxlY3RvckZvcm1hdHRlcjwvdHQ+IGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZQ0KKyAqIGZvbGxvd2luZyBMb2dNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB3aGVyZQ0KKyAqIDx0dD4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7PC90dD4gcmVmZXJzIHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvcg0KKyAqIHRoZSBmdWxseSBxdWFsaWZpZWQgZGVyaXZlZCBjbGFzcyBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIuICBJZiBwcm9wZXJ0aWVzIGFyZQ0KKyAqIG5vdCBkZWZpbmVkLCBvciBjb250YWluIGludmFsaWQgdmFsdWVzLCB0aGVuIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMgYXJlDQorICogdXNlZC4NCisgKiA8dWw+DQorICogPGxpPiZsdDtmb3JtYXR0ZXItbmFtZSZndDsuY29tcGFyYXRvciBuYW1lIG9mIGENCisgKiB7QGxpbmtwbGFpbiBqYXZhLnV0aWwuQ29tcGFyYXRvcn0gY2xhc3MgdXNlZCB0byBjaG9vc2UgdGhlIGNvbGxlY3RlZA0KKyAqIDx0dD5Mb2dSZWNvcmQ8L3R0Pi4gSWYgYSBjb21wYXJhdG9yIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBtYXgNCisgKiA8dHQ+TG9nUmVjb3JkPC90dD4gaXMgY2hvc2VuLiBJZiBjb21wYXJhdG9yIGlzIHNldCB0byB0aGUgc3RyaW5nIGxpdGVyYWwNCisgKiBudWxsLCB0aGVuIHRoZSBsYXN0IHJlY29yZCBpcyBjaG9zZW4uIChkZWZhdWx0cyB0bw0KKyAqIHtAbGlua3BsYWluIFNldmVyaXR5Q29tcGFyYXRvcn0pDQorICoNCisgKiA8bGk+Jmx0O2Zvcm1hdHRlci1uYW1lJmd0Oy5jb21wYXJhdG9yLnJldmVyc2UgYSBib29sZWFuDQorICogPHR0PnRydWU8L3R0PiB0byBjb2xsZWN0IHRoZSBtaW4gPHR0PkxvZ1JlY29yZDwvdHQ+IG9yIDx0dD5mYWxzZTwvdHQ+IHRvDQorICogY29sbGVjdCB0aGUgbWF4IDx0dD5Mb2dSZWNvcmQ8L3R0Pi4gKGRlZmF1bHRzIHRvIDx0dD5mYWxzZTwvdHQ+KQ0KKyAqDQorICogPGxpPiZsdDtmb3JtYXR0ZXItbmFtZSZndDsuZm9ybWF0IHRoZQ0KKyAqIHtAbGlua3BsYWluIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IE1lc3NhZ2VGb3JtYXR9IHN0cmluZyB1c2VkIHRvIGZvcm1hdCB0aGUNCisgKiBjb2xsZWN0ZWQgc3VtbWFyeSBzdGF0aXN0aWNzLiBUaGUgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIHRoZQ0KKyAqIHtAbGlua3BsYWluICNnZXRUYWlsKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpIGdldFRhaWx9IGRvY3VtZW50YXRpb24uDQorICogKGRlZmF1bHRzIHRvIDx0dD57MH17MX17Mn17NCxjaG9pY2UsLTEjfDAjfDAmbHQ7Li4uIHs0LG51bWJlcixpbnRlZ2VyfQ0KKyAqIG1vcmV9XG48L3R0PikNCisgKg0KKyAqIDxsaT4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7LmZvcm1hdHRlciBuYW1lIG9mIGEgPHR0PkZvcm1hdHRlcjwvdHQ+IGNsYXNzIHVzZWQNCisgKiB0byBmb3JtYXQgdGhlIGNvbGxlY3RlZCBMb2dSZWNvcmQuIChkZWZhdWx0cyB0byB7QGxpbmtwbGFpbiBDb21wYWN0Rm9ybWF0dGVyfSkNCisgKg0KKyAqIDwvdWw+DQorICoNCisgKiBAYXV0aG9yIEphc29uIE1laHJlbnMNCisgKiBAc2luY2UgSmF2YU1haWwgMS41LjINCisgKi8NCitwdWJsaWMgY2xhc3MgQ29sbGVjdG9yRm9ybWF0dGVyIGV4dGVuZHMgRm9ybWF0dGVyIHsNCisgICAgLyoqDQorICAgICAqIEF2b2lkIGRlcGVuZGluZyBvbiBKTVggcnVudGltZSBiZWFuIHRvIGdldCB0aGUgc3RhcnQgdGltZS4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSU5JVF9USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgbWVzc2FnZSBmb3JtYXQgc3RyaW5nIHVzZWQgYXMgdGhlIGZvcm1hdHRlZCBvdXRwdXQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmbXQ7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgZm9ybWF0dGVyIHVzZWQgdG8gZm9ybWF0IHRoZSBjaG9zZW4gbG9nIHJlY29yZC4NCisgICAgICovDQorICAgIHByaXZhdGUgZmluYWwgRm9ybWF0dGVyIGZvcm1hdHRlcjsNCisgICAgLyoqDQorICAgICAqIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gcGljayB0aGUgbG9nIHJlY29yZCB0byBmb3JtYXQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8PyBzdXBlciBMb2dSZWNvcmQ+IGNvbXBhcmF0b3I7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgbGFzdCBhY2NlcHRlZCByZWNvcmQuIFN5bmNocm9uaXplZCBhY2Nlc3MgaXMgcHJlZmVycmVkIG92ZXIgdm9sYXRpbGUNCisgICAgICogZm9yIHRoaXMgY2xhc3MuDQorICAgICAqLw0KKyAgICBwcml2YXRlIExvZ1JlY29yZCBsYXN0Ow0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBsb2cgcmVjb3JkcyB0aGF0IGhhdmUgYmVlbiBmb3JtYXR0ZWQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgY291bnQ7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGxvZyBwcm9kdWNlZCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBsb2cgcmVjb3JkLg0KKyAgICAgKiBPbmx5IGluY3JlbWVudGVkIHdoZW4gdGhpcyBmb3JtYXR0ZXIgaXMgcmVzZXQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgZ2VuZXJhdGlvbiA9IDFMOw0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBsb2cgcmVjb3JkcyB0aGF0IGhhdmUgYmVlbiBmb3JtYXR0ZWQgd2l0aCBhIHRocm93biBvYmplY3QuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgdGhyb3duOw0KKyAgICAvKioNCisgICAgICogVGhlIGVsZGVzdCBsb2cgcmVjb3JkIHRpbWUgb3IgZWxkZXN0IHRpbWUgcG9zc2libGUgZm9yIHRoaXMgaW5zdGFuY2UuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgbWluTWlsbGlzID0gSU5JVF9USU1FOw0KKyAgICAvKioNCisgICAgICogVGhlIG5ld2VzdCBsb2cgcmVjb3JkIHRpbWUuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgbWF4TWlsbGlzID0gTG9uZy5NSU5fVkFMVUU7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIHRoZSBmb3JtYXR0ZXIgdXNpbmcgdGhlIExvZ01hbmFnZXIgZGVmYXVsdHMuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlIGNhbGxlcg0KKyAgICAgKiBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uDQorICAgICAqIEB0aHJvd3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgbG9hZGluZyBmcm9tDQorICAgICAqIHRoZSBMb2dNYW5hZ2VyLg0KKyAgICAgKi8NCisgICAgcHVibGljIENvbGxlY3RvckZvcm1hdHRlcigpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZyBwID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQorICAgICAgICB0aGlzLmZtdCA9IGluaXRGb3JtYXQocCk7DQorICAgICAgICB0aGlzLmZvcm1hdHRlciA9IGluaXRGb3JtYXR0ZXIocCk7DQorICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBpbml0Q29tcGFyYXRvcihwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyB0aGUgZm9ybWF0dGVyIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIG1lc3NhZ2UgZm9ybWF0IG9yIG51bGwgdG8gdXNlIHRoZSBMb2dNYW5hZ2VyIGRlZmF1bHQuDQorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlIGNhbGxlcg0KKyAgICAgKiBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uDQorICAgICAqIEB0aHJvd3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgbG9hZGluZyBmcm9tDQorICAgICAqIHRoZSBMb2dNYW5hZ2VyLg0KKyAgICAgKi8NCisgICAgcHVibGljIENvbGxlY3RvckZvcm1hdHRlcihTdHJpbmcgZm9ybWF0KSB7DQorICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOw0KKyAgICAgICAgdGhpcy5mbXQgPSBmb3JtYXQgPT0gbnVsbCA/IGluaXRGb3JtYXQocCkgOiBmb3JtYXQ7DQorICAgICAgICB0aGlzLmZvcm1hdHRlciA9IGluaXRGb3JtYXR0ZXIocCk7DQorICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBpbml0Q29tcGFyYXRvcihwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyB0aGUgZm9ybWF0dGVyIHVzaW5nIHRoZSBnaXZlbiB2YWx1ZXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBzdHJpbmcgb3IgbnVsbCB0byB1c2UgdGhlIExvZ01hbmFnZXIgZGVmYXVsdC4NCisgICAgICogQHBhcmFtIGYgdGhlIGZvcm1hdHRlciB1c2VkIG9uIHRoZSBjb2xsZWN0ZWQgbG9nIHJlY29yZCBvciBudWxsIHRvDQorICAgICAqIHNwZWNpZnkgbm8gZm9ybWF0dGVyLg0KKyAgICAgKiBAcGFyYW0gYyB0aGUgY29tcGFyYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGljaCBsb2cgcmVjb3JkIHRvIGZvcm1hdCBvcg0KKyAgICAgKiBudWxsIHRvIHNwZWNpZnkgbm8gY29tcGFyYXRvci4NCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCB0aGUgY2FsbGVyDQorICAgICAqIGRvZXMgbm90IGhhdmUgPHR0PkxvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIik8L3R0Pi4NCisgICAgICogQHRocm93cyBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBsb2FkaW5nIGZyb20NCisgICAgICogdGhlIExvZ01hbmFnZXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ29sbGVjdG9yRm9ybWF0dGVyKFN0cmluZyBmb3JtYXQsIEZvcm1hdHRlciBmLA0KKyAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBMb2dSZWNvcmQ+IGMpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZyBwID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQorICAgICAgICB0aGlzLmZtdCA9IGZvcm1hdCA9PSBudWxsID8gaW5pdEZvcm1hdChwKSA6IGZvcm1hdDsNCisgICAgICAgIHRoaXMuZm9ybWF0dGVyID0gZjsNCisgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFjY3VtdWxhdGVzIGxvZyByZWNvcmRzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwcm9kdWNlIHRoZSBmaW5hbCBvdXRwdXQuDQorICAgICAqIFRoZSBvdXRwdXQgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI2dldFRhaWx9IG1ldGhvZCB3aGljaCBhbHNvDQorICAgICAqIHJlc2V0cyB0aGlzIGZvcm1hdHRlciBiYWNrIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkIHRvIHN0b3JlLg0KKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgew0KKyAgICAgICAgaWYgKHJlY29yZCA9PSBudWxsKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBib29sZWFuIGFjY2VwdGVkOw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGZpbmFsIExvZ1JlY29yZCBwZWVrID0gcGVlaygpOw0KKyAgICAgICAgICAgIC8vVGhlIHNlbGYgY29tcGFyZSBvZiB0aGUgZmlyc3QgcmVjb3JkIGFjdHMgbGlrZSBhIHR5cGUgY2hlY2suDQorICAgICAgICAgICAgTG9nUmVjb3JkIHVwZGF0ZSA9IGFwcGx5KHBlZWsgIT0gbnVsbCA/IHBlZWsgOiByZWNvcmQsIHJlY29yZCk7DQorICAgICAgICAgICAgaWYgKHBlZWsgIT0gdXBkYXRlKSB7IC8vTm90IGlkZW50aWNhbC4NCisgICAgICAgICAgICAgICAgdXBkYXRlLmdldFNvdXJjZU1ldGhvZE5hbWUoKTsgLy9JbmZlciBjYWxsZXIsIG51bGwgY2hlY2suDQorICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gYWNjZXB0QW5kVXBkYXRlKHBlZWssIHVwZGF0ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYWNjZXB0ZWQgPSBhY2NlcHQocGVlaywgcmVjb3JkKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IHdoaWxlICghYWNjZXB0ZWQpOw0KKyAgICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIHRoZSBjb2xsZWN0ZWQgTG9nUmVjb3JkIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MuIFRoZSBjb2xsZWN0ZWQNCisgICAgICogcmVzdWx0cyBhcmUgcmVzZXQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4gVGhlDQorICAgICAqIHtAbGlua3BsYWluIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGphdmEudGV4dH0gYXJndW1lbnQgaW5kZXhlcyBhcmUgYXNzaWduZWQNCisgICAgICogdG8gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOg0KKyAgICAgKg0KKyAgICAgKiA8b2wgc3RhcnQ9JzAnPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGhlYWR9IHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiBGb3JtYXR0ZXIjZ2V0SGVhZChqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKSBoZWFkfSBzdHJpbmcNCisgICAgICogcmV0dXJuZWQgZnJvbSB0aGUgdGFyZ2V0IGZvcm1hdHRlciBhbmQNCisgICAgICoge0BsaW5rcGxhaW4gI2ZpbmlzaChqYXZhLmxhbmcuU3RyaW5nKSBmaW5pc2hlZH0gYnkgdGhpcyBmb3JtYXR0ZXIuDQorICAgICAqIDxsaT57QGNvZGUgZm9ybWF0dGVkfSB0aGUgY3VycmVudCBsb2cgcmVjb3JkDQorICAgICAqIHtAbGlua3BsYWluIEZvcm1hdHRlciNmb3JtYXQoamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKSBmb3JtYXR0ZWR9IGJ5DQorICAgICAqIHRoZSB0YXJnZXQgZm9ybWF0dGVyIGFuZCB7QGxpbmtwbGFpbiAjZmluaXNoKGphdmEubGFuZy5TdHJpbmcpIGZpbmlzaGVkfQ0KKyAgICAgKiBieSB0aGlzIGZvcm1hdHRlci4gIElmIHRoZSBmb3JtYXR0ZXIgaXMgbnVsbCB0aGVuIHJlY29yZCBpcyBmb3JtYXR0ZWQgYnkNCisgICAgICogdGhpcyB7QGxpbmtwbGFpbiAjZm9ybWF0TWVzc2FnZShqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpIGZvcm1hdHRlcn0uDQorICAgICAqIDxsaT57QGNvZGUgdGFpbH0gdGhlDQorICAgICAqIHtAbGlua3BsYWluIEZvcm1hdHRlciNnZXRUYWlsKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpIHRhaWx9IHN0cmluZw0KKyAgICAgKiByZXR1cm5lZCBmcm9tIHRoZSB0YXJnZXQgZm9ybWF0dGVyIGFuZA0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZmluaXNoKGphdmEubGFuZy5TdHJpbmcpIGZpbmlzaGVkfSBieSB0aGlzIGZvcm1hdHRlci4NCisgICAgICogPGxpPntAY29kZSBjb3VudH0gdGhlIHRvdGFsIG51bWJlciBvZiBsb2cgcmVjb3Jkcw0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBieSB0aGlzIGZvcm1hdHRlci4NCisgICAgICogPGxpPntAY29kZSByZW1haW5pbmd9IHRoZSBjb3VudCBtaW51cyBvbmUuDQorICAgICAqIDxsaT57QGNvZGUgdGhyb3dufSB0aGUgdG90YWwgbnVtYmVyIG9mIGxvZyByZWNvcmRzDQorICAgICAqIHtAbGlua3BsYWluICNmb3JtYXQgY29uc3VtZWR9IGJ5IHRoaXMgZm9ybWF0dGVyIHdpdGggYW4gYXNzaWduZWQNCisgICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkI2dldFRocm93biB0aHJvd2FibGV9Lg0KKyAgICAgKiA8bGk+e0Bjb2RlIG5vcm1hbCBtZXNzYWdlc30gdGhlIGNvdW50IG1pbnVzIHRoZSB0aHJvd24uDQorICAgICAqIDxsaT57QGNvZGUgbWluTWlsbGlzfSB0aGUgZWxkZXN0IGxvZyByZWNvcmQNCisgICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkI2dldE1pbGxpcyBldmVudCB0aW1lfQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBieSB0aGlzIGZvcm1hdHRlci4gSWYgdGhlIGNvdW50IGlzIHplcm8NCisgICAgICogdGhlbiB0aGlzIGlzIHNldCB0byB0aGUgcHJldmlvdXMgbWF4IG9yIGFwcHJveGltYXRlIHN0YXJ0IHRpbWUgaWYgdGhlcmUNCisgICAgICogd2FzIG5vIHByZXZpb3VzIG1heC4gQnkgZGVmYXVsdCB0aGlzIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGEgbnVtYmVyLg0KKyAgICAgKiBUaGUgZm9ybWF0IHR5cGUgYW5kIGZvcm1hdCBzdHlsZSBydWxlcyBmcm9tIHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0gc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCB0aGlzIGZyb20NCisgICAgICogbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLg0KKyAgICAgKiA8bGk+e0Bjb2RlIG1heE1pbGxpc30gdGhlIG1vc3QgcmVjZW50IGxvZyByZWNvcmQNCisgICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkI2dldE1pbGxpcyBldmVudCB0aW1lfQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0IGNvbnN1bWVkfSBieSB0aGlzIGZvcm1hdHRlci4gSWYgdGhlIGNvdW50IGlzIHplcm8NCisgICAgICogdGhlbiB0aGlzIGlzIHNldCB0byB0aGUge0BsaW5rcGxhaW4gU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCkgY3VycmVudCB0aW1lfS4NCisgICAgICogQnkgZGVmYXVsdCB0aGlzIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGEgbnVtYmVyLiBUaGUgZm9ybWF0IHR5cGUgYW5kDQorICAgICAqIGZvcm1hdCBzdHlsZSBydWxlcyBmcm9tIHRoZSB7QGxpbmtwbGFpbiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0gc2hvdWxkIGJlDQorICAgICAqIHVzZWQgdG8gY29udmVydCB0aGlzIGZyb20gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLg0KKyAgICAgKiA8bGk+e0Bjb2RlIGVsYXBzZWR9IHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlDQorICAgICAqIHtAY29kZSBtYXhNaWxsaXN9IGFuZCB7QGNvZGUgbWluTWlsbGlzfS4NCisgICAgICogPGxpPntAY29kZSBzdGFydFRpbWV9IHRoZSBhcHByb3hpbWF0ZSBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gIEJ5DQorICAgICAqIGRlZmF1bHQgdGhpcyBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBhIG51bWJlci4gVGhlIGZvcm1hdCB0eXBlIGFuZCBmb3JtYXQNCisgICAgICogc3R5bGUgcnVsZXMgZnJvbSB0aGUge0BsaW5rcGxhaW4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9IHNob3VsZCBiZSB1c2VkIHRvDQorICAgICAqIGNvbnZlcnQgdGhpcyBmcm9tIG1pbGxpc2Vjb25kcyB0byBhIGRhdGUgb3IgdGltZS4NCisgICAgICogPGxpPntAY29kZSBjdXJyZW50VGltZX0gdGhlDQorICAgICAqIHtAbGlua3BsYWluIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpIGN1cnJlbnQgdGltZX0gaW4gbWlsbGlzZWNvbmRzLiAgQnkNCisgICAgICogZGVmYXVsdCB0aGlzIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGEgbnVtYmVyLiBUaGUgZm9ybWF0IHR5cGUgYW5kIGZvcm1hdA0KKyAgICAgKiBzdHlsZSBydWxlcyBmcm9tIHRoZSB7QGxpbmtwbGFpbiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0gc2hvdWxkIGJlIHVzZWQgdG8NCisgICAgICogY29udmVydCB0aGlzIGZyb20gbWlsbGlzZWNvbmRzIHRvIGEgZGF0ZSBvciB0aW1lLg0KKyAgICAgKiA8bGk+e0Bjb2RlIHVwdGltZX0gdGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUNCisgICAgICoge0Bjb2RlIGN1cnJlbnRUaW1lfSBhbmQge0Bjb2RlIHN0YXJ0VGltZX0uDQorICAgICAqIDxsaT57QGNvZGUgZ2VuZXJhdGlvbn0gdGhlIG51bWJlciB0aW1lcyB0aGlzIG1ldGhvZCBwcm9kdWNlZCBvdXRwdXQgd2l0aA0KKyAgICAgKiBhdCBsZWFzdCBvbmUge0BsaW5rcGxhaW4gI2Zvcm1hdCBjb25zdW1lZH0gbG9nIHJlY29yZC4gIFRoaXMgY2FuIGJlIHVzZWQNCisgICAgICogdG8gdHJhY2sgdGhlIG51bWJlciBvZiBjb21wbGV0ZSByZXBvcnRzIHRoaXMgZm9ybWF0dGVyIGhhcyBwcm9kdWNlZC4NCisgICAgICogPC9vbD4NCisgICAgICoNCisgICAgICogPHA+DQorICAgICAqIFNvbWUgZXhhbXBsZSBmb3JtYXRzOjxicj4NCisgICAgICogPHVsPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29sbGVjdG9yRm9ybWF0dGVyLmZvcm1hdD17MH17MX17Mn17NCxjaG9pY2UsLTEjfDAjfDA8Li4uIHs0LG51bWJlcixpbnRlZ2VyfSBtb3JlfVxufQ0KKyAgICAgKiA8cD4NCisgICAgICogVGhpcyBwcmludHMgdGhlIGhlYWQgKHtAY29kZSB7MH19KSwgZm9ybWF0ICh7QGNvZGUgezF9fSksIGFuZCB0YWlsDQorICAgICAqICh7QGNvZGUgezJ9fSkgZnJvbSB0aGUgdGFyZ2V0IGZvcm1hdHRlciBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mDQorICAgICAqIHJlbWFpbmluZyAoe0Bjb2RlIHs0fX0pIGxvZyByZWNvcmRzIGNvbnN1bWVkIGJ5IHRoaXMgZm9ybWF0dGVyIGlmIHRoZXJlDQorICAgICAqIGFyZSBhbnkgcmVtYWluaW5nIHJlY29yZHMuDQorICAgICAqIDxwcmU+DQorICAgICAqIEVuY29kaW5nIGZhaWxlZC58TnVsbFBvaW50ZXJFeGNlcHRpb246IG51bGwgU3RyaW5nLmdldEJ5dGVzKDo5MTMpLi4uIDMgbW9yZQ0KKyAgICAgKiA8L3ByZT4NCisgICAgICogPGxpPntAY29kZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkNvbGxlY3RvckZvcm1hdHRlci5mb3JtYXQ9VGhlc2UgezN9IG1lc3NhZ2VzIG9jY3VycmVkIGJldHdlZW5cbns3LGRhdGUsRUVFLCBNTU0gZGQgSEg6bW06c3M6UyBaWlogeXl5eX0gYW5kIHs4LHRpbWUsRUVFLCBNTU0gZGQgSEg6bW06c3M6UyBaWlogeXl5eX1cbn0NCisgICAgICogPHA+DQorICAgICAqIFRoaXMgcHJpbnRzIHRoZSBjb3VudCAoe0Bjb2RlIHszfX0pIGZvbGxvd2VkIGJ5IHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZQ0KKyAgICAgKiBlbGRlc3QgbG9nIHJlY29yZCAoe0Bjb2RlIHs3fX0pIGFuZCB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnQNCisgICAgICogbG9nIHJlY29yZCAoe0Bjb2RlIHs4fX0pLg0KKyAgICAgKiA8cHJlPg0KKyAgICAgKiBUaGVzZSAyOTIgbWVzc2FnZXMgb2NjdXJyZWQgYmV0d2Vlbg0KKyAgICAgKiBUdWUsIEp1bCAyMSAxNDoxMTo0Mjo0NDkgLTA1MDAgMjAwOSBhbmQgRnJpLCBOb3YgMjAgMDc6Mjk6MjQ6MCAtMDYwMCAyMDA5DQorICAgICAqIDwvcHJlPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29sbGVjdG9yRm9ybWF0dGVyLmZvcm1hdD1UaGVzZSB7M30gbWVzc2FnZXMgb2NjdXJyZWQgYmV0d2VlbiB7OSxjaG9pY2UsODY0MDAwMDAjezcsZGF0ZX0gezcsdGltZX0gYW5kIHs4LHRpbWV9fDg2NDAwMDAwPHs3LGRhdGV9IGFuZCB7OCxkYXRlfX1cbn0NCisgICAgICogPHA+DQorICAgICAqIFRoaXMgcHJpbnRzIHRoZSBjb3VudCAoe0Bjb2RlIHszfX0pIGFuZCB0aGVuIGNob29zZXMgdGhlIGZvcm1hdCBiYXNlZCBvbg0KKyAgICAgKiB0aGUgZWxhcHNlZCB0aW1lICh7QGNvZGUgezl9fSkuIElmIHRoZSBlbGFwc2VkIHRpbWUgaXMgbGVzcyB0aGFuIG9uZSBkYXkNCisgICAgICogdGhlbiB0aGUgZWxkZXN0IGxvZyByZWNvcmQgKHtAY29kZSB7N319KSBkYXRlIGFuZCB0aW1lIGlzIGZvcm1hdHRlZA0KKyAgICAgKiBmb2xsb3dlZCBieSBqdXN0IHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCBsb2cgcmVjb3JkICh7QGNvZGUgezh9fS4NCisgICAgICogT3RoZXJ3aXNlLCB0aGUganVzdCB0aGUgZGF0ZSBvZiB0aGUgZWxkZXN0IGxvZyByZWNvcmQgKHtAY29kZSB7N319KSBhbmQNCisgICAgICoganVzdCB0aGUgZGF0ZSBvZiBtb3N0IHJlY2VudCBsb2cgcmVjb3JkICh7QGNvZGUgezh9fSBpcyBmb3JtYXR0ZWQuDQorICAgICAqIDxwcmU+DQorICAgICAqIFRoZXNlIDczIG1lc3NhZ2VzIG9jY3VycmVkIGJldHdlZW4gSnVsIDIxLCAyMDA5IDI6MTE6NDIgUE0gYW5kIDI6MTM6MzIgUE0NCisgICAgICoNCisgICAgICogVGhlc2UgMTE2IG1lc3NhZ2VzIG9jY3VycmVkIGJldHdlZW4gSnVsIDIxLCAyMDA5IGFuZCBBdWcgMjAsIDIwMDkNCisgICAgICogPC9wcmU+DQorICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db2xsZWN0b3JGb3JtYXR0ZXIuZm9ybWF0PXsxM30gYWxlcnQgcmVwb3J0cyBzaW5jZSB7MTAsZGF0ZX0uXG59DQorICAgICAqIDxwPg0KKyAgICAgKiBUaGlzIHByaW50cyB0aGUgZ2VuZXJhdGlvbiAoe0Bjb2RlIHsxM319KSBmb2xsb3dlZCBieSB0aGUgc3RhcnQgdGltZQ0KKyAgICAgKiAoe0Bjb2RlIHsxMH19KSBmb3JtYXR0ZWQgYXMgYSBkYXRlLg0KKyAgICAgKiA8cHJlPg0KKyAgICAgKiA0LDMyMCBhbGVydCByZXBvcnRzIHNpbmNlIEp1bCAyMSwgMjAxMi4NCisgICAgICogPC9wcmU+DQorICAgICAqIDwvdWw+DQorICAgICAqDQorICAgICAqIEBwYXJhbSBoIHRoZSBoYW5kbGVyIG9yIG51bGwuDQorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBzdHJpbmcuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyBnZXRUYWlsKGZpbmFsIEhhbmRsZXIgaCkgew0KKyAgICAgICAgc3VwZXIuZ2V0VGFpbChoKTsgIC8vQmUgZm9yd2FyZCBjb21wYXRpYmxlIHdpdGggc3VwZXIuZ2V0SGVhZC4NCisgICAgICAgIHJldHVybiBmb3JtYXRSZWNvcmQoaCwgdHJ1ZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIGNvbGxlY3RlZCBMb2dSZWNvcmQgYW5kIHN1bW1hcnkgc3RhdGlzdGljcy4gVGhlIExvZ1JlY29yZCBhbmQNCisgICAgICogc3VtbWFyeSBzdGF0aXN0aWNzIGFyZSBub3QgY2hhbmdlZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJlY29yZCBmb3JtYXR0ZWQgb3IgdGhlIGRlZmF1bHQgdG9TdHJpbmcuDQorICAgICAqIEBzZWUgI2dldFRhaWwoamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcikNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHJlc3VsdDsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0UmVjb3JkKChIYW5kbGVyKSBudWxsLCBmYWxzZSk7DQorICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGlnbm9yZSkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IHN1cGVyLnRvU3RyaW5nKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBVc2VkIHRvIGNob29zZSB0aGUgY29sbGVjdGVkIExvZ1JlY29yZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZQ0KKyAgICAgKiBncmVhdGVyIG9mIHR3byBMb2dSZWNvcmRzLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdCB0aGUgY3VycmVudCByZWNvcmQuDQorICAgICAqIEBwYXJhbSB1IHRoZSByZWNvcmQgdGhhdCBjb3VsZCByZXBsYWNlIHRoZSBjdXJyZW50Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoZSBnaXZlbiBsb2cgcmVjb3Jkcy4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgb2NjdXIgaWYgZWl0aGVyIHJlY29yZCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIExvZ1JlY29yZCBhcHBseShmaW5hbCBMb2dSZWNvcmQgdCwgZmluYWwgTG9nUmVjb3JkIHUpIHsNCisgICAgICAgIGlmICh0ID09IG51bGwgfHwgdSA9PSBudWxsKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoY29tcGFyYXRvciAhPSBudWxsKSB7DQorICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZSh0LCB1KSA+PSAwID8gdCA6IHU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiB1Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb25seSBpZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIG1hdGNoZXMgdGhlDQorICAgICAqIGxhc3QgcmVjb3JkLiAgVGhlIHVwZGF0ZSByZWNvcmQgaXMgbm90IHN0b3JlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGUgdGhlIExvZ1JlY29yZCB0aGF0IGlzIGV4cGVjdGVkLg0KKyAgICAgKiBAcGFyYW0gdSB0aGUgTG9nUmVjb3JkIHVzZWQgdG8gY29sbGVjdCBzdGF0aXN0aWNzLg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxhc3QgcmVjb3JkIHdhcyB0aGUgZXhwZWN0ZWQgcmVjb3JkLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSB1cGRhdGUgcmVjb3JkIGlzIG51bGwuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChmaW5hbCBMb2dSZWNvcmQgZSwgZmluYWwgTG9nUmVjb3JkIHUpIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogTG9nUmVjb3JkIG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjaGVjayBvZiB0aGUgbGFzdCBzdG9yZWQNCisgICAgICAgICAqIHJlY29yZCB0byBndWFyZCBhZ2FpbnN0IHN1YmNsYXNzZXMgb2YgTG9nUmVjb3JkIHRoYXQgbWlnaHQgYXR0ZW1wdCB0bw0KKyAgICAgICAgICogcmVzZXQgdGhlIHN0YXRlIGJ5IHRyaWdnZXJpbmcgYSBjYWxsIHRvIGdldFRhaWwuDQorICAgICAgICAgKi8NCisgICAgICAgIGZpbmFsIGxvbmcgbWlsbGlzID0gdS5nZXRNaWxsaXMoKTsgLy9OdWxsIGNoZWNrLg0KKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGV4ID0gdS5nZXRUaHJvd24oKTsNCisgICAgICAgIGlmIChsYXN0ID09IGUpIHsgIC8vT25seSBpZiB0aGUgZXhhY3Qgc2FtZSByZWZlcmVuY2UuDQorICAgICAgICAgICAgaWYgKCsrY291bnQgIT0gMUwpIHsNCisgICAgICAgICAgICAgICAgbWluTWlsbGlzID0gTWF0aC5taW4obWluTWlsbGlzLCBtaWxsaXMpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vU2hvdyBzaW5nbGUgcmVjb3JkcyBhcyBpbnN0YW50IGFuZCBub3QgYSB0aW1lIHBlcmlvZC4NCisgICAgICAgICAgICAgICAgbWluTWlsbGlzID0gbWlsbGlzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtYXhNaWxsaXMgPSBNYXRoLm1heChtYXhNaWxsaXMsIG1pbGxpcyk7DQorDQorICAgICAgICAgICAgaWYgKGV4ICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgKyt0aHJvd247DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlc2V0cyBhbGwgb2YgdGhlIGNvbGxlY3RlZCBzdW1tYXJ5IHN0YXRpc3RpY3MgaW5jbHVkaW5nIHRoZSBMb2dSZWNvcmQuDQorICAgICAqIEBwYXJhbSBtaW4gdGhlIGN1cnJlbnQgbWluIG1pbGxpc2Vjb25kcy4NCisgICAgICovDQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoZmluYWwgbG9uZyBtaW4pIHsNCisgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsNCisgICAgICAgICAgICBsYXN0ID0gbnVsbDsNCisgICAgICAgICAgICArK2dlbmVyYXRpb247DQorICAgICAgICB9DQorDQorICAgICAgICBjb3VudCA9IDBMOw0KKyAgICAgICAgdGhyb3duID0gMEw7DQorICAgICAgICBtaW5NaWxsaXMgPSBtaW47DQorICAgICAgICBtYXhNaWxsaXMgPSBMb25nLk1JTl9WQUxVRTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRm9ybWF0cyB0aGUgZ2l2ZW4gcmVjb3JkIHdpdGggdGhlIGhlYWQgYW5kIHRhaWwuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBoIHRoZSBIYW5kbGVyIG9yIG51bGwuDQorICAgICAqIEBwYXJhbSByZXNldCB0cnVlIGlmIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIExvZ1JlY29yZCBzaG91bGQgYmUgcmVzZXQNCisgICAgICogYmFjayB0byBpbml0aWFsIHZhbHVlcy4NCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZy4NCisgICAgICogQHNlZSAjZ2V0VGFpbChqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyKQ0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0UmVjb3JkKGZpbmFsIEhhbmRsZXIgaCwgZmluYWwgYm9vbGVhbiByZXNldCkgew0KKyAgICAgICAgZmluYWwgTG9nUmVjb3JkIHJlY29yZDsNCisgICAgICAgIGZpbmFsIGxvbmcgYzsNCisgICAgICAgIGZpbmFsIGxvbmcgdDsNCisgICAgICAgIGZpbmFsIGxvbmcgZzsNCisgICAgICAgIGxvbmcgbXNsOw0KKyAgICAgICAgbG9uZyBtc2g7DQorICAgICAgICBsb25nIG5vdzsNCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgew0KKyAgICAgICAgICAgIHJlY29yZCA9IGxhc3Q7DQorICAgICAgICAgICAgYyA9IGNvdW50Ow0KKyAgICAgICAgICAgIGcgPSBnZW5lcmF0aW9uOw0KKyAgICAgICAgICAgIHQgPSB0aHJvd247DQorICAgICAgICAgICAgbXNsID0gbWluTWlsbGlzOw0KKyAgICAgICAgICAgIG1zaCA9IG1heE1pbGxpczsNCisgICAgICAgICAgICBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisgICAgICAgICAgICBpZiAoYyA9PSAwTCkgew0KKyAgICAgICAgICAgICAgICBtc2ggPSBub3c7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChyZXNldCkgeyAvL0JVRyBJRCA2MzUxNjg1DQorICAgICAgICAgICAgICAgIHJlc2V0KG1zaCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWQ7DQorICAgICAgICBmaW5hbCBTdHJpbmcgbXNnOw0KKyAgICAgICAgZmluYWwgU3RyaW5nIHRhaWw7DQorICAgICAgICBmaW5hbCBGb3JtYXR0ZXIgZiA9IHRoaXMuZm9ybWF0dGVyOw0KKyAgICAgICAgaWYgKGYgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZikgew0KKyAgICAgICAgICAgICAgICBoZWFkID0gZi5nZXRIZWFkKGgpOw0KKyAgICAgICAgICAgICAgICBtc2cgPSByZWNvcmQgIT0gbnVsbCA/IGYuZm9ybWF0KHJlY29yZCkgOiAiIjsNCisgICAgICAgICAgICAgICAgdGFpbCA9IGYuZ2V0VGFpbChoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGhlYWQgPSAiIjsNCisgICAgICAgICAgICBtc2cgPSByZWNvcmQgIT0gbnVsbCA/IGZvcm1hdE1lc3NhZ2UocmVjb3JkKSA6ICIiOw0KKyAgICAgICAgICAgIHRhaWwgPSAiIjsNCisgICAgICAgIH0NCisNCisgICAgICAgIExvY2FsZSBsID0gbnVsbDsNCisgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gcmVjb3JkLmdldFJlc291cmNlQnVuZGxlKCk7DQorICAgICAgICAgICAgbCA9IHJiID09IG51bGwgPyBudWxsIDogcmIuZ2V0TG9jYWxlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBNZXNzYWdlRm9ybWF0IG1mOw0KKyAgICAgICAgaWYgKGwgPT0gbnVsbCkgeyAvL0JVRyBJRCA4MDM5MTY1DQorICAgICAgICAgICAgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChmbXQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KGZtdCwgbCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZXNlIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBnZXRUYWlsIGRvY3VtZW50YXRpb24uDQorICAgICAgICAgKi8NCisgICAgICAgIHJldHVybiBtZi5mb3JtYXQobmV3IE9iamVjdFtde2ZpbmlzaChoZWFkKSwgZmluaXNoKG1zZyksIGZpbmlzaCh0YWlsKSwNCisgICAgICAgICAgICBjLCAoYyAtIDFMKSwgdCwgKGMgLSB0KSwgbXNsLCBtc2gsIChtc2ggLSBtc2wpLCBJTklUX1RJTUUsIG5vdywNCisgICAgICAgICAgICAobm93IC0gSU5JVF9USU1FKSwgZ30pOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBcHBsaWVkIHRvIHRoZSBoZWFkLCBmb3JtYXQsIGFuZCB0YWlsIHJldHVybmVkIGJ5IHRoZSB0YXJnZXQgZm9ybWF0dGVyLg0KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHRyaW1zIGFsbCBpbnB1dCBzdHJpbmdzLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIHRyYW5zZm9ybS4NCisgICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtZWQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgbnVsbC4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBTdHJpbmcgZmluaXNoKFN0cmluZyBzKSB7DQorICAgICAgICByZXR1cm4gcy50cmltKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFBlZWsgYXQgdGhlIGN1cnJlbnQgbG9nIHJlY29yZC4NCisgICAgICoNCisgICAgICogQHJldHVybiBudWxsIG9yIHRoZSBjdXJyZW50IGxvZyByZWNvcmQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBMb2dSZWNvcmQgcGVlaygpIHsNCisgICAgICAgIHJldHVybiB0aGlzLmxhc3Q7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBhbmQgc3RvcmVzIGdpdmVuIExvZ1JlY29yZCBpZiB0aGUgZXhwZWN0ZWQNCisgICAgICogcmVjb3JkIG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVjb3JkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZSB0aGUgZXhwZWN0ZWQgcmVjb3JkLg0KKyAgICAgKiBAcGFyYW0gdSB0aGUgdXBkYXRlIHJlY29yZC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZC4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgdXBkYXRlIHJlY29yZCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NlcHRBbmRVcGRhdGUoTG9nUmVjb3JkIGUsIExvZ1JlY29yZCB1KSB7DQorICAgICAgICBpZiAoYWNjZXB0KGUsIHUpKSB7DQorICAgICAgICAgICAgdGhpcy5sYXN0ID0gdTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlIGZvcm1hdCBzdHJpbmcgZnJvbSB0aGUgTG9nTWFuYWdlciBvciBjcmVhdGVzIHRoZSBkZWZhdWx0DQorICAgICAqIG1lc3NhZ2UgZm9ybWF0IHN0cmluZy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHAgdGhlIGNsYXNzIG5hbWUgcHJlZml4Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5pdEZvcm1hdChmaW5hbCBTdHJpbmcgcCkgew0KKyAgICAgICAgU3RyaW5nIHYgPSBmcm9tTG9nTWFuYWdlcihwLmNvbmNhdCgiLmZvcm1hdCIpKTsNCisgICAgICAgIGlmICh2ID09IG51bGwgfHwgdi5sZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICAgICAgdiA9ICJ7MH17MX17Mn17NCxjaG9pY2UsLTEjfDAjfDA8Li4uIHs0LG51bWJlcixpbnRlZ2VyfSBtb3JlfVxuIjsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB2Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIGFuZCBjcmVhdGVzIHRoZSBmb3JtYXR0ZXIgZnJvbSB0aGUgTG9nTWFuYWdlciBvciBjcmVhdGVzIHRoZSBkZWZhdWx0DQorICAgICAqIGZvcm1hdHRlci4NCisgICAgICoNCisgICAgICogQHBhcmFtIHAgdGhlIGNsYXNzIG5hbWUgcHJlZml4Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZXIuDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIG51bGwuDQorICAgICAqIEB0aHJvd3MgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBpZiB0aGUgZm9ybWF0dGVyIGNhbiBub3QgYmUgY3JlYXRlZC4NCisgICAgICovDQorICAgIHByaXZhdGUgRm9ybWF0dGVyIGluaXRGb3JtYXR0ZXIoZmluYWwgU3RyaW5nIHApIHsNCisgICAgICAgIEZvcm1hdHRlciBmOw0KKyAgICAgICAgU3RyaW5nIHYgPSBmcm9tTG9nTWFuYWdlcihwLmNvbmNhdCgiLmZvcm1hdHRlciIpKTsNCisgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5sZW5ndGgoKSAhPSAwKSB7DQorICAgICAgICAgICAgaWYgKCEibnVsbCIuZXF1YWxzSWdub3JlQ2FzZSh2KSkgew0KKyAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgZiA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLm5ld0Zvcm1hdHRlcih2KTsNCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiByZSkgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmU7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbihlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGYgPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgLy9Eb24ndCBmb3JjZSB0aGUgYnl0ZSBjb2RlIHZlcmlmaWVyIHRvIGxvYWQgdGhlIGZvcm1hdHRlci4NCisgICAgICAgICAgICBmID0gRm9ybWF0dGVyLmNsYXNzLmNhc3QobmV3IENvbXBhY3RGb3JtYXR0ZXIoKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyBhbmQgY3JlYXRlcyB0aGUgY29tcGFyYXRvciBmcm9tIHRoZSBMb2dNYW5hZ2VyIG9yIHJldHVybnMgdGhlDQorICAgICAqIGRlZmF1bHQgY29tcGFyYXRvci4NCisgICAgICoNCisgICAgICogQHBhcmFtIHAgdGhlIGNsYXNzIG5hbWUgcHJlZml4Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wYXJhdG9yIG9yIG51bGwuDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGl0IHdhcyBzcGVjaWZpZWQgdGhhdCB0aGUgY29tcGFyYXRvcg0KKyAgICAgKiBzaG91bGQgYmUgcmV2ZXJzZWQgYnV0IG5vIGluaXRpYWwgY29tcGFyYXRvciB3YXMgc3BlY2lmaWVkLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBudWxsLg0KKyAgICAgKiBAdGhyb3dzIFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24gaWYgdGhlIGNvbXBhcmF0b3IgY2FuIG5vdCBiZQ0KKyAgICAgKiBjcmVhdGVkLg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIHByaXZhdGUgQ29tcGFyYXRvcjw/IHN1cGVyIExvZ1JlY29yZD4gaW5pdENvbXBhcmF0b3IoZmluYWwgU3RyaW5nIHApIHsNCisgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBMb2dSZWNvcmQ+IGM7DQorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuY29tcGFyYXRvciIpKTsNCisgICAgICAgIGZpbmFsIFN0cmluZyByZXZlcnNlID0gZnJvbUxvZ01hbmFnZXIocC5jb25jYXQoIi5jb21wYXJhdG9yLnJldmVyc2UiKSk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSAhPSAwKSB7DQorICAgICAgICAgICAgICAgIGlmICghIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGMgPSBMb2dNYW5hZ2VyUHJvcGVydGllcy5uZXdDb21wYXJhdG9yKG5hbWUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHJldmVyc2UpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGMgIT0gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gTG9nTWFuYWdlclByb3BlcnRpZXMucmV2ZXJzZU9yZGVyKGMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY29tcGFyYXRvciB0byByZXZlcnNlLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsgLy9ObyBvcmRlcmluZy4NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb21wYXJhdG9yIHRvIHJldmVyc2UuIik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAvL0Rvbid0IGZvcmNlIHRoZSBieXRlIGNvZGUgdmVyaWZpZXIgdG8gbG9hZCB0aGUgY29tcGFyYXRvci4NCisgICAgICAgICAgICAgICAgICAgIGMgPSBDb21wYXJhdG9yLmNsYXNzLmNhc3QoU2V2ZXJpdHlDb21wYXJhdG9yLmdldEluc3RhbmNlKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiByZSkgew0KKyAgICAgICAgICAgIHRocm93IHJlOyAvL0F2b2lkIGNhdGNoIGFsbC4NCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24oZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYzsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9Db21wYWN0Rm9ybWF0dGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9Db21wYWN0Rm9ybWF0dGVyLmphdmEKaW5kZXggZDUwNDIxOS4uNWMzODQ2MyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvQ29tcGFjdEZvcm1hdHRlci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL0NvbXBhY3RGb3JtYXR0ZXIuamF2YQpAQCAtMSw4MzkgKzEsODg5IEBACi0vKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLSAqCi0gKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogTW9kaWZpY2F0aW9uczoKLSAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gKgotICogQ29udHJpYnV0b3Iocyk6Ci0gKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICogaG9sZGVyLgotICovCi1wYWNrYWdlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7Ci0KLS8qKgotICogQSBwbGFpbiB0ZXh0IGZvcm1hdHRlciB0aGF0IGNhbiBwcm9kdWNlIGZpeGVkIHdpZHRoIG91dHB1dC4gQnkgZGVmYXVsdCB0aGlzCi0gKiBmb3JtYXR0ZXIgd2lsbCBwcm9kdWNlIG91dHB1dCBubyBncmVhdGVyIHRoYW4gMTYwIGNoYXJhY3RlcnMgd2lkZSBwbHVzIHRoZQotICogc2VwYXJhdG9yIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnMuIE9ubHkgc3BlY2lmaWVkIGZpZWxkcyBzdXBwb3J0IGFuCi0gKiB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmaXhlZCB3aWR0aCBmb3JtYXQuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQgZWFjaCA8dHQ+Q29tcGFjdEZvcm1hdHRlcjwvdHQ+IGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZQotICogZm9sbG93aW5nIExvZ01hbmFnZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHdoZXJlCi0gKiA8dHQ+Jmx0O2Zvcm1hdHRlci1uYW1lJmd0OzwvdHQ+IHJlZmVycyB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IKLSAqIHRoZSBmdWxseSBxdWFsaWZpZWQgZGVyaXZlZCBjbGFzcyBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIuICBJZiBwcm9wZXJ0aWVzIGFyZQotICogbm90IGRlZmluZWQsIG9yIGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMsIHRoZW4gdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcyBhcmUKLSAqIHVzZWQuCi0gKiA8dWw+Ci0gKiA8bGk+Jmx0O2Zvcm1hdHRlci1uYW1lJmd0Oy5mb3JtYXQgLSB0aGUge0BsaW5rcGxhaW4gamF2YS51dGlsLkZvcm1hdHRlcgotICogICAgIGZvcm1hdH0gc3RyaW5nIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBvdXRwdXQuIFRoZSBmb3JtYXQgc3RyaW5nIGNhbiBiZQotICogdXNlZCB0byBmaXggdGhlIG91dHB1dCBzaXplLiAoZGVmYXVsdHMgdG8gPHR0PiU3JCMuMTYwcyVuPC90dD4pPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQGF1dGhvciBKYXNvbiBNZWhyZW5zCi0gKiBAc2luY2UgSmF2YU1haWwgMS41LjIKLSAqLwotcHVibGljIGNsYXNzIENvbXBhY3RGb3JtYXR0ZXIgZXh0ZW5kcyBqYXZhLnV0aWwubG9nZ2luZy5Gb3JtYXR0ZXIgewotICAgIC8qKgotICAgICAqIExvYWQgYW55IGRlY2xhcmVkIGNsYXNzZXMgdG8gd29ya2Fyb3VuZCBHTEFTU0ZJU0gtMjEyNTguCi0gICAgICovCi0gICAgc3RhdGljIHsKLSAgICAgICAgbG9hZERlY2xhcmVkQ2xhc3NlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gbG9hZCBkZWNsYXJlZCBjbGFzc2VzIGVuY2FzZSBjbGFzcyBsb2FkZXIgZG9lc24ndCBhbGxvdyBsb2FkaW5nCi0gICAgICogZHVyaW5nIEpWTSB0ZXJtaW5hdGlvbi4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2l0aCB1bml0IHRlc3RpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzZXMgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PltdIGxvYWREZWNsYXJlZENsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xhc3M8Pz5bXXtBbHRlcm5hdGUuY2xhc3N9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhvbGRzIHRoZSBqYXZhLnV0aWwuRm9ybWF0dGVyIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZm10OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB3aXRoIGEgZGVmYXVsdCBmb3JtYXQgcGF0dGVybi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFjdEZvcm1hdHRlcigpIHsKLSAgICAgICAgU3RyaW5nIHAgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5mbXQgPSBpbml0Rm9ybWF0KHApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0IHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSB7QGxpbmtwbGFpbiBqYXZhLnV0aWwuRm9ybWF0dGVyIHBhdHRlcm59IG9yIG51bGwgdG8gdXNlCi0gICAgICogdGhlIExvZ01hbmFnZXIgZGVmYXVsdC4gVGhlIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGluIHRoZQotICAgICAqIHtAbGlua3BsYWluICNmb3JtYXQoamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKSBmb3JtYXR9IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tcGFjdEZvcm1hdHRlcihmaW5hbCBTdHJpbmcgZm9ybWF0KSB7Ci0gICAgICAgIFN0cmluZyBwID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIHRoaXMuZm10ID0gZm9ybWF0ID09IG51bGwgPyBpbml0Rm9ybWF0KHApIDogZm9ybWF0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdCB0aGUgZ2l2ZW4gbG9nIHJlY29yZCBhbmQgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZy4gVGhlCi0gICAgICoge0BsaW5rcGxhaW4gamF2YS51dGlsLkZvcm1hdHRlciNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKLSAgICAgKiBqYXZhLnV0aWx9IGFyZ3VtZW50IGluZGV4ZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLSAgICAgKgotICAgICAqIDxvbCBzdGFydD0nMCc+Ci0gICAgICogPGxpPntAY29kZSBmb3JtYXR9IC0gdGhlIHtAbGlua3BsYWluIGphdmEudXRpbC5Gb3JtYXR0ZXIKLSAgICAgKiAgICAgamF2YS51dGlsLkZvcm1hdHRlcn0gZm9ybWF0IHN0cmluZyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogJmx0O2Zvcm1hdHRlci1uYW1lJmd0Oy5mb3JtYXQgcHJvcGVydHkgb3IgdGhlIGZvcm1hdCB0aGF0IHdhcyBnaXZlbiB3aGVuCi0gICAgICogdGhpcyBmb3JtYXR0ZXIgd2FzIGNyZWF0ZWQuPC9saT4KLSAgICAgKiA8bGk+e0Bjb2RlIGRhdGV9IC0gaWYgdGhlIGxvZyByZWNvcmQgc3VwcG9ydHMgbmFub3NlY29uZHMgdGhlbiBhCi0gICAgICogICAgIFpvbmVkRGF0ZVRpbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGltZSBvZiB0aGUgbG9nIHJlY29yZCBpbgotICAgICAqICAgICB0aGUgc3lzdGVtIHRpbWUgem9uZS4gT3RoZXJ3aXNlLCBhIHtAbGlua3BsYWluIERhdGV9IG9iamVjdAotICAgICAqICAgICByZXByZXNlbnRpbmcge0BsaW5rcGxhaW4gTG9nUmVjb3JkI2dldE1pbGxpcyBldmVudCB0aW1lfSBvZiB0aGUgbG9nCi0gICAgICogICAgIHJlY29yZC48L2xpPgotICAgICAqIDxsaT57QGNvZGUgc291cmNlfSAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2FsbGVyLCBpZiBhdmFpbGFibGU7Ci0gICAgICogb3RoZXJ3aXNlLCB0aGUgbG9nZ2VyJ3MgbmFtZS48L2xpPgotICAgICAqIDxsaT57QGNvZGUgbG9nZ2VyfSAtIHRoZSBsb2dnZXIncwotICAgICAqIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRMb2dnZXJOYW1lKCkgbmFtZX0uPC9saT4KLSAgICAgKiA8bGk+e0Bjb2RlIGxldmVsfSAtIHRoZQotICAgICAqIHtAbGlua3BsYWluIGphdmEudXRpbC5sb2dnaW5nLkxldmVsI2dldExvY2FsaXplZE5hbWUgbG9nIGxldmVsfS48L2xpPgotICAgICAqIDxsaT57QGNvZGUgbWVzc2FnZX0gLSB0aGUgZm9ybWF0dGVkIGxvZyBtZXNzYWdlIHJldHVybmVkIGZyb20gdGhlCi0gICAgICoge0BsaW5rcGxhaW4gI2Zvcm1hdE1lc3NhZ2UoTG9nUmVjb3JkKX0gbWV0aG9kLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSB0aHJvd259IC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQotICAgICAqIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRUaHJvd24gdGhyb3dhYmxlfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZyByZWNvcmQKLSAgICAgKiBhbmQgYSByZWxldmFudCBzdGFjayB0cmFjZSBlbGVtZW50IGlmIGF2YWlsYWJsZTsgb3RoZXJ3aXNlLCBhbiBlbXB0eQotICAgICAqIHN0cmluZyBpcyB1c2VkLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSBtZXNzYWdlfHRocm93bn0gVGhlIG1lc3NhZ2UgYW5kIHRoZSB0aHJvd24gcHJvcGVydGllcyBqb2luZWQKLSAgICAgKiBhcyBvbmUgcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBzdXBwb3J0cwotICAgICAqIHtAbGlua3BsYWluICN0b0FsdGVybmF0ZShqYXZhLmxhbmcuU3RyaW5nKSBhbHRlcm5hdGV9IGZvcm0uPC9saT4KLSAgICAgKiA8bGk+e0Bjb2RlIHRocm93bnxtZXNzYWdlfSBUaGUgdGhyb3duIGFuZCBtZXNzYWdlIHByb3BlcnRpZXMgam9pbmVkIGFzCi0gICAgICogb25lIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgc3VwcG9ydHMKLSAgICAgKiB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSBzZXF1ZW5jZX0gdGhlCi0gICAgICoge0BsaW5rcGxhaW4gTG9nUmVjb3JkI2dldFNlcXVlbmNlTnVtYmVyKCkgc2VxdWVuY2UgbnVtYmVyfSBpZiB0aGUgZ2l2ZW4KLSAgICAgKiBsb2cgcmVjb3JkLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSB0aHJlYWQgaWR9IHRoZSB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0VGhyZWFkSUQoKSB0aHJlYWQgaWR9Ci0gICAgICogb2YgdGhlIGdpdmVuIGxvZyByZWNvcmQuICBCeSBkZWZhdWx0IHRoaXMgaXMgZm9ybWF0dGVkIGFzIGEge0Bjb2RlIGxvbmd9Ci0gICAgICogYnkgYW4gdW5zaWduZWQgY29udmVyc2lvbi48L2xpPgotICAgICAqIDxsaT57QGNvZGUgZXJyb3J9IHRoZSB0aHJvd2FibGUgc2ltcGxlIGNsYXNzIG5hbWUgYW5kCi0gICAgICoge0BsaW5rcGxhaW4gI2Zvcm1hdEVycm9yKExvZ1JlY29yZCkgZXJyb3IgbWVzc2FnZX0gd2l0aG91dCBhbnkKLSAgICAgKiBzdGFjayB0cmFjZS48L2xpPgotICAgICAqIDxsaT57QGNvZGUgbWVzc2FnZXxlcnJvcn0gVGhlIG1lc3NhZ2UgYW5kIGVycm9yIHByb3BlcnRpZXMgam9pbmVkIGFzCi0gICAgICogb25lIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgc3VwcG9ydHMKLSAgICAgKiB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSBlcnJvcnxtZXNzYWdlfSBUaGUgZXJyb3IgYW5kIG1lc3NhZ2UgcHJvcGVydGllcyBqb2luZWQgYXMKLSAgICAgKiBvbmUgcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBzdXBwb3J0cwotICAgICAqIHtAbGlua3BsYWluICN0b0FsdGVybmF0ZShqYXZhLmxhbmcuU3RyaW5nKSBhbHRlcm5hdGV9IGZvcm0uPC9saT4KLSAgICAgKiA8bGk+e0Bjb2RlIGJhY2t0cmFjZX0gb25seSB0aGUKLSAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0QmFja1RyYWNlKExvZ1JlY29yZCkgc3RhY2sgdHJhY2V9IG9mIHRoZSBnaXZlbgotICAgICAqIHRocm93YWJsZS48L2xpPgotICAgICAqIDxsaT57QGNvZGUgYnVuZGxlbmFtZX0gdGhlIHJlc291cmNlIGJ1bmRsZQotICAgICAqIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSBuYW1lfSBvZiB0aGUgZ2l2ZW4gbG9nCi0gICAgICogcmVjb3JkLjwvbGk+Ci0gICAgICogPGxpPntAY29kZSBrZXl9IHRoZSB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0TWVzc2FnZSgpIHJhdyBtZXNzYWdlfQotICAgICAqIGJlZm9yZSBsb2NhbGl6YXRpb24gb3IgZm9ybWF0dGluZy48L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICoKLSAgICAgKiA8cD4KLSAgICAgKiBTb21lIGV4YW1wbGUgZm9ybWF0czo8YnI+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD0lNyQjLjE2MHMlbn0KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHByaW50cyBvbmx5IDE2MCBjaGFyYWN0ZXJzIG9mIHRoZSBtZXNzYWdlfHRocm93biAoe0Bjb2RlIDckfSkgdXNpbmcKLSAgICAgKiB0aGUge0BsaW5rcGxhaW4gI3RvQWx0ZXJuYXRlKGphdmEubGFuZy5TdHJpbmcpIGFsdGVybmF0ZX0gZm9ybS4gVGhlCi0gICAgICogc2VwYXJhdG9yIGlzIG5vdCBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSB0b3RhbCB3aWR0aC4KLSAgICAgKiA8cHJlPgotICAgICAqIEVuY29kaW5nIGZhaWxlZC58TnVsbFBvaW50ZXJFeGNlcHRpb246IG51bGwgU3RyaW5nLmdldEJ5dGVzKDo5MTMpCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiA8bGk+e0Bjb2RlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29tcGFjdEZvcm1hdHRlci5mb3JtYXQ9JTckIy4yMHMlbn0KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHByaW50cyBvbmx5IDIwIGNoYXJhY3RlcnMgb2YgdGhlIG1lc3NhZ2V8dGhyb3duICh7QGNvZGUgNyR9KSB1c2luZwotICAgICAqIHRoZSB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLiAgVGhpcwotICAgICAqIHdpbGwgcGVyZm9ybSBhIHdlaWdodGVkIHRydW5jYXRpb24gb2YgYm90aCB0aGUgbWVzc2FnZSBhbmQgdGhyb3duCi0gICAgICogcHJvcGVydGllcyBvZiB0aGUgbG9nIHJlY29yZC4gIFRoZSBzZXBhcmF0b3IgaXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YKLSAgICAgKiB0aGUgdG90YWwgd2lkdGguCi0gICAgICogPHByZT4KLSAgICAgKiBFbmNvZGluZ3xOdWxsUG9pbnRlckUKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD0lMSR0YyAlMiRzJW4lNCRzOiAlNSRzJTYkcyVufQotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJpbnRzIHRoZSB0aW1lc3RhbXAgKHtAY29kZSAxJH0pIGFuZCB0aGUgc291cmNlICh7QGNvZGUgMiR9KSBvbiB0aGUKLSAgICAgKiBmaXJzdCBsaW5lLiBUaGUgc2Vjb25kIGxpbmUgaXMgdGhlIGxvZyBsZXZlbCAoe0Bjb2RlIDQkfSksIGxvZyBtZXNzYWdlCi0gICAgICogKHtAY29kZSA1JH0pLCBhbmQgdGhlIHRocm93YWJsZSB3aXRoIGEgcmVsZXZhbnQgc3RhY2sgdHJhY2UgZWxlbWVudAotICAgICAqICh7QGNvZGUgNiR9KSBpZiBvbmUgaXMgYXZhaWxhYmxlLgotICAgICAqIDxwcmU+Ci0gICAgICogRnJpIE5vdiAyMCAwNzoyOToyNCBDU1QgMjAwOSBNeUNsYXNzIGZhdGFsCi0gICAgICogU0VWRVJFOiBFbmNvZGluZyBmYWlsZWQuTnVsbFBvaW50ZXJFeGNlcHRpb246IG51bGwgU3RyaW5nLmdldEJ5dGVzKDo5MTMpCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiA8bGk+e0Bjb2RlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29tcGFjdEZvcm1hdHRlci5mb3JtYXQ9JTQkczogJTEyJCMuMTYwcyVufQotICAgICAqIDxwPgotICAgICAqIFRoaXMgcHJpbnRzIHRoZSBsb2cgbGV2ZWwgKHtAY29kZSA0JH0pIGFuZCBvbmx5IDE2MCBjaGFyYWN0ZXJzIG9mIHRoZQotICAgICAqIG1lc3NhZ2V8ZXJyb3IgKHtAY29kZSAxMiR9KSB1c2luZyB0aGUgYWx0ZXJuYXRlIGZvcm0uCi0gICAgICogPHByZT4KLSAgICAgKiBTRVZFUkU6IFVuYWJsZSB0byBzZW5kIG5vdGlmaWNhdGlvbi58U29ja2V0RXhjZXB0aW9uOiBQZXJtaXNzaW9uIGRlbmllZDogY29ubmVjdAotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogPGxpPntAY29kZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkNvbXBhY3RGb3JtYXR0ZXIuZm9ybWF0PVslOSRkXVslMSR0VF1bJTEwJGRdWyUyJHNdICU1JHMlbiU2JHMlbn0KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHByaW50cyB0aGUgc2VxdWVuY2UgKHtAY29kZSA5JH0pLCBldmVudCB0aW1lICh7QGNvZGUgMSR9KSBhcwotICAgICAqIDI0IGhvdXIgdGltZSwgdGhyZWFkIGlkICh7QGNvZGUgMTAkfSksIHNvdXJjZSAoe0Bjb2RlIDIkfSksIGxvZyBtZXNzYWdlCi0gICAgICogKHtAY29kZSA1JH0pLCBhbmQgdGhlIHRocm93YWJsZSB3aXRoIGJhY2sgdHJhY2UgKHtAY29kZSA2JH0pLgotICAgICAqIDxwcmU+Ci0gICAgICogWzEyNV1bMTQ6MTE6NDJdWzM4XVtNeUNsYXNzIGZhdGFsXSBVbmFibGUgdG8gc2VuZCBub3RpZmljYXRpb24uCi0gICAgICogU29ja2V0RXhjZXB0aW9uOiBQZXJtaXNzaW9uIGRlbmllZDogY29ubmVjdCBTTVRQVHJhbnNwb3J0Lm9wZW5TZXJ2ZXIoOjE5NDkpCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgbG9nIHJlY29yZCB0byBmb3JtYXQuCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHJlY29yZC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgIC8vTG9nUmVjb3JkIGlzIG11dGFibGUgc28gZGVmaW5lIGxvY2FsIHZhcnMuCi0gICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gcmVjb3JkLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgIExvY2FsZSBsID0gcmIgPT0gbnVsbCA/IG51bGwgOiByYi5nZXRMb2NhbGUoKTsKLQotICAgICAgICBTdHJpbmcgbXNnID0gZm9ybWF0TWVzc2FnZShyZWNvcmQpOwotICAgICAgICBTdHJpbmcgdGhyb3duID0gZm9ybWF0VGhyb3duKHJlY29yZCk7Ci0gICAgICAgIFN0cmluZyBlcnIgPSBmb3JtYXRFcnJvcihyZWNvcmQpOwotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSB7Ci0gICAgICAgICAgICBmb3JtYXRab25lZERhdGVUaW1lKHJlY29yZCksCi0gICAgICAgICAgICBmb3JtYXRTb3VyY2UocmVjb3JkKSwKLSAgICAgICAgICAgIGZvcm1hdExvZ2dlck5hbWUocmVjb3JkKSwKLSAgICAgICAgICAgIGZvcm1hdExldmVsKHJlY29yZCksCi0gICAgICAgICAgICBtc2csCi0gICAgICAgICAgICB0aHJvd24sCi0gICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKG1zZywgdGhyb3duKSwKLSAgICAgICAgICAgIG5ldyBBbHRlcm5hdGUodGhyb3duLCBtc2cpLAotICAgICAgICAgICAgcmVjb3JkLmdldFNlcXVlbmNlTnVtYmVyKCksCi0gICAgICAgICAgICBmb3JtYXRUaHJlYWRJRChyZWNvcmQpLAotICAgICAgICAgICAgZXJyLAotICAgICAgICAgICAgbmV3IEFsdGVybmF0ZShtc2csIGVyciksCi0gICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKGVyciwgbXNnKSwKLSAgICAgICAgICAgIGZvcm1hdEJhY2tUcmFjZShyZWNvcmQpLAotICAgICAgICAgICAgcmVjb3JkLmdldFJlc291cmNlQnVuZGxlTmFtZSgpLAotICAgICAgICAgICAgcmVjb3JkLmdldE1lc3NhZ2UoKX07Ci0KLSAgICAgICAgaWYgKGwgPT0gbnVsbCkgeyAvL0JVRyBJRCA2MjgyMDk0Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChmbXQsIHBhcmFtcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChsLCBmbXQsIHBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIG1lc3NhZ2UgZm9yIHRoZSBsb2cgcmVjb3JkLiBUaGlzIG1ldGhvZCByZW1vdmVzIGFueSBmdWxseQotICAgICAqIHF1YWxpZmllZCB0aHJvd2FibGUgY2xhc3MgbmFtZXMgZnJvbSB0aGUgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWNvcmQgdGhlIGxvZyByZWNvcmQuCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG1lc3NhZ2Ugc3RyaW5nLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBzdXBlci5mb3JtYXRNZXNzYWdlKHJlY29yZCk7Ci0gICAgICAgIG1zZyA9IHJlcGxhY2VDbGFzc05hbWUobXNnLCByZWNvcmQuZ2V0VGhyb3duKCkpOwotICAgICAgICBtc2cgPSByZXBsYWNlQ2xhc3NOYW1lKG1zZywgcmVjb3JkLmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgbWVzc2FnZSBmcm9tIHRoZSB0aHJvd24gcHJvcGVydHkgb2YgdGhlIGxvZyByZWNvcmQuIFRoaXMKLSAgICAgKiBtZXRob2QgcmVtb3ZlcyBhbnkgZnVsbHkgcXVhbGlmaWVkIHRocm93YWJsZSBjbGFzcyBuYW1lcyBmcm9tIHRoZSBtZXNzYWdlCi0gICAgICogY2F1c2UgY2hhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIHRvIGZvcm1hdCBvciBudWxsLgotICAgICAqIEByZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsIHdhcyBnaXZlbiBvciB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKiBzdHJpbmcgZnJvbSB0aGUgdGhyb3dhYmxlIHdoaWNoIG1heSBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShmaW5hbCBUaHJvd2FibGUgdCkgewotICAgICAgICByZXR1cm4gdCAhPSBudWxsID8gcmVwbGFjZUNsYXNzTmFtZShhcHBseSh0KS5nZXRNZXNzYWdlKCksIHQpIDogIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgbGV2ZWwgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGxvZyByZWNvcmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIGxvZ2dlciBuYW1lLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0TGV2ZWwoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICByZXR1cm4gcmVjb3JkLmdldExldmVsKCkuZ2V0TG9jYWxpemVkTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHNvdXJjZSBmcm9tIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugb2YgdGhlIGxvZyByZWNvcmQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXRTb3VyY2UoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICBTdHJpbmcgc291cmNlID0gcmVjb3JkLmdldFNvdXJjZUNsYXNzTmFtZSgpOwotICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0U291cmNlTWV0aG9kTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSBzaW1wbGVDbGFzc05hbWUoc291cmNlKSArICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyByZWNvcmQuZ2V0U291cmNlTWV0aG9kTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSBzaW1wbGVDbGFzc05hbWUoc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHNpbXBsZUNsYXNzTmFtZShyZWNvcmQuZ2V0TG9nZ2VyTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIGxvZ2dlciBuYW1lIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBsb2dnZXIgbmFtZS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdExvZ2dlck5hbWUoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICByZXR1cm4gc2ltcGxlQ2xhc3NOYW1lKHJlY29yZC5nZXRMb2dnZXJOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHRocmVhZCBpZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbG9nIHJlY29yZC4gIEJ5IGRlZmF1bHQgdGhpcwotICAgICAqIGlzIGZvcm1hdHRlZCBhcyBhIHtAY29kZSBsb25nfSBieSBhbiB1bnNpZ25lZCBjb252ZXJzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCB0aHJlYWQgaWQgYXMgYSBudW1iZXIuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICogQHNpbmNlIEphdmFNYWlsIDEuNS40Ci0gICAgICovCi0gICAgcHVibGljIE51bWJlciBmb3JtYXRUaHJlYWRJRChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaHJlYWQuZ2V0SUQgaXMgZGVmaW5lZCBhcyBsb25nIGFuZCBMb2dSZWNvcmQuZ2V0VGhyZWFkSUQgaXMgZGVmaW5lZAotICAgICAgICAgKiBhcyBpbnQuICBDb252ZXJ0IHRvIHVuc2lnbmVkIGFzIGEgbWVhbnMgdG8gYmV0dGVyIG1hcCB0aGUgdHdvIHR5cGVzCi0gICAgICAgICAqIG9mIHRocmVhZCBpZGVudGlmaWVycy4KLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiAoKChsb25nKSByZWNvcmQuZ2V0VGhyZWFkSUQoKSkgJiAweGZmZmZmZmZmTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyB0aGUgdGhyb3duIHByb3BlcnR5IG9mIGEgTG9nUmVjb3JkLiBUaGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwKLSAgICAgKiBjb250YWluIGEgdGhyb3dhYmxlIG1lc3NhZ2Ugd2l0aCBhIGJhY2sgdHJhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuCi0gICAgICogQHJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgdGhyb3duIG9yIGZvcm1hdHRlZCBzdHJpbmcuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICogQHNlZSAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICAgKiBAc2VlICNmb3JtYXRCYWNrVHJhY2UoamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0VGhyb3duKGZpbmFsIExvZ1JlY29yZCByZWNvcmQpIHsKLSAgICAgICAgU3RyaW5nIG1zZzsKLSAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSByZWNvcmQuZ2V0VGhyb3duKCk7Ci0gICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzaXRlID0gZm9ybWF0QmFja1RyYWNlKHJlY29yZCk7Ci0gICAgICAgICAgICBtc2cgPSBmb3JtYXRUb1N0cmluZyh0KSArIChpc051bGxPclNwYWNlcyhzaXRlKSA/ICIiIDogJyAnICsgc2l0ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2cgPSAiIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIHRocm93biBwcm9wZXJ0eSBvZiBhIExvZ1JlY29yZCBhcyBhbiBlcnJvciBtZXNzYWdlLiBUaGUKLSAgICAgKiByZXR1cm5lZCBzdHJpbmcgd2lsbCBub3QgY29udGFpbiBhIGJhY2sgdHJhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuCi0gICAgICogQHJldHVybiBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgdGhyb3duIG9yIGZvcm1hdHRlZCBzdHJpbmcuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICogQHNlZSBUaHJvd2FibGUjdG9TdHJpbmcoKQotICAgICAqIEBzZWUgI2FwcGx5KGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAgICogQHNlZSAjZm9ybWF0TWVzc2FnZShqYXZhLmxhbmcuVGhyb3dhYmxlKQotICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuNAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0RXJyb3IoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICBUaHJvd2FibGUgdCA9IHJlY29yZC5nZXRUaHJvd24oKTsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFRvU3RyaW5nKHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgb2YgdGhlIHJlZHVjZWQgdGhyb3dhYmxlIGFuZCBtZXNzYWdlIG9mCi0gICAgICogdGhlIHJlZHVjZWQgdGhyb3dhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHQgdGhlIGdpdmVuIHRocm93YWJsZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgdGhyb3dhYmxlLgotICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuNAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZ2l2ZW4gdGhyb3dhYmxlIGlzIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0VG9TdHJpbmcoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgcmV0dXJuIHNpbXBsZUNsYXNzTmFtZShhcHBseSh0KS5nZXRDbGFzcygpKSArICI6ICIgKyBmb3JtYXRNZXNzYWdlKHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgdGhlIGJhY2sgdHJhY2UgZm9yIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgbG9nIHJlY29yZCB0byBmb3JtYXQuCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIGJhY2sgdHJhY2UuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICogQHNlZSAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICAgKiBAc2VlICNmb3JtYXRUaHJvd24oamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKQotICAgICAqIEBzZWUgI2lnbm9yZShqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXRCYWNrVHJhY2UoTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICBTdHJpbmcgc2l0ZSA9ICIiOwotICAgICAgICBmaW5hbCBUaHJvd2FibGUgdCA9IHJlY29yZC5nZXRUaHJvd24oKTsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBhcHBseSh0KTsKLSAgICAgICAgICAgIHNpdGUgPSBmaW5kQW5kRm9ybWF0KHJvb3QuZ2V0U3RhY2tUcmFjZSgpKTsKLSAgICAgICAgICAgIGlmIChpc051bGxPclNwYWNlcyhzaXRlKSkgewotICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChUaHJvd2FibGUgYyA9IHQ7IGMgIT0gbnVsbDsgYyA9IGMuZ2V0Q2F1c2UoKSkgewotICAgICAgICAgICAgICAgICAgICBzaXRlID0gZmluZEFuZEZvcm1hdChjLmdldFN0YWNrVHJhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNOdWxsT3JTcGFjZXMoc2l0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9EZWFsIHdpdGggZXhjZXNzaXZlIGNhdXNlIGNoYWlucwotICAgICAgICAgICAgICAgICAgICAvL2FuZCBjeWNsaWMgdGhyb3dhYmxlcy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCsrbGltaXQgPT0gKDEgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy9HaXZlIHVwLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGFuZCBmb3JtYXRzIHRoZSBmaXJzdCBzdGFjayBmcmFtZSBvZiBpbnRlcmVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFjZSB0aGUgZmlsbCBzdGFjayB0byBleGFtaW5lLgotICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdGhhdCBiZXN0IGRlc2NyaWJlcyB0aGUgY2FsbCBzaXRlLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBhcnJheSBpcyBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZpbmRBbmRGb3JtYXQoU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZSkgewotICAgICAgICBTdHJpbmcgc2l0ZSA9ICIiOwotICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHMgOiB0cmFjZSkgewotICAgICAgICAgICAgaWYgKCFpZ25vcmUocykpIHsKLSAgICAgICAgICAgICAgICBzaXRlID0gZm9ybWF0U3RhY2tUcmFjZUVsZW1lbnQocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NoZWNrIGlmIGFsbCBjb2RlIHdhcyBjb21waWxlZCB3aXRoIG5vIGRlYnVnZ2luZyBpbmZvLgotICAgICAgICBpZiAoaXNOdWxsT3JTcGFjZXMoc2l0ZSkpIHsKLSAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgcyA6IHRyYWNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZWZhdWx0SWdub3JlKHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpdGUgPSBmb3JtYXRTdGFja1RyYWNlRWxlbWVudChzKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHMgYSBzdGFjayB0cmFjZSBlbGVtZW50IGludG8gYSBzaW1wbGUgY2FsbCBzaXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHN0YWNrIHRyYWNlIGVsZW1lbnQgdG8gZm9ybWF0LgotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzdGFjayB0cmFjZSBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBpcyBudWxsLgotICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0U3RhY2tUcmFjZUVsZW1lbnQoZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgcykgewotICAgICAgICBTdHJpbmcgdiA9IHNpbXBsZUNsYXNzTmFtZShzLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgaWYgKHYgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcy50b1N0cmluZygpLnJlcGxhY2Uocy5nZXRDbGFzc05hbWUoKSwgdik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0lmIHRoZSBjbGFzcyBuYW1lIGNvbnRhaW5zIHRoZSBzaW1wbGUgZmlsZSBuYW1lIHRoZW4gcmVtb3ZlIGZpbGUgbmFtZS4KLSAgICAgICAgdiA9IHNpbXBsZUZpbGVOYW1lKHMuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwgJiYgcmVzdWx0LnN0YXJ0c1dpdGgodikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHMuZ2V0RmlsZU5hbWUoKSwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hvb3NlcyBhIHNpbmdsZSB0aHJvd2FibGUgZnJvbSB0aGUgY2F1c2UgY2hhaW4gdGhhdCB3aWxsIGJlIGZvcm1hdHRlZC4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNob29zZXMgdGhlIHRocm93YWJsZSB0aGF0IGJlc3QgZGVzY3JpYmVzIHRoZSBjaGFpbi4KLSAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaG9vc2UgYW4gYWx0ZXJuYXRlIHRocm93YWJsZSBmb3IKLSAgICAgKiBmb3JtYXR0aW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHQgdGhlIHRocm93YWJsZSBmcm9tIHRoZSBsb2cgcmVjb3JkLgotICAgICAqIEByZXR1cm4gdGhlIGNob3NlbiB0aHJvd2FibGUgb3IgbnVsbCBvbmx5IGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBudWxsLgotICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRocm93YWJsZSBhcHBseShmaW5hbCBUaHJvd2FibGUgdCkgewotICAgICAgICByZXR1cm4gU2V2ZXJpdHlDb21wYXJhdG9yLmdldEluc3RhbmNlKCkuYXBwbHkodCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIGZyYW1lIHNob3VsZCBiZSBpZ25vcmVkIGFzIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdGFjayB0cmFjZSBlbGVtZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGZyYW1lIHNob3VsZCBiZSBpZ25vcmVkLgotICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlKFN0YWNrVHJhY2VFbGVtZW50IHMpIHsKLSAgICAgICAgcmV0dXJuIGlzVW5rbm93bihzKSB8fCBkZWZhdWx0SWdub3JlKHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGFsdGVybmF0ZSBmb3JtYXQuICBUaGlzIGltcGxlbWVudGF0aW9uIHJlbW92ZXMgYWxsIGNvbnRyb2wKLSAgICAgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIGFueSBzdHJpbmcgb3IgbnVsbC4KLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGFyZ3VtZW50IHdhcyBudWxsIG90aGVyd2lzZSwgYW4gYWx0ZXJuYXRlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzICE9IG51bGwgPyBzLnJlcGxhY2VBbGwoIltcXHgwMC1cXHgxRlxceDdGXSsiLCAiIikgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHpvbmVkIGRhdGUgdGltZSBmcm9tIHRoZSBnaXZlbiBsb2cgcmVjb3JkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZCB0aGUgY3VycmVudCBsb2cgcmVjb3JkLgotICAgICAqIEByZXR1cm4gYSB6b25lZCBkYXRlIHRpbWUgb3IgYSBsZWdhY3kgZGF0ZSBvYmplY3QuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuCi0gICAgICogQHNpbmNlIEphdmFNYWlsIDEuNS42Ci0gICAgICovCi0gICAgcHJpdmF0ZSBDb21wYXJhYmxlPD8+IGZvcm1hdFpvbmVkRGF0ZVRpbWUoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgewotICAgICAgICBDb21wYXJhYmxlPD8+IHpkdCA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLmdldFpvbmVkRGF0ZVRpbWUocmVjb3JkKTsKLSAgICAgICAgaWYgKHpkdCA9PSBudWxsKSB7Ci0gICAgICAgICAgIHpkdCA9IG5ldyBqYXZhLnV0aWwuRGF0ZShyZWNvcmQuZ2V0TWlsbGlzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB6ZHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIGZyYW1lIHNob3VsZCBiZSBpZ25vcmVkIGFzIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGRvZXMgbm90IGNoZWNrIGZvciB1bmtub3duIGxpbmUgbnVtYmVycyBiZWNhdXNlIGNvZGUgY2FuIGJlIGNvbXBpbGVkCi0gICAgICogd2l0aG91dCBkZWJ1Z2dpbmcgaW5mby4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdGFjayB0cmFjZSBlbGVtZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGZyYW1lIHNob3VsZCBiZSBpZ25vcmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0SWdub3JlKFN0YWNrVHJhY2VFbGVtZW50IHMpIHsKLSAgICAgICAgcmV0dXJuIGlzU3ludGhldGljKHMpIHx8IGlzU3RhdGljVXRpbGl0eShzKSB8fCBpc1JlZmxlY3Rpb24ocyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIGZyYW1lIGlzIGZvciBhIHN0YXRpYyB1dGlsaXR5IGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHN0YWNrIHRyYWNlIGVsZW1lbnQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZnJhbWUgc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljVXRpbGl0eShmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gTG9nTWFuYWdlclByb3BlcnRpZXMuaXNTdGF0aWNVdGlsaXR5Q2xhc3Mocy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGlnbm9yZSkgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbiA9IHMuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIHJldHVybiAoY24uZW5kc1dpdGgoInMiKSAmJiAhY24uZW5kc1dpdGgoImVzIikpCi0gICAgICAgICAgICAgICAgfHwgY24uY29udGFpbnMoIlV0aWwiKSB8fCBjbi5lbmRzV2l0aCgiVGhyb3dhYmxlcyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgYSBzdGFjayB0cmFjZSBlbGVtZW50IGlzIGZvciBhIHN5bnRoZXRpYyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyB0aGUgc3RhY2sgdHJhY2UgZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3ludGhldGljLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBpcyBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYyhmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7Ci0gICAgICAgIHJldHVybiBzLmdldE1ldGhvZE5hbWUoKS5pbmRleE9mKCckJykgPiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIGEgc3RhY2sgdHJhY2UgZWxlbWVudCBoYXMgYW4gdW5rbm93biBsaW5lIG51bWJlciBvciBhCi0gICAgICogbmF0aXZlIGxpbmUgbnVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHN0YWNrIHRyYWNlIGVsZW1lbnQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBpcyBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Vua25vd24oZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgcykgewotICAgICAgICByZXR1cm4gcy5nZXRMaW5lTnVtYmVyKCkgPCAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgYSBzdGFjayB0cmFjZSBlbGVtZW50IHJlcHJlc2VudHMgYSByZWZsZWN0aW9uIGZyYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIHN0YWNrIHRyYWNlIGVsZW1lbnQuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBpcyBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlZmxlY3Rpb24oZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIExvZ01hbmFnZXJQcm9wZXJ0aWVzLmlzUmVmbGVjdGlvbkNsYXNzKHMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcy5nZXRDbGFzc05hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmcucmVmbGVjdC4iKQotICAgICAgICAgICAgICAgIHx8IHMuZ2V0Q2xhc3NOYW1lKCkuc3RhcnRzV2l0aCgic3VuLnJlZmxlY3QuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZm9ybWF0IHBhdHRlcm4gZm9yIHRoaXMgZm9ybWF0dGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHAgdGhlIGNsYXNzIG5hbWUgcHJlZml4LgotICAgICAqIEByZXR1cm4gdGhlIGphdmEudXRpbC5Gb3JtYXR0ZXIgZm9ybWF0IHN0cmluZy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjbGFzcyBuYW1lIGlzIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW5pdEZvcm1hdChmaW5hbCBTdHJpbmcgcCkgewotICAgICAgICBTdHJpbmcgdiA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLmZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuZm9ybWF0IikpOwotICAgICAgICBpZiAoaXNOdWxsT3JTcGFjZXModikpIHsKLSAgICAgICAgICAgIHYgPSAiJTckIy4xNjBzJW4iOyAvLzE2MCBjaGFycyBzcGxpdCBiZXR3ZWVuIG1lc3NhZ2UgYW5kIHRocm93bi4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBmb3IgYWxsIGluc3RhbmNlcyBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgICAqIHdpdGggc2ltcGxlIGNsYXNzIG5hbWUgYmFzZWQgb2ZmIG9mIHRoZSB0eXBlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuCi0gICAgICogcGFyYW1ldGVyIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIGNhdXNlIGNoYWluIHRvIHNlYXJjaCBvciBudWxsLgotICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIG1lc3NhZ2Ugc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlQ2xhc3NOYW1lKFN0cmluZyBtc2csIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmICghaXNOdWxsT3JTcGFjZXMobXNnKSkgewotICAgICAgICAgICAgaW50IGxpbWl0ID0gMDsKLSAgICAgICAgICAgIGZvciAoVGhyb3dhYmxlIGMgPSB0OyBjICE9IG51bGw7IGMgPSBjLmdldENhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrID0gYy5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKGsuZ2V0TmFtZSgpLCBzaW1wbGVDbGFzc05hbWUoaykpOwotCi0gICAgICAgICAgICAgICAgLy9EZWFsIHdpdGggZXhjZXNzaXZlIGNhdXNlIGNoYWlucyBhbmQgY3ljbGljIHRocm93YWJsZXMuCi0gICAgICAgICAgICAgICAgaWYgKCsrbGltaXQgPT0gKDEgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvL0dpdmUgdXAuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhlIGdpdmVuIG1lc3NhZ2UgZm9yIGFsbCBpbnN0YW5jZXMgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgKiB3aXRoIHNpbXBsZSBjbGFzcyBuYW1lIGJhc2VkIG9mZiBvZiB0aGUgdHlwZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbgotICAgICAqIHBhcmFtZXRlciBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2Ugb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gcCB0aGUgcGFyYW1ldGVyIGFycmF5IG9yIG51bGwuCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgbWVzc2FnZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VDbGFzc05hbWUoU3RyaW5nIG1zZywgT2JqZWN0W10gcCkgewotICAgICAgICBpZiAoIWlzTnVsbE9yU3BhY2VzKG1zZykgJiYgcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogcCkgewotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gayA9IG8uZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2Uoay5nZXROYW1lKCksIHNpbXBsZUNsYXNzTmFtZShrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotICAgICAqIEJVRyBJRCBKREstODA1NzkxOS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrIHRoZSBjbGFzcyBvYmplY3QuCi0gICAgICogQHJldHVybiB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgb3IgbnVsbC4KLSAgICAgKiBAc2luY2UgSmF2YU1haWwgMS41LjMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2ltcGxlQ2xhc3NOYW1lKGZpbmFsIENsYXNzPD8+IGspIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBrLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJuYWxFcnJvciBKREs4MDU3OTE5KSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbXBsZUNsYXNzTmFtZShrLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byBhIHNpbXBsZSBjbGFzcyBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIG51bGwuCi0gICAgICogQHJldHVybiB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2ltcGxlQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIG5hbWUgPSBpbmRleCA+IC0xID8gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmaWxlIG5hbWUgd2l0aCBhbiBleHRlbnNpb24gdG8gYSBmaWxlIG5hbWUgd2l0aG91dCBhbgotICAgICAqIGV4dGVuc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmdWxsIGZpbGUgbmFtZSBvciBudWxsLgotICAgICAqIEByZXR1cm4gdGhlIHNpbXBsZSBmaWxlIG5hbWUgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2ltcGxlRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgbmFtZSA9IGluZGV4ID4gLTEgPyBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgOiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaXMgdGhlIGdpdmVuIHN0cmluZyBpcyBudWxsIG9yIHNwYWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgb3IgbnVsbC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbnVsbCBvciBzcGFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc051bGxPclNwYWNlcyhmaW5hbCBTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gcyA9PSBudWxsIHx8IHMudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBmb3JtYXQgdHdvIGFyZ3VtZW50cyBhcyBmaXhlZCBsZW5ndGggbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEFsdGVybmF0ZSBpbXBsZW1lbnRzIGphdmEudXRpbC5Gb3JtYXR0YWJsZSB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsZWZ0IHNpZGUgb2YgdGhlIG91dHB1dC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxlZnQ7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmlnaHQgc2lkZSBvZiB0aGUgb3V0cHV0LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmlnaHQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gYWx0ZXJuYXRlIG91dHB1dC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgc2lkZSBvciBudWxsLgotICAgICAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IHNpZGUgb3IgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbGVmdCwgZmluYWwgU3RyaW5nIHJpZ2h0KSB7Ci0gICAgICAgICAgICB0aGlzLmxlZnQgPSBTdHJpbmcudmFsdWVPZihsZWZ0KTsKLSAgICAgICAgICAgIHRoaXMucmlnaHQgPSBTdHJpbmcudmFsdWVPZihyaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygib3ZlcnJpZGUiKSAvL0pESy02OTU0MjM0Ci0gICAgICAgIHB1YmxpYyB2b2lkIGZvcm1hdFRvKGphdmEudXRpbC5Gb3JtYXR0ZXIgZm9ybWF0dGVyLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgcHJlY2lzaW9uKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsID0gbGVmdDsKLSAgICAgICAgICAgIFN0cmluZyByID0gcmlnaHQ7Ci0gICAgICAgICAgICBpZiAoKGZsYWdzICYgamF2YS51dGlsLkZvcm1hdHRhYmxlRmxhZ3MuVVBQRVJDQVNFKQotICAgICAgICAgICAgICAgICAgICA9PSBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5VUFBFUkNBU0UpIHsKLSAgICAgICAgICAgICAgICBsID0gbC50b1VwcGVyQ2FzZShmb3JtYXR0ZXIubG9jYWxlKCkpOwotICAgICAgICAgICAgICAgIHIgPSByLnRvVXBwZXJDYXNlKGZvcm1hdHRlci5sb2NhbGUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5BTFRFUk5BVEUpCi0gICAgICAgICAgICAgICAgICAgID09IGphdmEudXRpbC5Gb3JtYXR0YWJsZUZsYWdzLkFMVEVSTkFURSkgewotICAgICAgICAgICAgICAgIGwgPSB0b0FsdGVybmF0ZShsKTsKLSAgICAgICAgICAgICAgICByID0gdG9BbHRlcm5hdGUocik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVjaXNpb24gPD0gMCkgewotICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgZmVuY2UgPSBNYXRoLm1pbihsLmxlbmd0aCgpLCBwcmVjaXNpb24pOwotICAgICAgICAgICAgaWYgKGZlbmNlID4gKHByZWNpc2lvbiA+PiAxKSkgewotICAgICAgICAgICAgICAgIGZlbmNlID0gTWF0aC5tYXgoZmVuY2UgLSByLmxlbmd0aCgpLCBmZW5jZSA+PiAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZlbmNlID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmZW5jZSA+IGwubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUobC5jaGFyQXQoZmVuY2UgLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLS1mZW5jZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbCA9IGwuc3Vic3RyaW5nKDAsIGZlbmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHIgPSByLnN1YnN0cmluZygwLCBNYXRoLm1pbihwcmVjaXNpb24gLSBmZW5jZSwgci5sZW5ndGgoKSkpOwotCi0gICAgICAgICAgICBpZiAod2lkdGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhhbGYgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgIGlmIChsLmxlbmd0aCgpIDwgaGFsZikgewotICAgICAgICAgICAgICAgICAgICBsID0gcGFkKGZsYWdzLCBsLCBoYWxmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoci5sZW5ndGgoKSA8IGhhbGYpIHsKLSAgICAgICAgICAgICAgICAgICAgciA9IHBhZChmbGFncywgciwgaGFsZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RbXSBlbXB0eSA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCkudG9BcnJheSgpOwotICAgICAgICAgICAgZm9ybWF0dGVyLmZvcm1hdChsLCBlbXB0eSk7Ci0gICAgICAgICAgICBpZiAobC5sZW5ndGgoKSAhPSAwICYmIHIubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlci5mb3JtYXQoInwiLCBlbXB0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JtYXR0ZXIuZm9ybWF0KHIsIGVtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYWQgdGhlIGdpdmVuIGlucHV0IHN0cmluZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZsYWdzIHRoZSBmb3JtYXR0ZXIgZmxhZ3MuCi0gICAgICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gcGFkLgotICAgICAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBmaW5hbCBzdHJpbmcgbGVuZ3RoLgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYWRkZWQgc3RyaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFkKGludCBmbGFncywgU3RyaW5nIHMsIGludCBsZW5ndGgpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWRkaW5nID0gbGVuZ3RoIC0gcy5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoKGZsYWdzICYgamF2YS51dGlsLkZvcm1hdHRhYmxlRmxhZ3MuTEVGVF9KVVNUSUZZKQotICAgICAgICAgICAgICAgICAgICA9PSBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5MRUZUX0pVU1RJRlkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXHUwMDIwJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGIuYXBwZW5kKHMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXHUwMDIwJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KKy8qDQorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4NCisgKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VDQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQNCisgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQ0KKyAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbg0KKyAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQ0KKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMNCisgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqDQorICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gNCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuDQorICoNCisgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoNCisgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIg0KKyAqIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQ0KKyAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuDQorICoNCisgKiBNb2RpZmljYXRpb25zOg0KKyAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzDQorICogZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246DQorICogIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSINCisgKg0KKyAqIENvbnRyaWJ1dG9yKHMpOg0KKyAqIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcg0KKyAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdDQorICogZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMDQorICogVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQ0KKyAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCisgKiBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8NCisgKiBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUNCisgKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzDQorICogb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQNCisgKiBob2xkZXIuDQorICovDQorcGFja2FnZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOw0KKw0KKy8qKg0KKyAqIEEgcGxhaW4gdGV4dCBmb3JtYXR0ZXIgdGhhdCBjYW4gcHJvZHVjZSBmaXhlZCB3aWR0aCBvdXRwdXQuIEJ5IGRlZmF1bHQgdGhpcw0KKyAqIGZvcm1hdHRlciB3aWxsIHByb2R1Y2Ugb3V0cHV0IG5vIGdyZWF0ZXIgdGhhbiAxNjAgY2hhcmFjdGVycyB3aWRlIHBsdXMgdGhlDQorICogc2VwYXJhdG9yIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnMuIE9ubHkgc3BlY2lmaWVkIGZpZWxkcyBzdXBwb3J0IGFuDQorICoge0BsaW5rcGxhaW4gI3RvQWx0ZXJuYXRlKGphdmEubGFuZy5TdHJpbmcpIGFsdGVybmF0ZX0gZml4ZWQgd2lkdGggZm9ybWF0Lg0KKyAqIDxwPg0KKyAqIEJ5IGRlZmF1bHQgZWFjaCA8dHQ+Q29tcGFjdEZvcm1hdHRlcjwvdHQ+IGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZSBmb2xsb3dpbmcNCisgKiBMb2dNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB3aGVyZQ0KKyAqIDx0dD4mbHQ7Zm9ybWF0dGVyLW5hbWUmZ3Q7PC90dD4gcmVmZXJzIHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvcg0KKyAqIHRoZSBmdWxseSBxdWFsaWZpZWQgZGVyaXZlZCBjbGFzcyBuYW1lIG9mIHRoZSBmb3JtYXR0ZXIuIElmIHByb3BlcnRpZXMgYXJlDQorICogbm90IGRlZmluZWQsIG9yIGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMsIHRoZW4gdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcyBhcmUNCisgKiB1c2VkLg0KKyAqIDx1bD4NCisgKiA8bGk+Jmx0O2Zvcm1hdHRlci1uYW1lJmd0Oy5mb3JtYXQgLSB0aGUge0BsaW5rcGxhaW4gamF2YS51dGlsLkZvcm1hdHRlcg0KKyAqICAgICBmb3JtYXR9IHN0cmluZyB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgb3V0cHV0LiBUaGUgZm9ybWF0IHN0cmluZyBjYW4gYmUNCisgKiB1c2VkIHRvIGZpeCB0aGUgb3V0cHV0IHNpemUuIChkZWZhdWx0cyB0byA8dHQ+JTckIy4xNjBzJW48L3R0Pik8L2xpPg0KKyAqIDwvdWw+DQorICoNCisgKiBAYXV0aG9yIEphc29uIE1laHJlbnMNCisgKiBAc2luY2UgSmF2YU1haWwgMS41LjINCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcGFjdEZvcm1hdHRlciBleHRlbmRzIGphdmEudXRpbC5sb2dnaW5nLkZvcm1hdHRlciB7DQorDQorICAgIC8qKg0KKyAgICAgKiBMb2FkIGFueSBkZWNsYXJlZCBjbGFzc2VzIHRvIHdvcmthcm91bmQgR0xBU1NGSVNILTIxMjU4Lg0KKyAgICAgKi8NCisgICAgc3RhdGljIHsNCisgICAgICAgIGxvYWREZWNsYXJlZENsYXNzZXMoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVXNlZCB0byBsb2FkIGRlY2xhcmVkIGNsYXNzZXMgZW5jYXNlIGNsYXNzIGxvYWRlciBkb2Vzbid0IGFsbG93IGxvYWRpbmcNCisgICAgICogZHVyaW5nIEpWTSB0ZXJtaW5hdGlvbi4gVGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoIHVuaXQgdGVzdGluZy4NCisgICAgICoNCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc2VzIG5ldmVyIG51bGwuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PltdIGxvYWREZWNsYXJlZENsYXNzZXMoKSB7DQorICAgICAgICByZXR1cm4gbmV3IENsYXNzPD8+W117QWx0ZXJuYXRlLmNsYXNzfTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSG9sZHMgdGhlIGphdmEudXRpbC5Gb3JtYXR0ZXIgcGF0dGVybi4NCisgICAgICovDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZtdDsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCBhIGRlZmF1bHQgZm9ybWF0IHBhdHRlcm4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ29tcGFjdEZvcm1hdHRlcigpIHsNCisgICAgICAgIFN0cmluZyBwID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQorICAgICAgICB0aGlzLmZtdCA9IGluaXRGb3JtYXQocCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0IHBhdHRlcm4uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIHtAbGlua3BsYWluIGphdmEudXRpbC5Gb3JtYXR0ZXIgcGF0dGVybn0gb3IgbnVsbCB0byB1c2UNCisgICAgICogdGhlIExvZ01hbmFnZXIgZGVmYXVsdC4gVGhlIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGluIHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0KGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkgZm9ybWF0fSBtZXRob2QuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ29tcGFjdEZvcm1hdHRlcihmaW5hbCBTdHJpbmcgZm9ybWF0KSB7DQorICAgICAgICBTdHJpbmcgcCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOw0KKyAgICAgICAgdGhpcy5mbXQgPSBmb3JtYXQgPT0gbnVsbCA/IGluaXRGb3JtYXQocCkgOiBmb3JtYXQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdCB0aGUgZ2l2ZW4gbG9nIHJlY29yZCBhbmQgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHN0cmluZy4gVGhlDQorICAgICAqIHtAbGlua3BsYWluIGphdmEudXRpbC5Gb3JtYXR0ZXIjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pDQorICAgICAqIGphdmEudXRpbH0gYXJndW1lbnQgaW5kZXhlcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOg0KKyAgICAgKg0KKyAgICAgKiA8b2wgc3RhcnQ9JzAnPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGZvcm1hdH0gLSB0aGUge0BsaW5rcGxhaW4gamF2YS51dGlsLkZvcm1hdHRlcg0KKyAgICAgKiAgICAgamF2YS51dGlsLkZvcm1hdHRlcn0gZm9ybWF0IHN0cmluZyBzcGVjaWZpZWQgaW4gdGhlDQorICAgICAqICZsdDtmb3JtYXR0ZXItbmFtZSZndDsuZm9ybWF0IHByb3BlcnR5IG9yIHRoZSBmb3JtYXQgdGhhdCB3YXMgZ2l2ZW4gd2hlbg0KKyAgICAgKiB0aGlzIGZvcm1hdHRlciB3YXMgY3JlYXRlZC48L2xpPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGRhdGV9IC0gaWYgdGhlIGxvZyByZWNvcmQgc3VwcG9ydHMgbmFub3NlY29uZHMgdGhlbiBhDQorICAgICAqIFpvbmVkRGF0ZVRpbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGltZSBvZiB0aGUgbG9nIHJlY29yZCBpbiB0aGUNCisgICAgICogc3lzdGVtIHRpbWUgem9uZS4gT3RoZXJ3aXNlLCBhIHtAbGlua3BsYWluIERhdGV9IG9iamVjdCByZXByZXNlbnRpbmcNCisgICAgICoge0BsaW5rcGxhaW4gTG9nUmVjb3JkI2dldE1pbGxpcyBldmVudCB0aW1lfSBvZiB0aGUgbG9nIHJlY29yZC48L2xpPg0KKyAgICAgKiA8bGk+e0Bjb2RlIHNvdXJjZX0gLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNhbGxlciwgaWYgYXZhaWxhYmxlOw0KKyAgICAgKiBvdGhlcndpc2UsIHRoZSBsb2dnZXIncyBuYW1lLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgbG9nZ2VyfSAtIHRoZSBsb2dnZXIncw0KKyAgICAgKiB7QGxpbmtwbGFpbiBDbGFzcyNnZXRTaW1wbGVOYW1lKCkgc2ltcGxlfQ0KKyAgICAgKiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0TG9nZ2VyTmFtZSgpIG5hbWV9LjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgbGV2ZWx9IC0gdGhlDQorICAgICAqIHtAbGlua3BsYWluIGphdmEudXRpbC5sb2dnaW5nLkxldmVsI2dldExvY2FsaXplZE5hbWUgbG9nIGxldmVsfS48L2xpPg0KKyAgICAgKiA8bGk+e0Bjb2RlIG1lc3NhZ2V9IC0gdGhlIGZvcm1hdHRlZCBsb2cgbWVzc2FnZSByZXR1cm5lZCBmcm9tIHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0TWVzc2FnZShMb2dSZWNvcmQpfSBtZXRob2QuPC9saT4NCisgICAgICogPGxpPntAY29kZSB0aHJvd259IC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0VGhyb3duIHRocm93YWJsZX0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2cgcmVjb3JkDQorICAgICAqIGFuZCBhIHJlbGV2YW50IHN0YWNrIHRyYWNlIGVsZW1lbnQgaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UsIGFuIGVtcHR5DQorICAgICAqIHN0cmluZyBpcyB1c2VkLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgbWVzc2FnZXx0aHJvd259IFRoZSBtZXNzYWdlIGFuZCB0aGUgdGhyb3duIHByb3BlcnRpZXMgam9pbmVkDQorICAgICAqIGFzIG9uZSBwYXJhbWV0ZXIuIFRoaXMgcGFyYW1ldGVyIHN1cHBvcnRzDQorICAgICAqIHtAbGlua3BsYWluICN0b0FsdGVybmF0ZShqYXZhLmxhbmcuU3RyaW5nKSBhbHRlcm5hdGV9IGZvcm0uPC9saT4NCisgICAgICogPGxpPntAY29kZSB0aHJvd258bWVzc2FnZX0gVGhlIHRocm93biBhbmQgbWVzc2FnZSBwcm9wZXJ0aWVzIGpvaW5lZCBhcw0KKyAgICAgKiBvbmUgcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBzdXBwb3J0cw0KKyAgICAgKiB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgc2VxdWVuY2V9IHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0U2VxdWVuY2VOdW1iZXIoKSBzZXF1ZW5jZSBudW1iZXJ9IGlmIHRoZSBnaXZlbg0KKyAgICAgKiBsb2cgcmVjb3JkLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgdGhyZWFkIGlkfSB0aGUge0BsaW5rcGxhaW4gTG9nUmVjb3JkI2dldFRocmVhZElEKCkgdGhyZWFkIGlkfQ0KKyAgICAgKiBvZiB0aGUgZ2l2ZW4gbG9nIHJlY29yZC4gQnkgZGVmYXVsdCB0aGlzIGlzIGZvcm1hdHRlZCBhcyBhIHtAY29kZSBsb25nfQ0KKyAgICAgKiBieSBhbiB1bnNpZ25lZCBjb252ZXJzaW9uLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgZXJyb3J9IHRoZSB0aHJvd2FibGUNCisgICAgICoge0BsaW5rcGxhaW4gQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpIHNpbXBsZSBjbGFzcyBuYW1lfSBhbmQNCisgICAgICoge0BsaW5rcGxhaW4gI2Zvcm1hdEVycm9yKExvZ1JlY29yZCkgZXJyb3IgbWVzc2FnZX0gd2l0aG91dCBhbnkgc3RhY2sNCisgICAgICogdHJhY2UuPC9saT4NCisgICAgICogPGxpPntAY29kZSBtZXNzYWdlfGVycm9yfSBUaGUgbWVzc2FnZSBhbmQgZXJyb3IgcHJvcGVydGllcyBqb2luZWQgYXMgb25lDQorICAgICAqIHBhcmFtZXRlci4gVGhpcyBwYXJhbWV0ZXIgc3VwcG9ydHMNCisgICAgICoge0BsaW5rcGxhaW4gI3RvQWx0ZXJuYXRlKGphdmEubGFuZy5TdHJpbmcpIGFsdGVybmF0ZX0gZm9ybS48L2xpPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGVycm9yfG1lc3NhZ2V9IFRoZSBlcnJvciBhbmQgbWVzc2FnZSBwcm9wZXJ0aWVzIGpvaW5lZCBhcyBvbmUNCisgICAgICogcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBzdXBwb3J0cw0KKyAgICAgKiB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLjwvbGk+DQorICAgICAqIDxsaT57QGNvZGUgYmFja3RyYWNlfSBvbmx5IHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjZm9ybWF0QmFja1RyYWNlKExvZ1JlY29yZCkgc3RhY2sgdHJhY2V9IG9mIHRoZSBnaXZlbg0KKyAgICAgKiB0aHJvd2FibGUuPC9saT4NCisgICAgICogPGxpPntAY29kZSBidW5kbGVuYW1lfSB0aGUgcmVzb3VyY2UgYnVuZGxlDQorICAgICAqIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKSBuYW1lfSBvZiB0aGUgZ2l2ZW4gbG9nDQorICAgICAqIHJlY29yZC48L2xpPg0KKyAgICAgKiA8bGk+e0Bjb2RlIGtleX0gdGhlIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRNZXNzYWdlKCkgcmF3IG1lc3NhZ2V9DQorICAgICAqIGJlZm9yZSBsb2NhbGl6YXRpb24gb3IgZm9ybWF0dGluZy48L2xpPg0KKyAgICAgKiA8L29sPg0KKyAgICAgKg0KKyAgICAgKiA8cD4NCisgICAgICogU29tZSBleGFtcGxlIGZvcm1hdHM6PGJyPg0KKyAgICAgKiA8dWw+DQorICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD0lNyQjLjE2MHMlbn0NCisgICAgICogPHA+DQorICAgICAqIFRoaXMgcHJpbnRzIG9ubHkgMTYwIGNoYXJhY3RlcnMgb2YgdGhlIG1lc3NhZ2V8dGhyb3duICh7QGNvZGUgNyR9KSB1c2luZw0KKyAgICAgKiB0aGUge0BsaW5rcGxhaW4gI3RvQWx0ZXJuYXRlKGphdmEubGFuZy5TdHJpbmcpIGFsdGVybmF0ZX0gZm9ybS4gVGhlDQorICAgICAqIHNlcGFyYXRvciBpcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgdG90YWwgd2lkdGguDQorICAgICAqIDxwcmU+DQorICAgICAqIEVuY29kaW5nIGZhaWxlZC58TnVsbFBvaW50ZXJFeGNlcHRpb246IG51bGwgU3RyaW5nLmdldEJ5dGVzKDo5MTMpDQorICAgICAqIDwvcHJlPg0KKyAgICAgKg0KKyAgICAgKiA8bGk+e0Bjb2RlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29tcGFjdEZvcm1hdHRlci5mb3JtYXQ9JTckIy4yMHMlbn0NCisgICAgICogPHA+DQorICAgICAqIFRoaXMgcHJpbnRzIG9ubHkgMjAgY2hhcmFjdGVycyBvZiB0aGUgbWVzc2FnZXx0aHJvd24gKHtAY29kZSA3JH0pIHVzaW5nDQorICAgICAqIHRoZSB7QGxpbmtwbGFpbiAjdG9BbHRlcm5hdGUoamF2YS5sYW5nLlN0cmluZykgYWx0ZXJuYXRlfSBmb3JtLiBUaGlzIHdpbGwNCisgICAgICogcGVyZm9ybSBhIHdlaWdodGVkIHRydW5jYXRpb24gb2YgYm90aCB0aGUgbWVzc2FnZSBhbmQgdGhyb3duIHByb3BlcnRpZXMNCisgICAgICogb2YgdGhlIGxvZyByZWNvcmQuIFRoZSBzZXBhcmF0b3IgaXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIHRvdGFsDQorICAgICAqIHdpZHRoLg0KKyAgICAgKiA8cHJlPg0KKyAgICAgKiBFbmNvZGluZ3xOdWxsUG9pbnRlckUNCisgICAgICogPC9wcmU+DQorICAgICAqDQorICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD0lMSR0YyAlMiRzJW4lNCRzOiAlNSRzJTYkcyVufQ0KKyAgICAgKiA8cD4NCisgICAgICogVGhpcyBwcmludHMgdGhlIHRpbWVzdGFtcCAoe0Bjb2RlIDEkfSkgYW5kIHRoZSBzb3VyY2UgKHtAY29kZSAyJH0pIG9uIHRoZQ0KKyAgICAgKiBmaXJzdCBsaW5lLiBUaGUgc2Vjb25kIGxpbmUgaXMgdGhlIGxvZyBsZXZlbCAoe0Bjb2RlIDQkfSksIGxvZyBtZXNzYWdlDQorICAgICAqICh7QGNvZGUgNSR9KSwgYW5kIHRoZSB0aHJvd2FibGUgd2l0aCBhIHJlbGV2YW50IHN0YWNrIHRyYWNlIGVsZW1lbnQNCisgICAgICogKHtAY29kZSA2JH0pIGlmIG9uZSBpcyBhdmFpbGFibGUuDQorICAgICAqIDxwcmU+DQorICAgICAqIEZyaSBOb3YgMjAgMDc6Mjk6MjQgQ1NUIDIwMDkgTXlDbGFzcyBmYXRhbA0KKyAgICAgKiBTRVZFUkU6IEVuY29kaW5nIGZhaWxlZC5OdWxsUG9pbnRlckV4Y2VwdGlvbjogbnVsbCBTdHJpbmcuZ2V0Qnl0ZXMoOjkxMykNCisgICAgICogPC9wcmU+DQorICAgICAqDQorICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD0lNCRzOiAlMTIkIy4xNjBzJW59DQorICAgICAqIDxwPg0KKyAgICAgKiBUaGlzIHByaW50cyB0aGUgbG9nIGxldmVsICh7QGNvZGUgNCR9KSBhbmQgb25seSAxNjAgY2hhcmFjdGVycyBvZiB0aGUNCisgICAgICogbWVzc2FnZXxlcnJvciAoe0Bjb2RlIDEyJH0pIHVzaW5nIHRoZSBhbHRlcm5hdGUgZm9ybS4NCisgICAgICogPHByZT4NCisgICAgICogU0VWRVJFOiBVbmFibGUgdG8gc2VuZCBub3RpZmljYXRpb24ufFNvY2tldEV4Y2VwdGlvbjogUGVybWlzc2lvbiBkZW5pZWQ6IGNvbm5lY3QNCisgICAgICogPC9wcmU+DQorICAgICAqDQorICAgICAqIDxsaT57QGNvZGUgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Db21wYWN0Rm9ybWF0dGVyLmZvcm1hdD1bJTkkZF1bJTEkdFRdWyUxMCRkXVslMiRzXSAlNSRzJW4lNiRzJW59DQorICAgICAqIDxwPg0KKyAgICAgKiBUaGlzIHByaW50cyB0aGUgc2VxdWVuY2UgKHtAY29kZSA5JH0pLCBldmVudCB0aW1lICh7QGNvZGUgMSR9KSBhcyAyNCBob3VyDQorICAgICAqIHRpbWUsIHRocmVhZCBpZCAoe0Bjb2RlIDEwJH0pLCBzb3VyY2UgKHtAY29kZSAyJH0pLCBsb2cgbWVzc2FnZQ0KKyAgICAgKiAoe0Bjb2RlIDUkfSksIGFuZCB0aGUgdGhyb3dhYmxlIHdpdGggYmFjayB0cmFjZSAoe0Bjb2RlIDYkfSkuDQorICAgICAqIDxwcmU+DQorICAgICAqIFsxMjVdWzE0OjExOjQyXVszOF1bTXlDbGFzcyBmYXRhbF0gVW5hYmxlIHRvIHNlbmQgbm90aWZpY2F0aW9uLg0KKyAgICAgKiBTb2NrZXRFeGNlcHRpb246IFBlcm1pc3Npb24gZGVuaWVkOiBjb25uZWN0IFNNVFBUcmFuc3BvcnQub3BlblNlcnZlcig6MTk0OSkNCisgICAgICogPC9wcmU+DQorICAgICAqDQorICAgICAqIDwvdWw+DQorICAgICAqDQorICAgICAqIEBwYXJhbSByZWNvcmQgdGhlIGxvZyByZWNvcmQgdG8gZm9ybWF0Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgcmVjb3JkLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgbnVsbC4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7DQorICAgICAgICAvL0xvZ1JlY29yZCBpcyBtdXRhYmxlIHNvIGRlZmluZSBsb2NhbCB2YXJzLg0KKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSByZWNvcmQuZ2V0UmVzb3VyY2VCdW5kbGUoKTsNCisgICAgICAgIExvY2FsZSBsID0gcmIgPT0gbnVsbCA/IG51bGwgOiByYi5nZXRMb2NhbGUoKTsNCisNCisgICAgICAgIFN0cmluZyBtc2cgPSBmb3JtYXRNZXNzYWdlKHJlY29yZCk7DQorICAgICAgICBTdHJpbmcgdGhyb3duID0gZm9ybWF0VGhyb3duKHJlY29yZCk7DQorICAgICAgICBTdHJpbmcgZXJyID0gZm9ybWF0RXJyb3IocmVjb3JkKTsNCisgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IHsNCisgICAgICAgICAgICBmb3JtYXRab25lZERhdGVUaW1lKHJlY29yZCksDQorICAgICAgICAgICAgZm9ybWF0U291cmNlKHJlY29yZCksDQorICAgICAgICAgICAgZm9ybWF0TG9nZ2VyTmFtZShyZWNvcmQpLA0KKyAgICAgICAgICAgIGZvcm1hdExldmVsKHJlY29yZCksDQorICAgICAgICAgICAgbXNnLA0KKyAgICAgICAgICAgIHRocm93biwNCisgICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKG1zZywgdGhyb3duKSwNCisgICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKHRocm93biwgbXNnKSwNCisgICAgICAgICAgICByZWNvcmQuZ2V0U2VxdWVuY2VOdW1iZXIoKSwNCisgICAgICAgICAgICBmb3JtYXRUaHJlYWRJRChyZWNvcmQpLA0KKyAgICAgICAgICAgIGVyciwNCisgICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKG1zZywgZXJyKSwNCisgICAgICAgICAgICBuZXcgQWx0ZXJuYXRlKGVyciwgbXNnKSwNCisgICAgICAgICAgICBmb3JtYXRCYWNrVHJhY2UocmVjb3JkKSwNCisgICAgICAgICAgICByZWNvcmQuZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCksDQorICAgICAgICAgICAgcmVjb3JkLmdldE1lc3NhZ2UoKX07DQorDQorICAgICAgICBpZiAobCA9PSBudWxsKSB7IC8vQlVHIElEIDYyODIwOTQNCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChmbXQsIHBhcmFtcyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGwsIGZtdCwgcGFyYW1zKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRm9ybWF0cyBtZXNzYWdlIGZvciB0aGUgbG9nIHJlY29yZC4gVGhpcyBtZXRob2QgcmVtb3ZlcyBhbnkgZnVsbHkNCisgICAgICogcXVhbGlmaWVkIHRocm93YWJsZSBjbGFzcyBuYW1lcyBmcm9tIHRoZSBtZXNzYWdlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSBsb2cgcmVjb3JkLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBzdHJpbmcuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKGZpbmFsIExvZ1JlY29yZCByZWNvcmQpIHsNCisgICAgICAgIFN0cmluZyBtc2cgPSBzdXBlci5mb3JtYXRNZXNzYWdlKHJlY29yZCk7DQorICAgICAgICBtc2cgPSByZXBsYWNlQ2xhc3NOYW1lKG1zZywgcmVjb3JkLmdldFRocm93bigpKTsNCisgICAgICAgIG1zZyA9IHJlcGxhY2VDbGFzc05hbWUobXNnLCByZWNvcmQuZ2V0UGFyYW1ldGVycygpKTsNCisgICAgICAgIHJldHVybiBtc2c7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgdGhyb3duIHByb3BlcnR5IG9mIHRoZSBsb2cgcmVjb3JkLiBUaGlzDQorICAgICAqIG1ldGhvZCByZXBsYWNlcyBmdWxseSBxdWFsaWZpZWQgdGhyb3dhYmxlIGNsYXNzIG5hbWVzIGZyb20gdGhlIG1lc3NhZ2UNCisgICAgICogY2F1c2UgY2hhaW4gd2l0aCBzaW1wbGUgY2xhc3MgbmFtZXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0IHRoZSB0aHJvd2FibGUgdG8gZm9ybWF0IG9yIG51bGwuDQorICAgICAqIEByZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBpZiBudWxsIHdhcyBnaXZlbiBvciB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UNCisgICAgICogc3RyaW5nIGZyb20gdGhlIHRocm93YWJsZSB3aGljaCBtYXkgYmUgbnVsbC4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0TWVzc2FnZShmaW5hbCBUaHJvd2FibGUgdCkgew0KKyAgICAgICAgU3RyaW5nIHI7DQorICAgICAgICBpZiAodCAhPSBudWxsKSB7DQorICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIGFwcGx5ID0gYXBwbHkodCk7DQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIG0gPSBhcHBseS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7DQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSBhcHBseS50b1N0cmluZygpOw0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzbiA9IHNpbXBsZUNsYXNzTmFtZShhcHBseS5nZXRDbGFzcygpKTsNCisgICAgICAgICAgICBpZiAoIWlzTnVsbE9yU3BhY2VzKG0pKSB7DQorICAgICAgICAgICAgICAgIGlmIChzLmNvbnRhaW5zKG0pKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAocy5zdGFydHNXaXRoKGFwcGx5LmdldENsYXNzKCkuZ2V0TmFtZSgpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzLnN0YXJ0c1dpdGgoc24pKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgciA9IHJlcGxhY2VDbGFzc05hbWUobSwgdCk7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByZXBsYWNlQ2xhc3NOYW1lKHNpbXBsZUNsYXNzTmFtZShzKSwgdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICByID0gcmVwbGFjZUNsYXNzTmFtZShzaW1wbGVDbGFzc05hbWUocykgKyAiOiAiICsgbSwgdCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByID0gcmVwbGFjZUNsYXNzTmFtZShzaW1wbGVDbGFzc05hbWUocyksIHQpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoIXIuY29udGFpbnMoc24pKSB7DQorICAgICAgICAgICAgICAgIHIgPSBzbiArICI6ICIgKyByOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgciA9ICIiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHI7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIGxldmVsIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBsb2cgcmVjb3JkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuDQorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBsb2dnZXIgbmFtZS4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdExldmVsKGZpbmFsIExvZ1JlY29yZCByZWNvcmQpIHsNCisgICAgICAgIHJldHVybiByZWNvcmQuZ2V0TGV2ZWwoKS5nZXRMb2NhbGl6ZWROYW1lKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIHNvdXJjZSBmcm9tIHRoZSBnaXZlbiBsb2cgcmVjb3JkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuDQorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBzb3VyY2Ugb2YgdGhlIGxvZyByZWNvcmQuDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBmb3JtYXRTb3VyY2UoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgew0KKyAgICAgICAgU3RyaW5nIHNvdXJjZSA9IHJlY29yZC5nZXRTb3VyY2VDbGFzc05hbWUoKTsNCisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0U291cmNlTWV0aG9kTmFtZSgpICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgc291cmNlID0gc2ltcGxlQ2xhc3NOYW1lKHNvdXJjZSkgKyAiICINCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlY29yZC5nZXRTb3VyY2VNZXRob2ROYW1lKCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc291cmNlID0gc2ltcGxlQ2xhc3NOYW1lKHNvdXJjZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzb3VyY2UgPSBzaW1wbGVDbGFzc05hbWUocmVjb3JkLmdldExvZ2dlck5hbWUoKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gc291cmNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIHRoZSBsb2dnZXIgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbG9nIHJlY29yZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbG9nZ2VyIG5hbWUuDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBmb3JtYXRMb2dnZXJOYW1lKGZpbmFsIExvZ1JlY29yZCByZWNvcmQpIHsNCisgICAgICAgIHJldHVybiBzaW1wbGVDbGFzc05hbWUocmVjb3JkLmdldExvZ2dlck5hbWUoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIHRocmVhZCBpZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbG9nIHJlY29yZC4gQnkgZGVmYXVsdCB0aGlzDQorICAgICAqIGlzIGZvcm1hdHRlZCBhcyBhIHtAY29kZSBsb25nfSBieSBhbiB1bnNpZ25lZCBjb252ZXJzaW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuDQorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCB0aHJlYWQgaWQgYXMgYSBudW1iZXIuDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHJlY29yZCBpcyBudWxsLg0KKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS41LjQNCisgICAgICovDQorICAgIHB1YmxpYyBOdW1iZXIgZm9ybWF0VGhyZWFkSUQoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaHJlYWQuZ2V0SUQgaXMgZGVmaW5lZCBhcyBsb25nIGFuZCBMb2dSZWNvcmQuZ2V0VGhyZWFkSUQgaXMgZGVmaW5lZA0KKyAgICAgICAgICogYXMgaW50LiBDb252ZXJ0IHRvIHVuc2lnbmVkIGFzIGEgbWVhbnMgdG8gYmV0dGVyIG1hcCB0aGUgdHdvIHR5cGVzIG9mDQorICAgICAgICAgKiB0aHJlYWQgaWRlbnRpZmllcnMuDQorICAgICAgICAgKi8NCisgICAgICAgIHJldHVybiAoKChsb25nKSByZWNvcmQuZ2V0VGhyZWFkSUQoKSkgJiAweGZmZmZmZmZmTCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZvcm1hdHMgdGhlIHRocm93biBwcm9wZXJ0eSBvZiBhIExvZ1JlY29yZC4gVGhlIHJldHVybmVkIHN0cmluZyB3aWxsDQorICAgICAqIGNvbnRhaW4gYSB0aHJvd2FibGUgbWVzc2FnZSB3aXRoIGEgYmFjayB0cmFjZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLg0KKyAgICAgKiBAcmV0dXJuIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyB0aHJvd24gb3IgZm9ybWF0dGVkIHN0cmluZy4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuDQorICAgICAqIEBzZWUgI2FwcGx5KGphdmEubGFuZy5UaHJvd2FibGUpDQorICAgICAqIEBzZWUgI2Zvcm1hdEJhY2tUcmFjZShqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFRocm93bihmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7DQorICAgICAgICBTdHJpbmcgbXNnOw0KKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSByZWNvcmQuZ2V0VGhyb3duKCk7DQorICAgICAgICBpZiAodCAhPSBudWxsKSB7DQorICAgICAgICAgICAgU3RyaW5nIHNpdGUgPSBmb3JtYXRCYWNrVHJhY2UocmVjb3JkKTsNCisgICAgICAgICAgICBtc2cgPSBmb3JtYXRNZXNzYWdlKHQpICsgKGlzTnVsbE9yU3BhY2VzKHNpdGUpID8gIiIgOiAnICcgKyBzaXRlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbXNnID0gIiI7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbXNnOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIHRoZSB0aHJvd24gcHJvcGVydHkgb2YgYSBMb2dSZWNvcmQgYXMgYW4gZXJyb3IgbWVzc2FnZS4gVGhlDQorICAgICAqIHJldHVybmVkIHN0cmluZyB3aWxsIG5vdCBjb250YWluIGEgYmFjayB0cmFjZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLg0KKyAgICAgKiBAcmV0dXJuIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyB0aHJvd24gb3IgZm9ybWF0dGVkIHN0cmluZy4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuDQorICAgICAqIEBzZWUgVGhyb3dhYmxlI3RvU3RyaW5nKCkNCisgICAgICogQHNlZSAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkNCisgICAgICogQHNlZSAjZm9ybWF0TWVzc2FnZShqYXZhLmxhbmcuVGhyb3dhYmxlKQ0KKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS41LjQNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0RXJyb3IoZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgew0KKyAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UocmVjb3JkLmdldFRocm93bigpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRm9ybWF0cyB0aGUgYmFjayB0cmFjZSBmb3IgdGhlIGdpdmVuIGxvZyByZWNvcmQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSByZWNvcmQgdGhlIGxvZyByZWNvcmQgdG8gZm9ybWF0Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgYmFjayB0cmFjZS4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcmVjb3JkIGlzIG51bGwuDQorICAgICAqIEBzZWUgI2FwcGx5KGphdmEubGFuZy5UaHJvd2FibGUpDQorICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpDQorICAgICAqIEBzZWUgI2lnbm9yZShqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQpDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdEJhY2tUcmFjZShmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7DQorICAgICAgICBTdHJpbmcgc2l0ZSA9ICIiOw0KKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSByZWNvcmQuZ2V0VGhyb3duKCk7DQorICAgICAgICBpZiAodCAhPSBudWxsKSB7DQorICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHJvb3QgPSBhcHBseSh0KTsNCisgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHRyYWNlID0gcm9vdC5nZXRTdGFja1RyYWNlKCk7DQorICAgICAgICAgICAgc2l0ZSA9IGZpbmRBbmRGb3JtYXQodHJhY2UpOw0KKyAgICAgICAgICAgIGlmIChpc051bGxPclNwYWNlcyhzaXRlKSkgew0KKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSAwOw0KKyAgICAgICAgICAgICAgICBmb3IgKFRocm93YWJsZSBjID0gdDsgYyAhPSBudWxsOyBjID0gYy5nZXRDYXVzZSgpKSB7DQorICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0ZSA9IGMuZ2V0U3RhY2tUcmFjZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgc2l0ZSA9IGZpbmRBbmRGb3JtYXQoc3RlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNOdWxsT3JTcGFjZXMoc2l0ZSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlLmxlbmd0aCA9PSAwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSBzdGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgLy9EZWFsIHdpdGggZXhjZXNzaXZlIGNhdXNlIGNoYWlucw0KKyAgICAgICAgICAgICAgICAgICAgLy9hbmQgY3ljbGljIHRocm93YWJsZXMuDQorICAgICAgICAgICAgICAgICAgICBpZiAoKytsaW1pdCA9PSAoMSA8PCAxNikpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy9HaXZlIHVwLg0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vUHVudC4NCisgICAgICAgICAgICAgICAgaWYgKGlzTnVsbE9yU3BhY2VzKHNpdGUpICYmIHRyYWNlLmxlbmd0aCAhPSAwKSB7DQorICAgICAgICAgICAgICAgICAgICBzaXRlID0gZm9ybWF0U3RhY2tUcmFjZUVsZW1lbnQodHJhY2VbMF0pOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHNpdGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZpbmRzIGFuZCBmb3JtYXRzIHRoZSBmaXJzdCBzdGFjayBmcmFtZSBvZiBpbnRlcmVzdC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYWNlIHRoZSBmaWxsIHN0YWNrIHRvIGV4YW1pbmUuDQorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdGhhdCBiZXN0IGRlc2NyaWJlcyB0aGUgY2FsbCBzaXRlLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHN0YWNrIHRyYWNlIGVsZW1lbnQgYXJyYXkgaXMgbnVsbC4NCisgICAgICovDQorICAgIHByaXZhdGUgU3RyaW5nIGZpbmRBbmRGb3JtYXQoZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZSkgew0KKyAgICAgICAgU3RyaW5nIHNpdGUgPSAiIjsNCisgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgcyA6IHRyYWNlKSB7DQorICAgICAgICAgICAgaWYgKCFpZ25vcmUocykpIHsNCisgICAgICAgICAgICAgICAgc2l0ZSA9IGZvcm1hdFN0YWNrVHJhY2VFbGVtZW50KHMpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvL0NoZWNrIGlmIGFsbCBjb2RlIHdhcyBjb21waWxlZCB3aXRoIG5vIGRlYnVnZ2luZyBpbmZvLg0KKyAgICAgICAgaWYgKGlzTnVsbE9yU3BhY2VzKHNpdGUpKSB7DQorICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBzIDogdHJhY2UpIHsNCisgICAgICAgICAgICAgICAgaWYgKCFkZWZhdWx0SWdub3JlKHMpKSB7DQorICAgICAgICAgICAgICAgICAgICBzaXRlID0gZm9ybWF0U3RhY2tUcmFjZUVsZW1lbnQocyk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzaXRlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIGEgc3RhY2sgdHJhY2UgZWxlbWVudCBpbnRvIGEgc2ltcGxlIGNhbGwgc2l0ZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHMgdGhlIHN0YWNrIHRyYWNlIGVsZW1lbnQgdG8gZm9ybWF0Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RhY2sgdHJhY2UgZWxlbWVudC4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBzdGFjayB0cmFjZSBlbGVtZW50IGlzIG51bGwuDQorICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpDQorICAgICAqLw0KKyAgICBwcml2YXRlIFN0cmluZyBmb3JtYXRTdGFja1RyYWNlRWxlbWVudChmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7DQorICAgICAgICBTdHJpbmcgdiA9IHNpbXBsZUNsYXNzTmFtZShzLmdldENsYXNzTmFtZSgpKTsNCisgICAgICAgIFN0cmluZyByZXN1bHQ7DQorICAgICAgICBpZiAodiAhPSBudWxsKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gcy50b1N0cmluZygpLnJlcGxhY2Uocy5nZXRDbGFzc05hbWUoKSwgdik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlc3VsdCA9IHMudG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vSWYgdGhlIGNsYXNzIG5hbWUgY29udGFpbnMgdGhlIHNpbXBsZSBmaWxlIG5hbWUgdGhlbiByZW1vdmUgZmlsZSBuYW1lLg0KKyAgICAgICAgdiA9IHNpbXBsZUZpbGVOYW1lKHMuZ2V0RmlsZU5hbWUoKSk7DQorICAgICAgICBpZiAodiAhPSBudWxsICYmIHJlc3VsdC5zdGFydHNXaXRoKHYpKSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2Uocy5nZXRGaWxlTmFtZSgpLCAiIik7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDaG9vc2VzIGEgc2luZ2xlIHRocm93YWJsZSBmcm9tIHRoZSBjYXVzZSBjaGFpbiB0aGF0IHdpbGwgYmUgZm9ybWF0dGVkLg0KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNob29zZXMgdGhlIHRocm93YWJsZSB0aGF0IGJlc3QgZGVzY3JpYmVzIHRoZSBjaGFpbi4NCisgICAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hvb3NlIGFuIGFsdGVybmF0ZSB0aHJvd2FibGUgZm9yDQorICAgICAqIGZvcm1hdHRpbmcuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0IHRoZSB0aHJvd2FibGUgZnJvbSB0aGUgbG9nIHJlY29yZC4NCisgICAgICogQHJldHVybiB0aGUgY2hvc2VuIHRocm93YWJsZSBvciBudWxsIG9ubHkgaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIG51bGwuDQorICAgICAqIEBzZWUgI2Zvcm1hdFRocm93bihqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQpDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGFwcGx5KGZpbmFsIFRocm93YWJsZSB0KSB7DQorICAgICAgICByZXR1cm4gU2V2ZXJpdHlDb21wYXJhdG9yLmdldEluc3RhbmNlKCkuYXBwbHkodCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgYSBzdGFjayBmcmFtZSBzaG91bGQgYmUgaWdub3JlZCBhcyB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdGFjayB0cmFjZSBlbGVtZW50Lg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBmcmFtZSBzaG91bGQgYmUgaWdub3JlZC4NCisgICAgICogQHNlZSAjZm9ybWF0VGhyb3duKGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCkNCisgICAgICovDQorICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZShmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7DQorICAgICAgICByZXR1cm4gaXNVbmtub3duKHMpIHx8IGRlZmF1bHRJZ25vcmUocyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlZmluZXMgdGhlIGFsdGVybmF0ZSBmb3JtYXQuIFRoaXMgaW1wbGVtZW50YXRpb24gcmVtb3ZlcyBhbGwgY29udHJvbA0KKyAgICAgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIHN0cmluZy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHMgYW55IHN0cmluZyBvciBudWxsLg0KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGFyZ3VtZW50IHdhcyBudWxsIG90aGVyd2lzZSwgYW4gYWx0ZXJuYXRlIHN0cmluZy4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBTdHJpbmcgdG9BbHRlcm5hdGUoZmluYWwgU3RyaW5nIHMpIHsNCisgICAgICAgIHJldHVybiBzICE9IG51bGwgPyBzLnJlcGxhY2VBbGwoIltcXHgwMC1cXHgxRlxceDdGXSsiLCAiIikgOiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB6b25lZCBkYXRlIHRpbWUgZnJvbSB0aGUgZ2l2ZW4gbG9nIHJlY29yZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgY3VycmVudCBsb2cgcmVjb3JkLg0KKyAgICAgKiBAcmV0dXJuIGEgem9uZWQgZGF0ZSB0aW1lIG9yIGEgbGVnYWN5IGRhdGUgb2JqZWN0Lg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiByZWNvcmQgaXMgbnVsbC4NCisgICAgICogQHNpbmNlIEphdmFNYWlsIDEuNS42DQorICAgICAqLw0KKyAgICBwcml2YXRlIENvbXBhcmFibGU8Pz4gZm9ybWF0Wm9uZWREYXRlVGltZShmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7DQorICAgICAgICBDb21wYXJhYmxlPD8+IHpkdCA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLmdldFpvbmVkRGF0ZVRpbWUocmVjb3JkKTsNCisgICAgICAgIGlmICh6ZHQgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHpkdCA9IG5ldyBqYXZhLnV0aWwuRGF0ZShyZWNvcmQuZ2V0TWlsbGlzKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHpkdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIGZyYW1lIHNob3VsZCBiZSBpZ25vcmVkIGFzIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4NCisgICAgICogVGhpcyBkb2VzIG5vdCBjaGVjayBmb3IgdW5rbm93biBsaW5lIG51bWJlcnMgYmVjYXVzZSBjb2RlIGNhbiBiZSBjb21waWxlZA0KKyAgICAgKiB3aXRob3V0IGRlYnVnZ2luZyBpbmZvLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RhY2sgdHJhY2UgZWxlbWVudC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZnJhbWUgc2hvdWxkIGJlIGlnbm9yZWQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdElnbm9yZShmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7DQorICAgICAgICByZXR1cm4gaXNTeW50aGV0aWMocykgfHwgaXNTdGF0aWNVdGlsaXR5KHMpIHx8IGlzUmVmbGVjdGlvbihzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIGZyYW1lIGlzIGZvciBhIHN0YXRpYyB1dGlsaXR5IGNsYXNzLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RhY2sgdHJhY2UgZWxlbWVudC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZnJhbWUgc2hvdWxkIGJlIGlnbm9yZWQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWNVdGlsaXR5KGZpbmFsIFN0YWNrVHJhY2VFbGVtZW50IHMpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIExvZ01hbmFnZXJQcm9wZXJ0aWVzLmlzU3RhdGljVXRpbGl0eUNsYXNzKHMuZ2V0Q2xhc3NOYW1lKCkpOw0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBpZ25vcmUpIHsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB8IExpbmthZ2VFcnJvciBpZ25vcmUpIHsNCisgICAgICAgIH0NCisgICAgICAgIGZpbmFsIFN0cmluZyBjbiA9IHMuZ2V0Q2xhc3NOYW1lKCk7DQorICAgICAgICByZXR1cm4gKGNuLmVuZHNXaXRoKCJzIikgJiYgIWNuLmVuZHNXaXRoKCJlcyIpKQ0KKyAgICAgICAgICAgICAgICB8fCBjbi5jb250YWlucygiVXRpbCIpIHx8IGNuLmVuZHNXaXRoKCJUaHJvd2FibGVzIik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgYSBzdGFjayB0cmFjZSBlbGVtZW50IGlzIGZvciBhIHN5bnRoZXRpYyBtZXRob2QuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdGFjayB0cmFjZSBlbGVtZW50Lg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3ludGhldGljLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMgbnVsbC4NCisgICAgICovDQorICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5bnRoZXRpYyhmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7DQorICAgICAgICByZXR1cm4gcy5nZXRNZXRob2ROYW1lKCkuaW5kZXhPZignJCcpID4gLTE7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgYSBzdGFjayB0cmFjZSBlbGVtZW50IGhhcyBhbiB1bmtub3duIGxpbmUgbnVtYmVyIG9yIGENCisgICAgICogbmF0aXZlIGxpbmUgbnVtYmVyLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RhY2sgdHJhY2UgZWxlbWVudC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHN0YWNrIHRyYWNlIGVsZW1lbnQgaXMgbnVsbC4NCisgICAgICovDQorICAgIHByaXZhdGUgYm9vbGVhbiBpc1Vua25vd24oZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgcykgew0KKyAgICAgICAgcmV0dXJuIHMuZ2V0TGluZU51bWJlcigpIDwgMDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiBhIHN0YWNrIHRyYWNlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHJlZmxlY3Rpb24gZnJhbWUuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdGFjayB0cmFjZSBlbGVtZW50Lg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24uDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3RhY2sgdHJhY2UgZWxlbWVudCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVmbGVjdGlvbihmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzKSB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBMb2dNYW5hZ2VyUHJvcGVydGllcy5pc1JlZmxlY3Rpb25DbGFzcyhzLmdldENsYXNzTmFtZSgpKTsNCisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7DQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gfCBMaW5rYWdlRXJyb3IgaWdub3JlKSB7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcy5nZXRDbGFzc05hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmcucmVmbGVjdC4iKQ0KKyAgICAgICAgICAgICAgICB8fCBzLmdldENsYXNzTmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5yZWZsZWN0LiIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIHRoZSBmb3JtYXQgcGF0dGVybiBmb3IgdGhpcyBmb3JtYXR0ZXIuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwIHRoZSBjbGFzcyBuYW1lIHByZWZpeC4NCisgICAgICogQHJldHVybiB0aGUgamF2YS51dGlsLkZvcm1hdHRlciBmb3JtYXQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBjbGFzcyBuYW1lIGlzIG51bGwuDQorICAgICAqLw0KKyAgICBwcml2YXRlIFN0cmluZyBpbml0Rm9ybWF0KGZpbmFsIFN0cmluZyBwKSB7DQorICAgICAgICBTdHJpbmcgdiA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLmZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuZm9ybWF0IikpOw0KKyAgICAgICAgaWYgKGlzTnVsbE9yU3BhY2VzKHYpKSB7DQorICAgICAgICAgICAgdiA9ICIlNyQjLjE2MHMlbiI7IC8vMTYwIGNoYXJzIHNwbGl0IGJldHdlZW4gbWVzc2FnZSBhbmQgdGhyb3duLg0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHY7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNlYXJjaGVzIHRoZSBnaXZlbiBtZXNzYWdlIGZvciBhbGwgaW5zdGFuY2VzIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lDQorICAgICAqIHdpdGggc2ltcGxlIGNsYXNzIG5hbWUgYmFzZWQgb2ZmIG9mIHRoZSB0eXBlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuDQorICAgICAqIHBhcmFtZXRlciBhcnJheS4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZS4NCisgICAgICogQHBhcmFtIHQgdGhlIHRocm93YWJsZSBjYXVzZSBjaGFpbiB0byBzZWFyY2ggb3IgbnVsbC4NCisgICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgbWVzc2FnZSBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUNsYXNzTmFtZShTdHJpbmcgbXNnLCBUaHJvd2FibGUgdCkgew0KKyAgICAgICAgaWYgKCFpc051bGxPclNwYWNlcyhtc2cpKSB7DQorICAgICAgICAgICAgaW50IGxpbWl0ID0gMDsNCisgICAgICAgICAgICBmb3IgKFRocm93YWJsZSBjID0gdDsgYyAhPSBudWxsOyBjID0gYy5nZXRDYXVzZSgpKSB7DQorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGsgPSBjLmdldENsYXNzKCk7DQorICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKGsuZ2V0TmFtZSgpLCBzaW1wbGVDbGFzc05hbWUoaykpOw0KKw0KKyAgICAgICAgICAgICAgICAvL0RlYWwgd2l0aCBleGNlc3NpdmUgY2F1c2UgY2hhaW5zIGFuZCBjeWNsaWMgdGhyb3dhYmxlcy4NCisgICAgICAgICAgICAgICAgaWYgKCsrbGltaXQgPT0gKDEgPDwgMTYpKSB7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy9HaXZlIHVwLg0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1zZzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2VhcmNoZXMgdGhlIGdpdmVuIG1lc3NhZ2UgZm9yIGFsbCBpbnN0YW5jZXMgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUNCisgICAgICogd2l0aCBzaW1wbGUgY2xhc3MgbmFtZSBiYXNlZCBvZmYgb2YgdGhlIHR5cGVzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4NCisgICAgICogcGFyYW1ldGVyIGFycmF5Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIG9yIG51bGwuDQorICAgICAqIEBwYXJhbSBwIHRoZSBwYXJhbWV0ZXIgYXJyYXkgb3IgbnVsbC4NCisgICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgbWVzc2FnZSBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUNsYXNzTmFtZShTdHJpbmcgbXNnLCBPYmplY3RbXSBwKSB7DQorICAgICAgICBpZiAoIWlzTnVsbE9yU3BhY2VzKG1zZykgJiYgcCAhPSBudWxsKSB7DQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHApIHsNCisgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gayA9IG8uZ2V0Q2xhc3MoKTsNCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKGsuZ2V0TmFtZSgpLCBzaW1wbGVDbGFzc05hbWUoaykpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1zZzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyB0aGUgc2ltcGxlIGNsYXNzIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcg0KKyAgICAgKiBCVUcgSUQgSkRLLTgwNTc5MTkuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBrIHRoZSBjbGFzcyBvYmplY3QuDQorICAgICAqIEByZXR1cm4gdGhlIHNpbXBsZSBjbGFzcyBuYW1lIG9yIG51bGwuDQorICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuMw0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNpbXBsZUNsYXNzTmFtZShmaW5hbCBDbGFzczw/PiBrKSB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBrLmdldFNpbXBsZU5hbWUoKTsNCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVybmFsRXJyb3IgSkRLODA1NzkxOSkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHNpbXBsZUNsYXNzTmFtZShrLmdldE5hbWUoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnZlcnRzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gYSBzaW1wbGUgY2xhc3MgbmFtZS4gSWYgdGhlDQorICAgICAqIGxlYWRpbmcgcGFydCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG5vdCBhIGxlZ2FsIGNsYXNzIG5hbWUgdGhlbiB0aGUgZ2l2ZW4NCisgICAgICogc3RyaW5nIGlzIHJldHVybmVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgcHJlZml4IG9yIG51bGwuDQorICAgICAqIEByZXR1cm4gdGhlIHNpbXBsZSBjbGFzcyBuYW1lIG9yIGdpdmVuIGlucHV0Lg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNpbXBsZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCBjdXJzb3IgPSAwOw0KKyAgICAgICAgICAgIGludCBzaWduID0gLTE7DQorICAgICAgICAgICAgaW50IGRvdCA9IC0xOw0KKyAgICAgICAgICAgIGZvciAoaW50IGMsIHByZXYgPSBkb3Q7IGN1cnNvciA8IG5hbWUubGVuZ3RoKCk7DQorICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gQ2hhcmFjdGVyLmNoYXJDb3VudChjKSkgew0KKyAgICAgICAgICAgICAgICBjID0gbmFtZS5jb2RlUG9pbnRBdChjdXJzb3IpOw0KKyAgICAgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gKChpbnQpICcuJykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRvdCArIDEpICE9IGN1cnNvciAmJiAoZG90ICsgMSkgIT0gc2lnbikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gZG90Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgPSBjdXJzb3I7DQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRvdCArIDEpID09IGN1cnNvcikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgPSBwcmV2Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICgoaW50KSAnJCcpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGN1cnNvcjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZG90ID4gLTEgJiYgKytkb3QgPCBjdXJzb3IgJiYgKytzaWduIDwgY3Vyc29yKSB7DQorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhzaWduID4gZG90ID8gc2lnbiA6IGRvdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnZlcnRzIGEgZmlsZSBuYW1lIHdpdGggYW4gZXh0ZW5zaW9uIHRvIGEgZmlsZSBuYW1lIHdpdGhvdXQgYW4NCisgICAgICogZXh0ZW5zaW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbCBmaWxlIG5hbWUgb3IgbnVsbC4NCisgICAgICogQHJldHVybiB0aGUgc2ltcGxlIGZpbGUgbmFtZSBvciBudWxsLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNpbXBsZUZpbGVOYW1lKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOw0KKyAgICAgICAgICAgIG5hbWUgPSBpbmRleCA+IC0xID8gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBuYW1lOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlzIHRoZSBnaXZlbiBzdHJpbmcgaXMgbnVsbCBvciBzcGFjZXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgb3IgbnVsbC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIG51bGwgb3Igc3BhY2VzLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc051bGxPclNwYWNlcyhmaW5hbCBTdHJpbmcgcykgew0KKyAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCB8fCBzLnRyaW0oKS5sZW5ndGgoKSA9PSAwOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBVc2VkIHRvIGZvcm1hdCB0d28gYXJndW1lbnRzIGFzIGZpeGVkIGxlbmd0aCBtZXNzYWdlLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBjbGFzcyBBbHRlcm5hdGUgaW1wbGVtZW50cyBqYXZhLnV0aWwuRm9ybWF0dGFibGUgew0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbGVmdCBzaWRlIG9mIHRoZSBvdXRwdXQuDQorICAgICAgICAgKi8NCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxlZnQ7DQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQuDQorICAgICAgICAgKi8NCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJpZ2h0Ow0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBDcmVhdGVzIGFuIGFsdGVybmF0ZSBvdXRwdXQuDQorICAgICAgICAgKg0KKyAgICAgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgc2lkZSBvciBudWxsLg0KKyAgICAgICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBzaWRlIG9yIG51bGwuDQorICAgICAgICAgKi8NCisgICAgICAgIEFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbGVmdCwgZmluYWwgU3RyaW5nIHJpZ2h0KSB7DQorICAgICAgICAgICAgdGhpcy5sZWZ0ID0gU3RyaW5nLnZhbHVlT2YobGVmdCk7DQorICAgICAgICAgICAgdGhpcy5yaWdodCA9IFN0cmluZy52YWx1ZU9mKHJpZ2h0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJvdmVycmlkZSIpIC8vSkRLLTY5NTQyMzQNCisgICAgICAgIHB1YmxpYyB2b2lkIGZvcm1hdFRvKGphdmEudXRpbC5Gb3JtYXR0ZXIgZm9ybWF0dGVyLCBpbnQgZmxhZ3MsDQorICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IHByZWNpc2lvbikgew0KKw0KKyAgICAgICAgICAgIFN0cmluZyBsID0gbGVmdDsNCisgICAgICAgICAgICBTdHJpbmcgciA9IHJpZ2h0Ow0KKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5VUFBFUkNBU0UpDQorICAgICAgICAgICAgICAgICAgICA9PSBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5VUFBFUkNBU0UpIHsNCisgICAgICAgICAgICAgICAgbCA9IGwudG9VcHBlckNhc2UoZm9ybWF0dGVyLmxvY2FsZSgpKTsNCisgICAgICAgICAgICAgICAgciA9IHIudG9VcHBlckNhc2UoZm9ybWF0dGVyLmxvY2FsZSgpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKChmbGFncyAmIGphdmEudXRpbC5Gb3JtYXR0YWJsZUZsYWdzLkFMVEVSTkFURSkNCisgICAgICAgICAgICAgICAgICAgID09IGphdmEudXRpbC5Gb3JtYXR0YWJsZUZsYWdzLkFMVEVSTkFURSkgew0KKyAgICAgICAgICAgICAgICBsID0gdG9BbHRlcm5hdGUobCk7DQorICAgICAgICAgICAgICAgIHIgPSB0b0FsdGVybmF0ZShyKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKHByZWNpc2lvbiA8PSAwKSB7DQorICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9IEludGVnZXIuTUFYX1ZBTFVFOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpbnQgZmVuY2UgPSBNYXRoLm1pbihsLmxlbmd0aCgpLCBwcmVjaXNpb24pOw0KKyAgICAgICAgICAgIGlmIChmZW5jZSA+IChwcmVjaXNpb24gPj4gMSkpIHsNCisgICAgICAgICAgICAgICAgZmVuY2UgPSBNYXRoLm1heChmZW5jZSAtIHIubGVuZ3RoKCksIGZlbmNlID4+IDEpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAoZmVuY2UgPiAwKSB7DQorICAgICAgICAgICAgICAgIGlmIChmZW5jZSA+IGwubGVuZ3RoKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKGwuY2hhckF0KGZlbmNlIC0gMSkpKSB7DQorICAgICAgICAgICAgICAgICAgICAtLWZlbmNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGwgPSBsLnN1YnN0cmluZygwLCBmZW5jZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHIgPSByLnN1YnN0cmluZygwLCBNYXRoLm1pbihwcmVjaXNpb24gLSBmZW5jZSwgci5sZW5ndGgoKSkpOw0KKw0KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGhhbGYgPSB3aWR0aCA+PiAxOw0KKyAgICAgICAgICAgICAgICBpZiAobC5sZW5ndGgoKSA8IGhhbGYpIHsNCisgICAgICAgICAgICAgICAgICAgIGwgPSBwYWQoZmxhZ3MsIGwsIGhhbGYpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmIChyLmxlbmd0aCgpIDwgaGFsZikgew0KKyAgICAgICAgICAgICAgICAgICAgciA9IHBhZChmbGFncywgciwgaGFsZik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgT2JqZWN0W10gZW1wdHkgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLnRvQXJyYXkoKTsNCisgICAgICAgICAgICBmb3JtYXR0ZXIuZm9ybWF0KGwsIGVtcHR5KTsNCisgICAgICAgICAgICBpZiAobC5sZW5ndGgoKSAhPSAwICYmIHIubGVuZ3RoKCkgIT0gMCkgew0KKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXIuZm9ybWF0KCJ8IiwgZW1wdHkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JtYXR0ZXIuZm9ybWF0KHIsIGVtcHR5KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogUGFkIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuDQorICAgICAgICAgKg0KKyAgICAgICAgICogQHBhcmFtIGZsYWdzIHRoZSBmb3JtYXR0ZXIgZmxhZ3MuDQorICAgICAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIHBhZC4NCisgICAgICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGZpbmFsIHN0cmluZyBsZW5ndGguDQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYWRkZWQgc3RyaW5nLg0KKyAgICAgICAgICovDQorICAgICAgICBwcml2YXRlIFN0cmluZyBwYWQoaW50IGZsYWdzLCBTdHJpbmcgcywgaW50IGxlbmd0aCkgew0KKyAgICAgICAgICAgIGZpbmFsIGludCBwYWRkaW5nID0gbGVuZ3RoIC0gcy5sZW5ndGgoKTsNCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOw0KKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5MRUZUX0pVU1RJRlkpDQorICAgICAgICAgICAgICAgICAgICA9PSBqYXZhLnV0aWwuRm9ybWF0dGFibGVGbGFncy5MRUZUX0pVU1RJRlkpIHsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcdTAwMjAnKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBiLmFwcGVuZChzKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBiLmFwcGVuZChzKTsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsNCisgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcdTAwMjAnKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL0R1cmF0aW9uRmlsdGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9EdXJhdGlvbkZpbHRlci5qYXZhCmluZGV4IDY3M2MyNWEuLmY3NGMzMGQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL0R1cmF0aW9uRmlsdGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvRHVyYXRpb25GaWx0ZXIuamF2YQpAQCAtMSw0NjggKzEsNDY4IEBACi0vKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLSAqCi0gKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogTW9kaWZpY2F0aW9uczoKLSAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gKgotICogQ29udHJpYnV0b3Iocyk6Ci0gKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICogaG9sZGVyLgotICovCi1wYWNrYWdlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmc7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyUHJvcGVydGllcy5mcm9tTG9nTWFuYWdlcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOwotCi0vKioKLSAqIEEgZmlsdGVyIHVzZWQgdG8gbGltaXQgbG9nIHJlY29yZHMgYmFzZWQgb24gYSBtYXhpbXVtIGdlbmVyYXRpb24gcmF0ZS4KLSAqCi0gKiBUaGUgZHVyYXRpb24gc3BlY2lmaWVkIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcmVjb3JkIHJhdGUgYW5kIHRoZSBhbW91bnQgb2YKLSAqIHRpbWUgdGhlIGZpbHRlciB3aWxsIHJlamVjdCByZWNvcmRzIG9uY2UgdGhlIHJhdGUgaGFzIGJlZW4gZXhjZWVkZWQuIE9uY2UgdGhlCi0gKiByYXRlIGlzIGV4Y2VlZGVkIHJlY29yZHMgYXJlIG5vdCBhbGxvd2VkIHVudGlsIHRoZSBkdXJhdGlvbiBoYXMgZWxhcHNlZC4KLSAqCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQgZWFjaCB7QGNvZGUgRHVyYXRpb25GaWx0ZXJ9IGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZSBmb2xsb3dpbmcKLSAqIExvZ01hbmFnZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHdoZXJlIHtAY29kZSA8ZmlsdGVyLW5hbWU+fSByZWZlcnMgdG8gdGhlCi0gKiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaGFuZGxlci4gSWYgcHJvcGVydGllcyBhcmUgbm90IGRlZmluZWQsIG9yCi0gKiBjb250YWluIGludmFsaWQgdmFsdWVzLCB0aGVuIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCi0gKgotICogPHVsPgotICogPGxpPntAbGl0ZXJhbCA8ZmlsdGVyLW5hbWU+fS5yZWNvcmRzIHRoZSBtYXggbnVtYmVyIG9mIHJlY29yZHMgcGVyIGR1cmF0aW9uLgotICogQSBudW1lcmljIGxvbmcgaW50ZWdlciBvciBhIG11bHRpcGxpY2F0aW9uIGV4cHJlc3Npb24gY2FuIGJlIHVzZWQgYXMgdGhlCi0gKiB2YWx1ZS4gKGRlZmF1bHRzIHRvIHtAY29kZSAxMDAwfSkKLSAqCi0gKiA8bGk+e0BsaXRlcmFsIDxmaWx0ZXItbmFtZT59LmR1cmF0aW9uIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHN1cHByZXNzCi0gKiBsb2cgcmVjb3JkcyBmcm9tIGJlaW5nIHB1Ymxpc2hlZC4gVGhpcyBpcyBhbHNvIHVzZWQgYXMgZHVyYXRpb24gdG8gZGV0ZXJtaW5lCi0gKiB0aGUgbG9nIHJlY29yZCByYXRlLiBBIG51bWVyaWMgbG9uZyBpbnRlZ2VyIG9yIGEgbXVsdGlwbGljYXRpb24gZXhwcmVzc2lvbgotICogY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlLiBJZiB0aGUge0Bjb2RlIGphdmEudGltZX0gcGFja2FnZSBpcyBhdmFpbGFibGUgdGhlbgotICogYW4gSVNPLTg2MDEgZHVyYXRpb24gZm9ybWF0IG9mIHtAY29kZSBQbkRUbkhuTW4ublN9IGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZS4KLSAqIFRoZSBzdWZmaXhlcyBvZiAiRCIsICJIIiwgIk0iIGFuZCAiUyIgYXJlIGZvciBkYXlzLCBob3VycywgbWludXRlcyBhbmQKLSAqIHNlY29uZHMuIFRoZSBzdWZmaXhlcyBtdXN0IG9jY3VyIGluIG9yZGVyLiBUaGUgc2Vjb25kcyBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKLSAqIGEgZnJhY3Rpb25hbCBjb21wb25lbnQgdG8gZGVjbGFyZSBtaWxsaXNlY29uZHMuIChkZWZhdWx0cyB0byB7QGNvZGUgUFQxNU19KQotICogPC91bD4KLSAqCi0gKiA8cD4KLSAqIEZvciBleGFtcGxlLCB0aGUgc2V0dGluZ3MgdG8gbGltaXQge0Bjb2RlIE1haWxIYW5kbGVyfSB3aXRoIGEgZGVmYXVsdAotICogY2FwYWNpdHkgdG8gb25seSBzZW5kIGEgbWF4aW11bSBvZiB0d28gZW1haWwgbWVzc2FnZXMgZXZlcnkgc2l4IG1pbnV0ZXMgd291bGQKLSAqIGJlIGFzIGZvbGxvd3M6Ci0gKiA8cHJlPgotICoge0Bjb2RlCi0gKiAgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5NYWlsSGFuZGxlci5maWx0ZXIgPSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkR1cmF0aW9uRmlsdGVyCi0gKiAgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5NYWlsSGFuZGxlci5jYXBhY2l0eSA9IDEwMDAKLSAqICBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkR1cmF0aW9uRmlsdGVyLnJlY29yZHMgPSAyTCAqIDEwMDBMCi0gKiAgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5EdXJhdGlvbkZpbHRlci5kdXJhdGlvbiA9IFBUNk0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqCi0gKiBAYXV0aG9yIEphc29uIE1laHJlbnMKLSAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuNQotICovCi1wdWJsaWMgY2xhc3MgRHVyYXRpb25GaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBleHBlY3RlZCByZWNvcmRzIHBlciBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgcmVjb3JkczsKLSAgICAvKioKLSAgICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByYXRlLiBUaGUgZHVyYXRpb24gaXMKLSAgICAgKiBhbHNvIHVzZWQgYXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGZpbHRlciB3aWxsIG5vdCBhbGxvdyByZWNvcmRzCi0gICAgICogd2hlbiBzYXR1cmF0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIGR1cmF0aW9uOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBzZWVuIGZvciB0aGUgY3VycmVudCBkdXJhdGlvbi4gVGhpcyB2YWx1ZSBuZWdhdGl2ZQotICAgICAqIGlmIHNhdHVyYXRlZC4gWmVybyBpcyBjb25zaWRlcmVkIHNhdHVyYXRlZCBidXQgaXMgcmVzZXJ2ZWQgZm9yIHJlY29yZGluZwotICAgICAqIHRoZSBmaXJzdCBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgY291bnQ7Ci0gICAgLyoqCi0gICAgICogVGhlIG1vc3QgcmVjZW50IHJlY29yZCB0aW1lIHNlZW4gZm9yIHRoZSBjdXJyZW50IGR1cmF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBwZWFrOwotICAgIC8qKgotICAgICAqIFRoZSBzdGFydCB0aW1lIGZvciB0aGUgY3VycmVudCBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgc3RhcnQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRHVyYXRpb25GaWx0ZXIoKSB7Ci0gICAgICAgIHRoaXMucmVjb3JkcyA9IGNoZWNrUmVjb3Jkcyhpbml0TG9uZygiLnJlY29yZHMiKSk7Ci0gICAgICAgIHRoaXMuZHVyYXRpb24gPSBjaGVja0R1cmF0aW9uKGluaXRMb25nKCIuZHVyYXRpb24iKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZmlsdGVyIHVzaW5nIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLiBEZWZhdWx0IHZhbHVlcyBhcmUgdXNlZCBpZgotICAgICAqIGFueSBvZiB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHJhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZHMgdGhlIG51bWJlciBvZiByZWNvcmRzIHBlciBkdXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc3VwcHJlc3MgbG9nIHJlY29yZHMgZnJvbQotICAgICAqIGJlaW5nIHB1Ymxpc2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRHVyYXRpb25GaWx0ZXIoZmluYWwgbG9uZyByZWNvcmRzLCBmaW5hbCBsb25nIGR1cmF0aW9uKSB7Ci0gICAgICAgIHRoaXMucmVjb3JkcyA9IGNoZWNrUmVjb3JkcyhyZWNvcmRzKTsKLSAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGNoZWNrRHVyYXRpb24oZHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhpcyBmaWx0ZXIgaXMgZXF1YWwgdG8gYW5vdGhlciBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsgLy9Bdm9pZCBsb2NrcyBhbmQgZGVhbCB3aXRoIHJhcGlkIHN0YXRlIGNoYW5nZXMuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBEdXJhdGlvbkZpbHRlciBvdGhlciA9IChEdXJhdGlvbkZpbHRlcikgb2JqOwotICAgICAgICBpZiAodGhpcy5yZWNvcmRzICE9IG90aGVyLnJlY29yZHMpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLmR1cmF0aW9uICE9IG90aGVyLmR1cmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGM7Ci0gICAgICAgIGZpbmFsIGxvbmcgcDsKLSAgICAgICAgZmluYWwgbG9uZyBzOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGMgPSB0aGlzLmNvdW50OwotICAgICAgICAgICAgcCA9IHRoaXMucGVhazsKLSAgICAgICAgICAgIHMgPSB0aGlzLnN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChvdGhlcikgewotICAgICAgICAgICAgaWYgKGMgIT0gb3RoZXIuY291bnQgfHwgcCAhPSBvdGhlci5wZWFrIHx8IHMgIT0gb3RoZXIuc3RhcnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGZpbHRlciBpcyBhYmxlIHRvIGFjY2VwdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9nCi0gICAgICogcmVjb3JkcyBmb3IgdGhpcyBpbnN0YW50IGluIHRpbWUuIFRoZSByZXN1bHQgaXMgYSBiZXN0LWVmZm9ydCBlc3RpbWF0ZQotICAgICAqIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBvdXQgb2YgZGF0ZSBhcyBzb29uIGFzIGl0IGlzIHByb2R1Y2VkLiBUaGlzCi0gICAgICogbWV0aG9kIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4gbW9uaXRvcmluZyB0aGUgc3RhdGUgb2YgdGhpcyBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbHRlciBpcyBpZGxlOyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZGxlKCkgewotICAgICAgICByZXR1cm4gdGVzdCgwTCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgZmlsdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBoYXNoIGNvZGUgZm9yIHRoaXMgZmlsdGVyLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBoYXNoID0gMzsKLSAgICAgICAgaGFzaCA9IDg5ICogaGFzaCArIChpbnQpICh0aGlzLnJlY29yZHMgXiAodGhpcy5yZWNvcmRzID4+PiAzMikpOwotICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgKGludCkgKHRoaXMuZHVyYXRpb24gXiAodGhpcy5kdXJhdGlvbiA+Pj4gMzIpKTsKLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGxvZyByZWNvcmQgc2hvdWxkIGJlIHB1Ymxpc2hlZC4gVGhpcyBtZXRob2Qgd2lsbAotICAgICAqIG1vZGlmeSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBmaWx0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb3JkIHRoZSBsb2cgcmVjb3JkIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGxvd2VkOyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBnaXZlbiByZWNvcmQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygib3ZlcnJpZGUiKSAvL0pESy02OTU0MjM0Ci0gICAgcHVibGljIGJvb2xlYW4gaXNMb2dnYWJsZShmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgIHJldHVybiBhY2NlcHQocmVjb3JkLmdldE1pbGxpcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgZmlsdGVyIHdpbGwgYWNjZXB0IGxvZyByZWNvcmRzIGZvciB0aGlzIGluc3RhbnQgaW4KLSAgICAgKiB0aW1lLiBUaGUgcmVzdWx0IGlzIGEgYmVzdC1lZmZvcnQgZXN0aW1hdGUgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkIG91dAotICAgICAqIG9mIGRhdGUgYXMgc29vbiBhcyBpdCBpcyBwcm9kdWNlZC4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIHVzZSBpbgotICAgICAqIG1vbml0b3JpbmcgdGhlIHN0YXRlIG9mIHRoaXMgZmlsdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWx0ZXIgaXMgbm90IHNhdHVyYXRlZDsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0KHJlY29yZHMsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmlsdGVyLiBUaGUgcmVzdWx0IGlzIGEKLSAgICAgKiBiZXN0LWVmZm9ydCBlc3RpbWF0ZSBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUgYXMgc29vbiBhcyBpdAotICAgICAqIGlzIHByb2R1Y2VkLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBib29sZWFuIGlkbGU7Ci0gICAgICAgIGJvb2xlYW4gbG9nZ2FibGU7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgZmluYWwgbG9uZyBtaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGlkbGUgPSB0ZXN0KDBMLCBtaWxsaXMpOwotICAgICAgICAgICAgbG9nZ2FibGUgPSB0ZXN0KHJlY29yZHMsIG1pbGxpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAie3JlY29yZHM9IiArIHJlY29yZHMKLSAgICAgICAgICAgICAgICArICIsIGR1cmF0aW9uPSIgKyBkdXJhdGlvbgotICAgICAgICAgICAgICAgICsgIiwgaWRsZT0iICsgaWRsZQotICAgICAgICAgICAgICAgICsgIiwgbG9nZ2FibGU9IiArIGxvZ2dhYmxlICsgJ30nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgZmlsdGVyIHRoYXQgcmV0YWlucyB0aGUgZmlsdGVyIHNldHRpbmdzIGJ1dCBkb2VzCi0gICAgICogbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgZmlsdGVyIHN0YXRlLiBUaGUgbmV3bHkgY3JlYXRlIGNsb25lIGFjdHMgYXMgaWYKLSAgICAgKiBpdCBoYXMgbmV2ZXIgc2VlbiBhbnkgcmVjb3Jkcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgZmlsdGVyLgotICAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhpcyBmaWx0ZXIgaXMgbm90IGFsbG93ZWQgdG8gYmUKLSAgICAgKiBjbG9uZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIER1cmF0aW9uRmlsdGVyIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRHVyYXRpb25GaWx0ZXIgY2xvbmUgPSAoRHVyYXRpb25GaWx0ZXIpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIGNsb25lLmNvdW50ID0gMEw7IC8vUmVzZXQgdGhlIGZpbHRlciBzdGF0ZS4KLSAgICAgICAgY2xvbmUucGVhayA9IDBMOwotICAgICAgICBjbG9uZS5zdGFydCA9IDBMOwotICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoaXMgZmlsdGVyIGlzIG5vdCBzYXR1cmF0ZWQgb3IgYmVsbG93IGEgbWF4aW11bSByYXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgcmVjb3JkcyBhbGxvd2VkIHRvIGJlIHVuZGVyIHRoZSByYXRlLgotICAgICAqIEBwYXJhbSBtaWxsaXMgdGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5vdCBzYXR1cmF0ZWQgb3IgYmVsbG93IHRoZSByYXRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0KGZpbmFsIGxvbmcgbGltaXQsIGZpbmFsIGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIGFzc2VydCBsaW1pdCA+PSAwTCA6IGxpbWl0OwotICAgICAgICBmaW5hbCBsb25nIGM7Ci0gICAgICAgIGZpbmFsIGxvbmcgczsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBjID0gY291bnQ7Ci0gICAgICAgICAgICBzID0gc3RhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYyA+IDBMKSB7IC8vSWYgbm90IHNhdHVyYXRlZC4KLSAgICAgICAgICAgIGlmICgobWlsbGlzIC0gcykgPj0gZHVyYXRpb24gfHwgYyA8IGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7ICAvL1N1YnRyYWN0aW9uIGlzIHVzZWQgdG8gZGVhbCB3aXRoIG51bWVyaWMgb3ZlcmZsb3cuCi0gICAgICAgICAgICBpZiAoKG1pbGxpcyAtIHMpID49IDBMIHx8IGMgPT0gMEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcmVjb3JkIGlzIGxvZ2dhYmxlIGJ5IHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWlsbGlzIHRoZSBsb2cgcmVjb3JkIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWNjZXB0ZWQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KGZpbmFsIGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgIC8vU3VidHJhY3Rpb24gaXMgdXNlZCB0byBkZWFsIHdpdGggbnVtZXJpYyBvdmVyZmxvdyBvZiBtaWxsaXMuCi0gICAgICAgIGJvb2xlYW4gYWxsb3c7Ci0gICAgICAgIGlmIChjb3VudCA+IDBMKSB7IC8vSWYgbm90IHNhdHVyYXRlZC4KLSAgICAgICAgICAgIGlmICgobWlsbGlzIC0gcGVhaykgPiAwTCkgewotICAgICAgICAgICAgICAgIHBlYWsgPSBtaWxsaXM7IC8vUmVjb3JkIHRoZSBuZXcgcGVhay4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9VbmRlciB0aGUgcmF0ZSBpZiB0aGUgY291bnQgaGFzIG5vdCBiZWVuIHJlYWNoZWQuCi0gICAgICAgICAgICBpZiAoY291bnQgIT0gcmVjb3JkcykgewotICAgICAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgICAgICAgICAgYWxsb3cgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKHBlYWsgLSBzdGFydCkgPj0gZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxTDsgIC8vU3RhcnQgYSBuZXcgZHVyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcGVhazsKLSAgICAgICAgICAgICAgICAgICAgYWxsb3cgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gLTFMOyAvL1NhdHVyYXRlIGZvciB0aGUgZHVyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcGVhayArIGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBhbGxvdyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vSWYgdGhlIHNhdHVyYXRpb24gcGVyaW9kIGhhcyBleHBpcmVkIG9yIHRoaXMgaXMgdGhlIGZpcnN0IHJlY29yZAotICAgICAgICAgICAgLy90aGVuIHN0YXJ0IGEgbmV3IGR1cmF0aW9uIGFuZCBhbGxvdyByZWNvcmRzLgotICAgICAgICAgICAgaWYgKChtaWxsaXMgLSBzdGFydCkgPj0gMEwgfHwgY291bnQgPT0gMEwpIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDFMOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlsbGlzOwotICAgICAgICAgICAgICAgIHBlYWsgPSBtaWxsaXM7Ci0gICAgICAgICAgICAgICAgYWxsb3cgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbGxvdyA9IGZhbHNlOyAvL1JlbWFpbiBpbiBhIHNhdHVyYXRlZCBzdGF0ZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWxsb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBsb25nIHZhbHVlIG9yIG11bHRpcGxpY2F0aW9uIGV4cHJlc3Npb24gZnJvbSB0aGUgTG9nTWFuYWdlci4gSWYKLSAgICAgKiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBwYXJzZWQgb3IgaXMgbm90IGRlZmluZWQgdGhlbiBMb25nLk1JTl9WQUxVRSBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHN1ZmZpeCBhIGRvdCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgdGhlIGtleSBuYW1lLgotICAgICAqIEByZXR1cm4gYSBsb25nIHZhbHVlIG9yIExvbmcuTUlOX1ZBTFVFIGlmIHVuYWJsZSB0byBwYXJzZSBvciB1bmRlZmluZWQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBzdWZmaXggaXMgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgaW5pdExvbmcoZmluYWwgU3RyaW5nIHN1ZmZpeCkgewotICAgICAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgICAgICBmaW5hbCBTdHJpbmcgcCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBmcm9tTG9nTWFuYWdlcihwLmNvbmNhdChzdWZmaXgpKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoaXNUaW1lRW50cnkoc3VmZml4LCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMb2dNYW5hZ2VyUHJvcGVydGllcy5wYXJzZUR1cmF0aW9uVG9NaWxsaXModmFsdWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIExpbmthZ2VFcnJvciBpZ25vcmUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMEwpIHsgLy9aZXJvIGlzIGludmFsaWQuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMUw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiB0b2tlbml6ZUxvbmdzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuZW5kc1dpdGgoIkwiKSB8fCBzLmVuZHNXaXRoKCJsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcy5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbXVsdGlwbHlFeGFjdChyZXN1bHQsIExvbmcucGFyc2VMb25nKHMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IExvbmcuTUlOX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IExvbmcuTUlOX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gc3VmZml4IGNhbiBiZSBhIHRpbWUgdW5pdCBhbmQgdGhlIHZhbHVlIGlzCi0gICAgICogZW5jb2RlZCBhcyBhbiBJU08gSVNPLTg2MDEgZHVyYXRpb24gZm9ybWF0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN1ZmZpeCB0aGUgc3VmZml4IHByb3BlcnR5LgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSB0aW1lIGVudHJ5LgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB2YWx1ZSBpcyBlbXB0eS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBhcmd1bWVudCBpcyBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RpbWVFbnRyeShmaW5hbCBTdHJpbmcgc3VmZml4LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICh2YWx1ZS5jaGFyQXQoMCkgPT0gJ1AnIHx8IHZhbHVlLmNoYXJBdCgwKSA9PSAncCcpCi0gICAgICAgICAgICAgICAgJiYgc3VmZml4LmVxdWFscygiLmR1cmF0aW9uIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW55IGxvbmcgdmFsdWUgb3IgbXVsdGlwbGljYXRpb24gZXhwcmVzc2lvbnMgaW50byB0b2tlbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBsb25nIHRva2VucywgbmV2ZXIgZW1wdHkuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplTG9uZ3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ1tdIGU7Ci0gICAgICAgIGZpbmFsIGludCBpID0gdmFsdWUuaW5kZXhPZignKicpOwotICAgICAgICBpZiAoaSA+IC0xICYmIChlID0gdmFsdWUuc3BsaXQoIlxccypcXCpcXHMqIikpLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwIHx8IHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGgoKSAtIDEpID09ICcqJykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZS5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oZVswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlID0gbmV3IFN0cmluZ1tde3ZhbHVlfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdWx0aXBseSBhbmQgY2hlY2sgZm9yIG92ZXJmbG93LiBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoCi0gICAgICoge0Bjb2RlIGphdmEubGFuZy5NYXRoLm11bHRpcGx5RXhhY3R9IHdoZW4gSmF2YU1haWwgcmVxdWlyZXMgSkRLIDguCi0gICAgICoKLSAgICAgKiBAcGFyYW0geCB0aGUgZmlyc3QgdmFsdWUuCi0gICAgICogQHBhcmFtIHkgdGhlIHNlY29uZCB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHggdGltZXMgeS4KLSAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24gaWYgb3ZlcmZsb3cgaXMgZGV0ZWN0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtdWx0aXBseUV4YWN0KGZpbmFsIGxvbmcgeCwgZmluYWwgbG9uZyB5KSB7Ci0gICAgICAgIGxvbmcgciA9IHggKiB5OwotICAgICAgICBpZiAoKChNYXRoLmFicyh4KSB8IE1hdGguYWJzKHkpKSA+Pj4gMzFMICE9IDBMKSkgewotICAgICAgICAgICAgaWYgKCgoeSAhPSAwTCkgJiYgKHIgLyB5ICE9IHgpKQotICAgICAgICAgICAgICAgICAgICB8fCAoeCA9PSBMb25nLk1JTl9WQUxVRSAmJiB5ID09IC0xTCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHJlY29yZCBjb3VudCB0byBhIHZhbGlkIHJlY29yZCBjb3VudC4gSWYgdGhlIHZhbHVlIGlzIG91dCBvZgotICAgICAqIGJvdW5kcyB0aGVuIHRoZSBkZWZhdWx0IHJlY29yZCBjb3VudCBpcyB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY29yZHMgdGhlIHJlY29yZCBjb3VudC4KLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgbnVtYmVyIG9mIHJlY29yZCBjb3VudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGNoZWNrUmVjb3JkcyhmaW5hbCBsb25nIHJlY29yZHMpIHsKLSAgICAgICAgcmV0dXJuIHJlY29yZHMgPiAwTCA/IHJlY29yZHMgOiAxMDAwTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZHVyYXRpb24gdG8gYSB2YWxpZCBkdXJhdGlvbi4gSWYgdGhlIHZhbHVlIGlzIG91dCBvZiBib3VuZHMKLSAgICAgKiB0aGVuIHRoZSBkZWZhdWx0IGR1cmF0aW9uIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uIHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gYSB2YWxpZCBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGNoZWNrRHVyYXRpb24oZmluYWwgbG9uZyBkdXJhdGlvbikgewotICAgICAgICByZXR1cm4gZHVyYXRpb24gPiAwTCA/IGR1cmF0aW9uIDogMTVMICogNjBMICogMTAwMEw7Ci0gICAgfQotfQorLyoNCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLg0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNyBKYXNvbiBNZWhyZW5zLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUNCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudA0KKyAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91DQorICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuDQorICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xDQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYw0KKyAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaA0KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4NCisgKg0KKyAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOg0KKyAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiDQorICogZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlDQorICogZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4NCisgKg0KKyAqIE1vZGlmaWNhdGlvbnM6DQorICogSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMNCisgKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoNCisgKiAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIg0KKyAqDQorICogQ29udHJpYnV0b3Iocyk6DQorICogSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yDQorICogb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0NCisgKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwNCisgKiBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhDQorICogcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcg0KKyAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bw0KKyAqIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQ0KKyAqIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMNCisgKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodA0KKyAqIGhvbGRlci4NCisgKi8NCitwYWNrYWdlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmc7DQorDQoraW1wb3J0IHN0YXRpYyBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXJQcm9wZXJ0aWVzLmZyb21Mb2dNYW5hZ2VyOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOw0KKw0KKy8qKg0KKyAqIEEgZmlsdGVyIHVzZWQgdG8gbGltaXQgbG9nIHJlY29yZHMgYmFzZWQgb24gYSBtYXhpbXVtIGdlbmVyYXRpb24gcmF0ZS4NCisgKg0KKyAqIFRoZSBkdXJhdGlvbiBzcGVjaWZpZWQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSByZWNvcmQgcmF0ZSBhbmQgdGhlIGFtb3VudCBvZg0KKyAqIHRpbWUgdGhlIGZpbHRlciB3aWxsIHJlamVjdCByZWNvcmRzIG9uY2UgdGhlIHJhdGUgaGFzIGJlZW4gZXhjZWVkZWQuIE9uY2UgdGhlDQorICogcmF0ZSBpcyBleGNlZWRlZCByZWNvcmRzIGFyZSBub3QgYWxsb3dlZCB1bnRpbCB0aGUgZHVyYXRpb24gaGFzIGVsYXBzZWQuDQorICoNCisgKiA8cD4NCisgKiBCeSBkZWZhdWx0IGVhY2gge0Bjb2RlIER1cmF0aW9uRmlsdGVyfSBpcyBpbml0aWFsaXplZCB1c2luZyB0aGUgZm9sbG93aW5nDQorICogTG9nTWFuYWdlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgd2hlcmUge0Bjb2RlIDxmaWx0ZXItbmFtZT59IHJlZmVycyB0byB0aGUNCisgKiBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaGFuZGxlci4gSWYgcHJvcGVydGllcyBhcmUgbm90IGRlZmluZWQsIG9yDQorICogY29udGFpbiBpbnZhbGlkIHZhbHVlcywgdGhlbiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkLg0KKyAqDQorICogPHVsPg0KKyAqIDxsaT57QGxpdGVyYWwgPGZpbHRlci1uYW1lPn0ucmVjb3JkcyB0aGUgbWF4IG51bWJlciBvZiByZWNvcmRzIHBlciBkdXJhdGlvbi4NCisgKiBBIG51bWVyaWMgbG9uZyBpbnRlZ2VyIG9yIGEgbXVsdGlwbGljYXRpb24gZXhwcmVzc2lvbiBjYW4gYmUgdXNlZCBhcyB0aGUNCisgKiB2YWx1ZS4gKGRlZmF1bHRzIHRvIHtAY29kZSAxMDAwfSkNCisgKg0KKyAqIDxsaT57QGxpdGVyYWwgPGZpbHRlci1uYW1lPn0uZHVyYXRpb24gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc3VwcHJlc3MNCisgKiBsb2cgcmVjb3JkcyBmcm9tIGJlaW5nIHB1Ymxpc2hlZC4gVGhpcyBpcyBhbHNvIHVzZWQgYXMgZHVyYXRpb24gdG8gZGV0ZXJtaW5lDQorICogdGhlIGxvZyByZWNvcmQgcmF0ZS4gQSBudW1lcmljIGxvbmcgaW50ZWdlciBvciBhIG11bHRpcGxpY2F0aW9uIGV4cHJlc3Npb24NCisgKiBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUuIElmIHRoZSB7QGNvZGUgamF2YS50aW1lfSBwYWNrYWdlIGlzIGF2YWlsYWJsZSB0aGVuDQorICogYW4gSVNPLTg2MDEgZHVyYXRpb24gZm9ybWF0IG9mIHtAY29kZSBQbkRUbkhuTW4ublN9IGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZS4NCisgKiBUaGUgc3VmZml4ZXMgb2YgIkQiLCAiSCIsICJNIiBhbmQgIlMiIGFyZSBmb3IgZGF5cywgaG91cnMsIG1pbnV0ZXMgYW5kDQorICogc2Vjb25kcy4gVGhlIHN1ZmZpeGVzIG11c3Qgb2NjdXIgaW4gb3JkZXIuIFRoZSBzZWNvbmRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aA0KKyAqIGEgZnJhY3Rpb25hbCBjb21wb25lbnQgdG8gZGVjbGFyZSBtaWxsaXNlY29uZHMuIChkZWZhdWx0cyB0byB7QGNvZGUgUFQxNU19KQ0KKyAqIDwvdWw+DQorICoNCisgKiA8cD4NCisgKiBGb3IgZXhhbXBsZSwgdGhlIHNldHRpbmdzIHRvIGxpbWl0IHtAY29kZSBNYWlsSGFuZGxlcn0gd2l0aCBhIGRlZmF1bHQNCisgKiBjYXBhY2l0eSB0byBvbmx5IHNlbmQgYSBtYXhpbXVtIG9mIHR3byBlbWFpbCBtZXNzYWdlcyBldmVyeSBzaXggbWludXRlcyB3b3VsZA0KKyAqIGJlIGFzIGZvbGxvd3M6DQorICogPHByZT4NCisgKiB7QGNvZGUNCisgKiAgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5NYWlsSGFuZGxlci5maWx0ZXIgPSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nLkR1cmF0aW9uRmlsdGVyDQorICogIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuTWFpbEhhbmRsZXIuY2FwYWNpdHkgPSAxMDAwDQorICogIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuRHVyYXRpb25GaWx0ZXIucmVjb3JkcyA9IDJMICogMTAwMEwNCisgKiAgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5EdXJhdGlvbkZpbHRlci5kdXJhdGlvbiA9IFBUNk0NCisgKiB9DQorICogPC9wcmU+DQorICoNCisgKg0KKyAqIEBhdXRob3IgSmFzb24gTWVocmVucw0KKyAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuNQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEdXJhdGlvbkZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGV4cGVjdGVkIHJlY29yZHMgcGVyIGR1cmF0aW9uLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlY29yZHM7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByYXRlLiBUaGUgZHVyYXRpb24gaXMNCisgICAgICogYWxzbyB1c2VkIGFzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBmaWx0ZXIgd2lsbCBub3QgYWxsb3cgcmVjb3Jkcw0KKyAgICAgKiB3aGVuIHNhdHVyYXRlZC4NCisgICAgICovDQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBkdXJhdGlvbjsNCisgICAgLyoqDQorICAgICAqIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBzZWVuIGZvciB0aGUgY3VycmVudCBkdXJhdGlvbi4gVGhpcyB2YWx1ZSBuZWdhdGl2ZQ0KKyAgICAgKiBpZiBzYXR1cmF0ZWQuIFplcm8gaXMgY29uc2lkZXJlZCBzYXR1cmF0ZWQgYnV0IGlzIHJlc2VydmVkIGZvciByZWNvcmRpbmcNCisgICAgICogdGhlIGZpcnN0IGR1cmF0aW9uLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBsb25nIGNvdW50Ow0KKyAgICAvKioNCisgICAgICogVGhlIG1vc3QgcmVjZW50IHJlY29yZCB0aW1lIHNlZW4gZm9yIHRoZSBjdXJyZW50IGR1cmF0aW9uLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBsb25nIHBlYWs7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgc3RhcnQgdGltZSBmb3IgdGhlIGN1cnJlbnQgZHVyYXRpb24uDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgc3RhcnQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcHJvcGVydGllcy4NCisgICAgICovDQorICAgIHB1YmxpYyBEdXJhdGlvbkZpbHRlcigpIHsNCisgICAgICAgIHRoaXMucmVjb3JkcyA9IGNoZWNrUmVjb3Jkcyhpbml0TG9uZygiLnJlY29yZHMiKSk7DQorICAgICAgICB0aGlzLmR1cmF0aW9uID0gY2hlY2tEdXJhdGlvbihpbml0TG9uZygiLmR1cmF0aW9uIikpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdXNpbmcgdGhlIGdpdmVuIHByb3BlcnRpZXMuIERlZmF1bHQgdmFsdWVzIGFyZSB1c2VkIGlmDQorICAgICAqIGFueSBvZiB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHJhbmdlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcGVyIGR1cmF0aW9uLg0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc3VwcHJlc3MgbG9nIHJlY29yZHMgZnJvbQ0KKyAgICAgKiBiZWluZyBwdWJsaXNoZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgRHVyYXRpb25GaWx0ZXIoZmluYWwgbG9uZyByZWNvcmRzLCBmaW5hbCBsb25nIGR1cmF0aW9uKSB7DQorICAgICAgICB0aGlzLnJlY29yZHMgPSBjaGVja1JlY29yZHMocmVjb3Jkcyk7DQorICAgICAgICB0aGlzLmR1cmF0aW9uID0gY2hlY2tEdXJhdGlvbihkdXJhdGlvbik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgdGhpcyBmaWx0ZXIgaXMgZXF1YWwgdG8gYW5vdGhlciBmaWx0ZXIuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBvYmogdGhlIGdpdmVuIG9iamVjdC4NCisgICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsIG90aGVyd2lzZSBmYWxzZS4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgew0KKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7IC8vQXZvaWQgbG9ja3MgYW5kIGRlYWwgd2l0aCByYXBpZCBzdGF0ZSBjaGFuZ2VzLg0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBEdXJhdGlvbkZpbHRlciBvdGhlciA9IChEdXJhdGlvbkZpbHRlcikgb2JqOw0KKyAgICAgICAgaWYgKHRoaXMucmVjb3JkcyAhPSBvdGhlci5yZWNvcmRzKSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT0gb3RoZXIuZHVyYXRpb24pIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBsb25nIGM7DQorICAgICAgICBmaW5hbCBsb25nIHA7DQorICAgICAgICBmaW5hbCBsb25nIHM7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsNCisgICAgICAgICAgICBjID0gdGhpcy5jb3VudDsNCisgICAgICAgICAgICBwID0gdGhpcy5wZWFrOw0KKyAgICAgICAgICAgIHMgPSB0aGlzLnN0YXJ0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgc3luY2hyb25pemVkIChvdGhlcikgew0KKyAgICAgICAgICAgIGlmIChjICE9IG90aGVyLmNvdW50IHx8IHAgIT0gb3RoZXIucGVhayB8fCBzICE9IG90aGVyLnN0YXJ0KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGZpbHRlciBpcyBhYmxlIHRvIGFjY2VwdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9nDQorICAgICAqIHJlY29yZHMgZm9yIHRoaXMgaW5zdGFudCBpbiB0aW1lLiBUaGUgcmVzdWx0IGlzIGEgYmVzdC1lZmZvcnQgZXN0aW1hdGUNCisgICAgICogYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlIGFzIHNvb24gYXMgaXQgaXMgcHJvZHVjZWQuIFRoaXMNCisgICAgICogbWV0aG9kIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4gbW9uaXRvcmluZyB0aGUgc3RhdGUgb2YgdGhpcyBmaWx0ZXIuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsdGVyIGlzIGlkbGU7IGZhbHNlIG90aGVyd2lzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzSWRsZSgpIHsNCisgICAgICAgIHJldHVybiB0ZXN0KDBMLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgZmlsdGVyLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBmb3IgdGhpcyBmaWx0ZXIuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIGludCBoYXNoID0gMzsNCisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAoaW50KSAodGhpcy5yZWNvcmRzIF4gKHRoaXMucmVjb3JkcyA+Pj4gMzIpKTsNCisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAoaW50KSAodGhpcy5kdXJhdGlvbiBeICh0aGlzLmR1cmF0aW9uID4+PiAzMikpOw0KKyAgICAgICAgcmV0dXJuIGhhc2g7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBsb2cgcmVjb3JkIHNob3VsZCBiZSBwdWJsaXNoZWQuIFRoaXMgbWV0aG9kIHdpbGwNCisgICAgICogbW9kaWZ5IHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGlzIGZpbHRlci4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlY29yZCB0aGUgbG9nIHJlY29yZCB0byBjaGVjay4NCisgICAgICogQHJldHVybiB0cnVlIGlmIGFsbG93ZWQ7IGZhbHNlIG90aGVyd2lzZS4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBnaXZlbiByZWNvcmQgaXMgbnVsbC4NCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJvdmVycmlkZSIpIC8vSkRLLTY5NTQyMzQNCisgICAgcHVibGljIGJvb2xlYW4gaXNMb2dnYWJsZShmaW5hbCBMb2dSZWNvcmQgcmVjb3JkKSB7DQorICAgICAgICByZXR1cm4gYWNjZXB0KHJlY29yZC5nZXRNaWxsaXMoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgdGhpcyBmaWx0ZXIgd2lsbCBhY2NlcHQgbG9nIHJlY29yZHMgZm9yIHRoaXMgaW5zdGFudCBpbg0KKyAgICAgKiB0aW1lLiBUaGUgcmVzdWx0IGlzIGEgYmVzdC1lZmZvcnQgZXN0aW1hdGUgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkIG91dA0KKyAgICAgKiBvZiBkYXRlIGFzIHNvb24gYXMgaXQgaXMgcHJvZHVjZWQuIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4NCisgICAgICogbW9uaXRvcmluZyB0aGUgc3RhdGUgb2YgdGhpcyBmaWx0ZXIuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsdGVyIGlzIG5vdCBzYXR1cmF0ZWQ7IGZhbHNlIG90aGVyd2lzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoKSB7DQorICAgICAgICByZXR1cm4gdGVzdChyZWNvcmRzLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmaWx0ZXIuIFRoZSByZXN1bHQgaXMgYQ0KKyAgICAgKiBiZXN0LWVmZm9ydCBlc3RpbWF0ZSBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUgYXMgc29vbiBhcyBpdA0KKyAgICAgKiBpcyBwcm9kdWNlZC4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZpbHRlci4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgYm9vbGVhbiBpZGxlOw0KKyAgICAgICAgYm9vbGVhbiBsb2dnYWJsZTsNCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgew0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorICAgICAgICAgICAgaWRsZSA9IHRlc3QoMEwsIG1pbGxpcyk7DQorICAgICAgICAgICAgbG9nZ2FibGUgPSB0ZXN0KHJlY29yZHMsIG1pbGxpcyk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAie3JlY29yZHM9IiArIHJlY29yZHMNCisgICAgICAgICAgICAgICAgKyAiLCBkdXJhdGlvbj0iICsgZHVyYXRpb24NCisgICAgICAgICAgICAgICAgKyAiLCBpZGxlPSIgKyBpZGxlDQorICAgICAgICAgICAgICAgICsgIiwgbG9nZ2FibGU9IiArIGxvZ2dhYmxlICsgJ30nOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIGZpbHRlciB0aGF0IHJldGFpbnMgdGhlIGZpbHRlciBzZXR0aW5ncyBidXQgZG9lcw0KKyAgICAgKiBub3QgaW5jbHVkZSB0aGUgY3VycmVudCBmaWx0ZXIgc3RhdGUuIFRoZSBuZXdseSBjcmVhdGUgY2xvbmUgYWN0cyBhcyBpZg0KKyAgICAgKiBpdCBoYXMgbmV2ZXIgc2VlbiBhbnkgcmVjb3Jkcy4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBmaWx0ZXIuDQorICAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhpcyBmaWx0ZXIgaXMgbm90IGFsbG93ZWQgdG8gYmUNCisgICAgICogY2xvbmVkLg0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHByb3RlY3RlZCBEdXJhdGlvbkZpbHRlciBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7DQorICAgICAgICBmaW5hbCBEdXJhdGlvbkZpbHRlciBjbG9uZSA9IChEdXJhdGlvbkZpbHRlcikgc3VwZXIuY2xvbmUoKTsNCisgICAgICAgIGNsb25lLmNvdW50ID0gMEw7IC8vUmVzZXQgdGhlIGZpbHRlciBzdGF0ZS4NCisgICAgICAgIGNsb25lLnBlYWsgPSAwTDsNCisgICAgICAgIGNsb25lLnN0YXJ0ID0gMEw7DQorICAgICAgICByZXR1cm4gY2xvbmU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENoZWNrcyBpZiB0aGlzIGZpbHRlciBpcyBub3Qgc2F0dXJhdGVkIG9yIGJlbGxvdyBhIG1heGltdW0gcmF0ZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgcmVjb3JkcyBhbGxvd2VkIHRvIGJlIHVuZGVyIHRoZSByYXRlLg0KKyAgICAgKiBAcGFyYW0gbWlsbGlzIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm90IHNhdHVyYXRlZCBvciBiZWxsb3cgdGhlIHJhdGUuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdChmaW5hbCBsb25nIGxpbWl0LCBmaW5hbCBsb25nIG1pbGxpcykgew0KKyAgICAgICAgYXNzZXJ0IGxpbWl0ID49IDBMIDogbGltaXQ7DQorICAgICAgICBmaW5hbCBsb25nIGM7DQorICAgICAgICBmaW5hbCBsb25nIHM7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsNCisgICAgICAgICAgICBjID0gY291bnQ7DQorICAgICAgICAgICAgcyA9IHN0YXJ0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGMgPiAwTCkgeyAvL0lmIG5vdCBzYXR1cmF0ZWQuDQorICAgICAgICAgICAgaWYgKChtaWxsaXMgLSBzKSA+PSBkdXJhdGlvbiB8fCBjIDwgbGltaXQpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsgIC8vU3VidHJhY3Rpb24gaXMgdXNlZCB0byBkZWFsIHdpdGggbnVtZXJpYyBvdmVyZmxvdy4NCisgICAgICAgICAgICBpZiAoKG1pbGxpcyAtIHMpID49IDBMIHx8IGMgPT0gMEwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSByZWNvcmQgaXMgbG9nZ2FibGUgYnkgdGltZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgbG9nIHJlY29yZCBtaWxsaXNlY29uZHMuDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhY2NlcHRlZCBmYWxzZSBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChmaW5hbCBsb25nIG1pbGxpcykgew0KKyAgICAgICAgLy9TdWJ0cmFjdGlvbiBpcyB1c2VkIHRvIGRlYWwgd2l0aCBudW1lcmljIG92ZXJmbG93IG9mIG1pbGxpcy4NCisgICAgICAgIGJvb2xlYW4gYWxsb3c7DQorICAgICAgICBpZiAoY291bnQgPiAwTCkgeyAvL0lmIG5vdCBzYXR1cmF0ZWQuDQorICAgICAgICAgICAgaWYgKChtaWxsaXMgLSBwZWFrKSA+IDBMKSB7DQorICAgICAgICAgICAgICAgIHBlYWsgPSBtaWxsaXM7IC8vUmVjb3JkIHRoZSBuZXcgcGVhay4NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy9VbmRlciB0aGUgcmF0ZSBpZiB0aGUgY291bnQgaGFzIG5vdCBiZWVuIHJlYWNoZWQuDQorICAgICAgICAgICAgaWYgKGNvdW50ICE9IHJlY29yZHMpIHsNCisgICAgICAgICAgICAgICAgKytjb3VudDsNCisgICAgICAgICAgICAgICAgYWxsb3cgPSB0cnVlOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmICgocGVhayAtIHN0YXJ0KSA+PSBkdXJhdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxTDsgIC8vU3RhcnQgYSBuZXcgZHVyYXRpb24uDQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBlYWs7DQorICAgICAgICAgICAgICAgICAgICBhbGxvdyA9IHRydWU7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IC0xTDsgLy9TYXR1cmF0ZSBmb3IgdGhlIGR1cmF0aW9uLg0KKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwZWFrICsgZHVyYXRpb247DQorICAgICAgICAgICAgICAgICAgICBhbGxvdyA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAvL0lmIHRoZSBzYXR1cmF0aW9uIHBlcmlvZCBoYXMgZXhwaXJlZCBvciB0aGlzIGlzIHRoZSBmaXJzdCByZWNvcmQNCisgICAgICAgICAgICAvL3RoZW4gc3RhcnQgYSBuZXcgZHVyYXRpb24gYW5kIGFsbG93IHJlY29yZHMuDQorICAgICAgICAgICAgaWYgKChtaWxsaXMgLSBzdGFydCkgPj0gMEwgfHwgY291bnQgPT0gMEwpIHsNCisgICAgICAgICAgICAgICAgY291bnQgPSAxTDsNCisgICAgICAgICAgICAgICAgc3RhcnQgPSBtaWxsaXM7DQorICAgICAgICAgICAgICAgIHBlYWsgPSBtaWxsaXM7DQorICAgICAgICAgICAgICAgIGFsbG93ID0gdHJ1ZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBhbGxvdyA9IGZhbHNlOyAvL1JlbWFpbiBpbiBhIHNhdHVyYXRlZCBzdGF0ZS4NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYWxsb3c7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlYWRzIGEgbG9uZyB2YWx1ZSBvciBtdWx0aXBsaWNhdGlvbiBleHByZXNzaW9uIGZyb20gdGhlIExvZ01hbmFnZXIuIElmDQorICAgICAqIHRoZSB2YWx1ZSBjYW4gbm90IGJlIHBhcnNlZCBvciBpcyBub3QgZGVmaW5lZCB0aGVuIExvbmcuTUlOX1ZBTFVFIGlzDQorICAgICAqIHJldHVybmVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VmZml4IGEgZG90IGNoYXJhY3RlciBmb2xsb3dlZCBieSB0aGUga2V5IG5hbWUuDQorICAgICAqIEByZXR1cm4gYSBsb25nIHZhbHVlIG9yIExvbmcuTUlOX1ZBTFVFIGlmIHVuYWJsZSB0byBwYXJzZSBvciB1bmRlZmluZWQuDQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc3VmZml4IGlzIG51bGwuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGxvbmcgaW5pdExvbmcoZmluYWwgU3RyaW5nIHN1ZmZpeCkgew0KKyAgICAgICAgbG9uZyByZXN1bHQgPSAwTDsNCisgICAgICAgIGZpbmFsIFN0cmluZyBwID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBmcm9tTG9nTWFuYWdlcihwLmNvbmNhdChzdWZmaXgpKTsNCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpICE9IDApIHsNCisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsNCisgICAgICAgICAgICBpZiAoaXNUaW1lRW50cnkoc3VmZml4LCB2YWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IExvZ01hbmFnZXJQcm9wZXJ0aWVzLnBhcnNlRHVyYXRpb25Ub01pbGxpcyh2YWx1ZSk7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBpZ25vcmUpIHsNCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTGlua2FnZUVycm9yIGlnbm9yZSkgew0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMEwpIHsgLy9aZXJvIGlzIGludmFsaWQuDQorICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxTDsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiB0b2tlbml6ZUxvbmdzKHZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmVuZHNXaXRoKCJMIikgfHwgcy5lbmRzV2l0aCgibCIpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBzLmxlbmd0aCgpIC0gMSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG11bHRpcGx5RXhhY3QocmVzdWx0LCBMb25nLnBhcnNlTG9uZyhzKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7DQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMb25nLk1JTl9WQUxVRTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVzdWx0ID0gTG9uZy5NSU5fVkFMVUU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBzdWZmaXggY2FuIGJlIGEgdGltZSB1bml0IGFuZCB0aGUgdmFsdWUgaXMNCisgICAgICogZW5jb2RlZCBhcyBhbiBJU08gSVNPLTg2MDEgZHVyYXRpb24gZm9ybWF0Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggcHJvcGVydHkuDQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5Lg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVudHJ5IGlzIGEgdGltZSBlbnRyeS4NCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHZhbHVlIGlzIGVtcHR5Lg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBhcmd1bWVudCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGltZUVudHJ5KGZpbmFsIFN0cmluZyBzdWZmaXgsIGZpbmFsIFN0cmluZyB2YWx1ZSkgew0KKyAgICAgICAgcmV0dXJuICh2YWx1ZS5jaGFyQXQoMCkgPT0gJ1AnIHx8IHZhbHVlLmNoYXJBdCgwKSA9PSAncCcpDQorICAgICAgICAgICAgICAgICYmIHN1ZmZpeC5lcXVhbHMoIi5kdXJhdGlvbiIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBQYXJzZSBhbnkgbG9uZyB2YWx1ZSBvciBtdWx0aXBsaWNhdGlvbiBleHByZXNzaW9ucyBpbnRvIHRva2Vucy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlLg0KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGxvbmcgdG9rZW5zLCBuZXZlciBlbXB0eS4NCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbnVsbC4NCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIGV4cHJlc3Npb24gaXMgaW52YWxpZC4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplTG9uZ3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBTdHJpbmdbXSBlOw0KKyAgICAgICAgZmluYWwgaW50IGkgPSB2YWx1ZS5pbmRleE9mKCcqJyk7DQorICAgICAgICBpZiAoaSA+IC0xICYmIChlID0gdmFsdWUuc3BsaXQoIlxccypcXCpcXHMqIikpLmxlbmd0aCAhPSAwKSB7DQorICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbih2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChlLmxlbmd0aCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oZVswXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gbmV3IFN0cmluZ1tde3ZhbHVlfTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBNdWx0aXBseSBhbmQgY2hlY2sgZm9yIG92ZXJmbG93LiBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoDQorICAgICAqIHtAY29kZSBqYXZhLmxhbmcuTWF0aC5tdWx0aXBseUV4YWN0fSB3aGVuIEphdmFNYWlsIHJlcXVpcmVzIEpESyA4Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0geCB0aGUgZmlyc3QgdmFsdWUuDQorICAgICAqIEBwYXJhbSB5IHRoZSBzZWNvbmQgdmFsdWUuDQorICAgICAqIEByZXR1cm4geCB0aW1lcyB5Lg0KKyAgICAgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24gaWYgb3ZlcmZsb3cgaXMgZGV0ZWN0ZWQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIG11bHRpcGx5RXhhY3QoZmluYWwgbG9uZyB4LCBmaW5hbCBsb25nIHkpIHsNCisgICAgICAgIGxvbmcgciA9IHggKiB5Ow0KKyAgICAgICAgaWYgKCgoTWF0aC5hYnMoeCkgfCBNYXRoLmFicyh5KSkgPj4+IDMxTCAhPSAwTCkpIHsNCisgICAgICAgICAgICBpZiAoKCh5ICE9IDBMKSAmJiAociAvIHkgIT0geCkpDQorICAgICAgICAgICAgICAgICAgICB8fCAoeCA9PSBMb25nLk1JTl9WQUxVRSAmJiB5ID09IC0xTCkpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29udmVydHMgcmVjb3JkIGNvdW50IHRvIGEgdmFsaWQgcmVjb3JkIGNvdW50LiBJZiB0aGUgdmFsdWUgaXMgb3V0IG9mDQorICAgICAqIGJvdW5kcyB0aGVuIHRoZSBkZWZhdWx0IHJlY29yZCBjb3VudCBpcyB1c2VkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcmVjb3JkcyB0aGUgcmVjb3JkIGNvdW50Lg0KKyAgICAgKiBAcmV0dXJuIGEgdmFsaWQgbnVtYmVyIG9mIHJlY29yZCBjb3VudC4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGxvbmcgY2hlY2tSZWNvcmRzKGZpbmFsIGxvbmcgcmVjb3Jkcykgew0KKyAgICAgICAgcmV0dXJuIHJlY29yZHMgPiAwTCA/IHJlY29yZHMgOiAxMDAwTDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29udmVydHMgdGhlIGR1cmF0aW9uIHRvIGEgdmFsaWQgZHVyYXRpb24uIElmIHRoZSB2YWx1ZSBpcyBvdXQgb2YgYm91bmRzDQorICAgICAqIHRoZW4gdGhlIGRlZmF1bHQgZHVyYXRpb24gaXMgdXNlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbiB0byBjaGVjay4NCisgICAgICogQHJldHVybiBhIHZhbGlkIGR1cmF0aW9uLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjaGVja0R1cmF0aW9uKGZpbmFsIGxvbmcgZHVyYXRpb24pIHsNCisgICAgICAgIHJldHVybiBkdXJhdGlvbiA+IDBMID8gZHVyYXRpb24gOiAxNUwgKiA2MEwgKiAxMDAwTDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyUHJvcGVydGllcy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvTG9nTWFuYWdlclByb3BlcnRpZXMuamF2YQppbmRleCBhNzFmZjFlLi4yNWIyMDcyIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyUHJvcGVydGllcy5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXJQcm9wZXJ0aWVzLmphdmEKQEAgLTEsMjAgKzEsMjAgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNiBKYXNvbiBNZWhyZW5zLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE3IEphc29uIE1laHJlbnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTY2Niw3ICs2NjYsNyBAQAogICAgICAgICBmaW5hbCBDbGFzczw/PiB0aGlzQ2xhc3MgPSBMb2dNYW5hZ2VyUHJvcGVydGllcy5jbGFzczsKICAgICAgICAgYXNzZXJ0IE1vZGlmaWVyLmlzRmluYWwodGhpc0NsYXNzLmdldE1vZGlmaWVycygpKSA6IHRoaXNDbGFzczsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiB0cmFjZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gdHJhY2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBUaHJvd2FibGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IoKS5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBzdGUgOiB0LmdldFN0YWNrVHJhY2UoKSkgewogICAgICAgICAgICAgICAgIGlmICghdGhpc0NsYXNzLmdldE5hbWUoKS5lcXVhbHMoc3RlLmdldENsYXNzTmFtZSgpKSkgewpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvTWFpbEhhbmRsZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL01haWxIYW5kbGVyLmphdmEKaW5kZXggMThjMzZiZC4uZTY4NzliYSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvTWFpbEhhbmRsZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9NYWlsSGFuZGxlci5qYXZhCkBAIC0xLDIwICsxLDIwIEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTYgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNyBKYXNvbiBNZWhyZW5zLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00Myw3ICs0Myw2IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLnN1bi5tYWlsLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyUHJvcGVydGllcy5mcm9tTG9nTWFuYWdlcjsKIGltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwpAQCAtMTI1LDggKzEyNCw4IEBACiAgKiBhdHRhY2htZW50LiAoZGVmYXVsdCBpcyBubyBhdHRhY2htZW50cykKICAqCiAgKiA8bGk+Jmx0O2hhbmRsZXItbmFtZSZndDsuYXR0YWNobWVudC5uYW1lcyBhIGNvbW1hIHNlcGFyYXRlZAotICogbGlzdCBvZiBuYW1lcyBvciA8dHQ+Rm9ybWF0dGVyPC90dD4gY2xhc3MgbmFtZXMgb2YgZWFjaCBhdHRhY2htZW50LiAgVGhlCi0gKiBhdHRhY2htZW50IGZpbGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiBhbnkgbGluZSBicmVha3MuCisgKiBsaXN0IG9mIG5hbWVzIG9yIDx0dD5Gb3JtYXR0ZXI8L3R0PiBjbGFzcyBuYW1lcyBvZiBlYWNoIGF0dGFjaG1lbnQuICBBbGwKKyAqIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBhdHRhY2htZW50IG5hbWVzLgogICogKGRlZmF1bHQgaXMge0BsaW5rcGxhaW4gamF2YS51dGlsLmxvZ2dpbmcuRm9ybWF0dGVyI3RvU3RyaW5nKCkgdG9TdHJpbmd9CiAgKiBvZiB0aGUgYXR0YWNobWVudCBmb3JtYXR0ZXIpCiAgKgpAQCAtMjE2LDggKzIxNSw5IEBACiAgKgogICogPGxpPiZsdDtoYW5kbGVyLW5hbWUmZ3Q7LnN1YmplY3QgdGhlIG5hbWUgb2YgYQogICogPHR0PkZvcm1hdHRlcjwvdHQ+IGNsYXNzIG9yIHN0cmluZyBsaXRlcmFsIHVzZWQgdG8gY3JlYXRlIHRoZSBzdWJqZWN0IGxpbmUuCi0gKiBUaGUgZW1wdHkgc3RyaW5nIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbm8gc3ViamVjdC4gIFRoZSBzdWJqZWN0IGxpbmUgbXVzdAotICogbm90IGNvbnRhaW4gYW55IGxpbmUgYnJlYWtzLiAoZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZykKKyAqIFRoZSBlbXB0eSBzdHJpbmcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBubyBzdWJqZWN0LiAgQWxsIGNvbnRyb2wgY2hhcmFjdGVycworICogYXJlIHJlbW92ZWQgZnJvbSB0aGUgc3ViamVjdCBsaW5lLiAoZGVmYXVsdHMgdG8ge0BsaW5rcGxhaW4KKyAqIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29sbGVjdG9yRm9ybWF0dGVyIENvbGxlY3RvckZvcm1hdHRlcn0uKQogICoKICAqIDxsaT4mbHQ7aGFuZGxlci1uYW1lJmd0Oy5wdXNoRmlsdGVyIHRoZSBuYW1lIG9mIGEKICAqIDx0dD5GaWx0ZXI8L3R0PiBjbGFzcyB1c2VkIHRvIHRyaWdnZXIgYW4gZWFybHkgcHVzaC4KQEAgLTIzOCw5ICsyMzgsMTIgQEAKICAqICAgICAgPGxpPklmIHNldCB0byBhIHZhbHVlIG9mIDx0dD5yZXNvbHZlPC90dD4sIHRoZSA8dHQ+SGFuZGxlcjwvdHQ+IHdpbGwKICAqICAgICAgdmVyaWZ5IGFsbCBsb2NhbCBzZXR0aW5ncyBhbmQgdHJ5IHRvIHJlc29sdmUgdGhlIHJlbW90ZSBob3N0IG5hbWUgd2l0aAogICogICAgICB0aGUgZG9tYWluIG5hbWUgc2VydmVyLgorICogICAgICA8bGk+SWYgc2V0IHRvIGEgdmFsdWUgb2YgPHR0PmxvZ2luPC90dD4sIHRoZSA8dHQ+SGFuZGxlcjwvdHQ+IHdpbGwKKyAqICAgICAgdmVyaWZ5IGFsbCBsb2NhbCBzZXR0aW5ncyBhbmQgdHJ5IHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aAorICogICAgICB0aGUgZW1haWwgc2VydmVyLgogICogICAgICA8bGk+SWYgc2V0IHRvIGEgdmFsdWUgb2YgPHR0PnJlbW90ZTwvdHQ+LCB0aGUgPHR0PkhhbmRsZXI8L3R0PiB3aWxsCi0gKiAgICAgIHZlcmlmeSBhbGwgbG9jYWwgc2V0dGluZ3MgYW5kIHRyeSB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggdGhlCi0gKiAgICAgIGVtYWlsIHNlcnZlci4KKyAqICAgICAgdmVyaWZ5IGFsbCBsb2NhbCBzZXR0aW5ncywgdHJ5IHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUKKyAqICAgICAgZW1haWwgc2VydmVyLCBhbmQgdHJ5IHRvIHZlcmlmeSB0aGUgZW52ZWxvcGUgb2YgdGhlIGVtYWlsIG1lc3NhZ2UuCiAgKiA8L3VsPgogICogSWYgdGhpcyA8dHQ+SGFuZGxlcjwvdHQ+IGlzIG9ubHkgaW1wbGljaXRseSBjbG9zZWQgYnkgdGhlCiAgKiA8dHQ+TG9nTWFuYWdlcjwvdHQ+LCB0aGVuIHZlcmlmaWNhdGlvbiBzaG91bGQgYmUgdHVybmVkIG9uLgpAQCAtMjk1LDE3ICsyOTgsMTggQEAKICAqCiAgKiA8cD4KICAqIDxiPkF0dGFjaG1lbnRzOjwvYj4KLSAqIFRoaXMgPHR0PkhhbmRsZXI8L3R0PiBhbGxvd3MgbXVsdGlwbGUgYXR0YWNobWVudHMgcGVyIGVhY2ggZW1haWwuCi0gKiBUaGUgYXR0YWNobWVudCBvcmRlciBtYXBzIGRpcmVjdGx5IHRvIHRoZSBhcnJheSBpbmRleCBvcmRlciBpbiB0aGlzCi0gKiA8dHQ+SGFuZGxlcjwvdHQ+IHdpdGggemVybyBpbmRleCBiZWluZyB0aGUgZmlyc3QgYXR0YWNobWVudC4gIFRoZSBudW1iZXIgb2YKLSAqIGF0dGFjaG1lbnQgZm9ybWF0dGVycyBjb250cm9scyB0aGUgbnVtYmVyIG9mIGF0dGFjaG1lbnRzIHBlciBlbWFpbCBhbmQKLSAqIHRoZSBjb250ZW50IHR5cGUgb2YgZWFjaCBhdHRhY2htZW50LiAgVGhlIGF0dGFjaG1lbnQgZmlsdGVycyBkZXRlcm1pbmUgaWYgYQotICogPHR0PkxvZ1JlY29yZDwvdHQ+IHdpbGwgYmUgaW5jbHVkZWQgaW4gYW4gYXR0YWNobWVudC4gIElmIGFuIGF0dGFjaG1lbnQKLSAqIGZpbHRlciBpcyA8dHQ+bnVsbDwvdHQ+IHRoZW4gYWxsIHJlY29yZHMgYXJlIGluY2x1ZGVkIGZvciB0aGF0IGF0dGFjaG1lbnQuCi0gKiBBdHRhY2htZW50cyB3aXRob3V0IGNvbnRlbnQgd2lsbCBiZSBvbWl0dGVkIGZyb20gZW1haWwgbWVzc2FnZS4gIFRoZQotICogYXR0YWNobWVudCBuYW1lIGZvcm1hdHRlcnMgY3JlYXRlIHRoZSBmaWxlIG5hbWUgZm9yIGFuIGF0dGFjaG1lbnQuCi0gKiBDdXN0b20gYXR0YWNobWVudCBuYW1lIGZvcm1hdHRlcnMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW4gYXR0YWNobWVudCBuYW1lCi0gKiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGF0dGFjaG1lbnQuCisgKiBUaGlzIDx0dD5IYW5kbGVyPC90dD4gYWxsb3dzIG11bHRpcGxlIGF0dGFjaG1lbnRzIHBlciBlYWNoIGVtYWlsIG1lc3NhZ2UuCisgKiBUaGUgcHJlc2VuY2Ugb2YgYW4gYXR0YWNobWVudCBmb3JtYXR0ZXIgd2lsbCBjaGFuZ2UgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUKKyAqIGVtYWlsIG1lc3NhZ2UgdG8gYSBtdWx0aS1wYXJ0IG1lc3NhZ2UuICBUaGUgYXR0YWNobWVudCBvcmRlciBtYXBzIGRpcmVjdGx5IHRvCisgKiB0aGUgYXJyYXkgaW5kZXggb3JkZXIgaW4gdGhpcyA8dHQ+SGFuZGxlcjwvdHQ+IHdpdGggemVybyBpbmRleCBiZWluZyB0aGUKKyAqIGZpcnN0IGF0dGFjaG1lbnQuICBUaGUgbnVtYmVyIG9mIGF0dGFjaG1lbnQgZm9ybWF0dGVycyBjb250cm9scyB0aGUgbnVtYmVyIG9mCisgKiBhdHRhY2htZW50cyBwZXIgZW1haWwgYW5kIHRoZSBjb250ZW50IHR5cGUgb2YgZWFjaCBhdHRhY2htZW50LiAgVGhlCisgKiBhdHRhY2htZW50IGZpbHRlcnMgZGV0ZXJtaW5lIGlmIGEgPHR0PkxvZ1JlY29yZDwvdHQ+IHdpbGwgYmUgaW5jbHVkZWQgaW4gYW4KKyAqIGF0dGFjaG1lbnQuICBJZiBhbiBhdHRhY2htZW50IGZpbHRlciBpcyA8dHQ+bnVsbDwvdHQ+IHRoZW4gYWxsIHJlY29yZHMgYXJlCisgKiBpbmNsdWRlZCBmb3IgdGhhdCBhdHRhY2htZW50LiAgQXR0YWNobWVudHMgd2l0aG91dCBjb250ZW50IHdpbGwgYmUgb21pdHRlZAorICogZnJvbSBlbWFpbCBtZXNzYWdlLiAgVGhlIGF0dGFjaG1lbnQgbmFtZSBmb3JtYXR0ZXJzIGNyZWF0ZSB0aGUgZmlsZSBuYW1lIGZvcgorICogYW4gYXR0YWNobWVudC4gIEN1c3RvbSBhdHRhY2htZW50IG5hbWUgZm9ybWF0dGVycyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhbgorICogYXR0YWNobWVudCBuYW1lIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgYXR0YWNobWVudC4KICAqCiAgKiA8cD4KICAqIDxiPlB1c2ggTGV2ZWwgYW5kIFB1c2ggRmlsdGVyOjwvYj4KQEAgLTM5MSw3ICszOTUsNyBAQAogICAgICAqIDQuIE1VVEVYX1JFUE9SVCB3aGVuIGN5Y2xlIG9mIHJlY29yZHMgaXMgZGV0ZWN0ZWQuCiAgICAgICogNS4gTVVURVhUX0xJTktBR0Ugd2hlbiBhIGxpbmthZ2UgZXJyb3IgaXMgcmVwb3J0ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8SW50ZWdlcj4gTVVURVggPSBuZXcgVGhyZWFkTG9jYWw8SW50ZWdlcj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxJbnRlZ2VyPiBNVVRFWCA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CiAgICAgLyoqCiAgICAgICogVGhlIG1hcmtlciBvYmplY3QgdXNlZCB0byByZXBvcnQgYSBwdWJsaXNoaW5nIHN0YXRlLgogICAgICAqIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGJvZHkgZmlsdGVyIGluZGV4ICgtMSkuCkBAIC00MjcsNyArNDMxLDcgQEAKICAgICAvKioKICAgICAgKiBIb2xkcyB0aGUgc2Vzc2lvbiBvYmplY3QgdXNlZCB0byBnZW5lcmF0ZSBlbWFpbHMuCiAgICAgICogU2Vzc2lvbnMgY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAqIFNlZSBCVUdJRCA2MjI4MzkxIGFuZCBLIDYyNzguCisgICAgICogU2VlIEpESy02MjI4MzkxIGFuZCBLIDYyNzguCiAgICAgICovCiAgICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247CiAgICAgLyoqCkBAIC05NzAsOCArOTc0LDcgQEAKICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNYW5hZ2VyID0gZW07CiAgICAgICAgICAgICAgICBzdXBlci5zZXRFcnJvck1hbmFnZXIoZW0pOyAvL1RyeSB0byBmcmVlIHN1cGVyIGVycm9yIG1hbmFnZXIuCiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIExpbmthZ2VFcnJvciBpZ25vcmUpIHsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IExpbmthZ2VFcnJvciBpZ25vcmUpIHsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAwMyw3ICsxMDA2LDcgQEAKICAgICAgICAgICAgIGlmIChuZXdGaWx0ZXIgIT0gZmlsdGVyKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJNYXRjaGVzKC0xKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbmV3RmlsdGVyOworICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBuZXdGaWx0ZXI7IC8vVm9sYXRpbGUgYWNjZXNzLgogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjEwLDcgKzEyMTMsOSBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgPHR0PkF1dGhlbnRpY2F0b3I8L3R0PiB1c2VkIHRvIGxvZ2luIHRvIHRoZSBlbWFpbCBzZXJ2ZXIuCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIGEgcGFzc3dvcmQgb3IgbnVsbCBpZiBub25lIGlzIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBhIHBhc3N3b3JkLCBlbXB0eSBhcnJheSBjYW4gYmUgdXNlZCB0byBvbmx5IHN1cHBseSBhCisgICAgICogdXNlciBuYW1lIHNldCBieSA8dHQ+bWFpbC51c2VyPC90dD4gcHJvcGVydHksIG9yIG51bGwgaWYgbm8gY3JlZGVudGlhbHMKKyAgICAgKiBhcmUgcmVxdWlyZWQuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlCiAgICAgICogY2FsbGVyIGRvZXMgbm90IGhhdmUgPHR0PkxvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIik8L3R0Pi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwdXNoLgpAQCAtMTIyOCw2ICsxMjMzLDkgQEAKICAgICAvKioKICAgICAgKiBBIHByaXZhdGUgaG9vayB0byBoYW5kbGUgcG9zc2libGUgZnV0dXJlIG92ZXJyaWRlcy4gU2VlIHB1YmxpYyBtZXRob2QuCiAgICAgICogQHBhcmFtIGF1dGggc2VlIHB1YmxpYyBtZXRob2QuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlCisgICAgICogY2FsbGVyIGRvZXMgbm90IGhhdmUgPHR0PkxvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIik8L3R0Pi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwdXNoLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZXRBdXRoZW50aWNhdG9yMChmaW5hbCBBdXRoZW50aWNhdG9yIGF1dGgpIHsKICAgICAgICAgY2hlY2tBY2Nlc3MoKTsKQEAgLTEzMTksNyArMTMyNyw3IEBACiAgICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICBmaWx0ZXJzID0gZW1wdHlGaWx0ZXJBcnJheSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsdGVycyA9IGNvcHlPZihmaWx0ZXJzLCBmaWx0ZXJzLmxlbmd0aCwgRmlsdGVyW10uY2xhc3MpOworICAgICAgICAgICAgZmlsdGVycyA9IEFycmF5cy5jb3B5T2YoZmlsdGVycywgZmlsdGVycy5sZW5ndGgsIEZpbHRlcltdLmNsYXNzKTsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRGb3JtYXR0ZXJzLmxlbmd0aCAhPSBmaWx0ZXJzLmxlbmd0aCkgewpAQCAtMTM3Miw3ICsxMzgwLDcgQEAKICAgICAgICAgaWYgKGZvcm1hdHRlcnMubGVuZ3RoID09IDApIHsgLy9OdWxsIGNoZWNrIGFuZCBsZW5ndGggY2hlY2suCiAgICAgICAgICAgICBmb3JtYXR0ZXJzID0gZW1wdHlGb3JtYXR0ZXJBcnJheSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9ybWF0dGVycyA9IGNvcHlPZihmb3JtYXR0ZXJzLAorICAgICAgICAgICAgZm9ybWF0dGVycyA9IEFycmF5cy5jb3B5T2YoZm9ybWF0dGVycywKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVycy5sZW5ndGgsIEZvcm1hdHRlcltdLmNsYXNzKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWF0dGVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZXJzW2ldID09IG51bGwpIHsKQEAgLTE0MDgsOCArMTQxNiw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXR0YWNobWVudCBmaWxlIG5hbWUgZm9yIGVhY2ggYXR0YWNobWVudC4gIFRoZSBjYWxsZXIgbXVzdAotICAgICAqIGVuc3VyZSB0aGF0IHRoZSBhdHRhY2htZW50IGZpbGUgbmFtZXMgZG8gbm90IGNvbnRhaW4gYW55IGxpbmUgYnJlYWtzLgorICAgICAqIFNldHMgdGhlIGF0dGFjaG1lbnQgZmlsZSBuYW1lIGZvciBlYWNoIGF0dGFjaG1lbnQuICBBbGwgY29udHJvbAorICAgICAqIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYXR0YWNobWVudCBuYW1lcy4KICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIHNldCBvZiBjdXN0b20gZm9ybWF0dGVycy4KICAgICAgKiBAcGFyYW0gbmFtZXMgYW4gYXJyYXkgb2YgbmFtZXMuCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlCkBAIC0xNDY0LDEwICsxNDcyLDEwIEBACiAgICAgICogdHlwaWNhbGx5IHJldHVybiBhbiBlbXB0eSBzdHJpbmcuIEluc3RlYWQgb2YgYmVpbmcgdXNlZCB0byBmb3JtYXQKICAgICAgKiByZWNvcmRzLCBpdCBpcyB1c2VkIHRvIGdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGVudHMgb2YgYW4KICAgICAgKiBhdHRhY2htZW50LiAgVGhlIDx0dD5nZXRUYWlsPC90dD4gbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUKLSAgICAgKiBhdHRhY2htZW50IGZpbGUgbmFtZSBhbmQgcmVzZXQgYW55IGZvcm1hdHRlciBjb2xsZWN0ZWQgc3RhdGUuICBUaGUKLSAgICAgKiBmb3JtYXR0ZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgYXR0YWNobWVudCBmaWxlIG5hbWUgZG9lcyBub3QgY29udGFpbiBhbnkKLSAgICAgKiBsaW5lIGJyZWFrcy4gIFRoZSA8dHQ+dG9TdHJpbmc8L3R0PiBtZXRob2Qgb2YgdGhlIGdpdmVuIGZvcm1hdHRlciBzaG91bGQKLSAgICAgKiBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgYSB1c2VmdWwgYXR0YWNobWVudCBmaWxlIG5hbWUsIGlmIHBvc3NpYmxlLgorICAgICAqIGF0dGFjaG1lbnQgZmlsZSBuYW1lIGFuZCByZXNldCBhbnkgZm9ybWF0dGVyIGNvbGxlY3RlZCBzdGF0ZS4gIEFsbAorICAgICAqIGNvbnRyb2wgY2hhcmFjdGVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0IG9mIHRoZSBmb3JtYXR0ZXIuICBUaGUKKyAgICAgKiA8dHQ+dG9TdHJpbmc8L3R0PiBtZXRob2Qgb2YgdGhlIGdpdmVuIGZvcm1hdHRlciBzaG91bGQgYmUgb3ZlcnJpZGRlbiB0bworICAgICAqIHByb3ZpZGUgYSB1c2VmdWwgYXR0YWNobWVudCBmaWxlIG5hbWUsIGlmIHBvc3NpYmxlLgogICAgICAqIEBwYXJhbSBmb3JtYXR0ZXJzIGFuZCBhcnJheSBvZiBhdHRhY2htZW50IG5hbWUgZm9ybWF0dGVycy4KICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCB0aGUKICAgICAgKiBjYWxsZXIgZG9lcyBub3QgaGF2ZSA8dHQ+TG9nZ2luZ1Blcm1pc3Npb24oImNvbnRyb2wiKTwvdHQ+LgpAQCAtMTQ4NCw3ICsxNDkyLDggQEAKICAgICAgICAgaWYgKGZvcm1hdHRlcnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBlbXB0eUZvcm1hdHRlckFycmF5KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3JtYXR0ZXJzID0gY29weU9mKGZvcm1hdHRlcnMsIGZvcm1hdHRlcnMubGVuZ3RoLCBGb3JtYXR0ZXJbXS5jbGFzcyk7CisgICAgICAgICAgICBmb3JtYXR0ZXJzID0gQXJyYXlzLmNvcHlPZihmb3JtYXR0ZXJzLCBmb3JtYXR0ZXJzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyW10uY2xhc3MpOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYXR0ZXJzLmxlbmd0aDsgKytpKSB7CkBAIC0xNDk1LDcgKzE1MDQsOCBAQAogCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudEZvcm1hdHRlcnMubGVuZ3RoICE9IGZvcm1hdHRlcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgYXR0YWNobWVudE1pc21hdGNoKHRoaXMuYXR0YWNobWVudEZvcm1hdHRlcnMubGVuZ3RoLCBmb3JtYXR0ZXJzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgdGhyb3cgYXR0YWNobWVudE1pc21hdGNoKHRoaXMuYXR0YWNobWVudEZvcm1hdHRlcnMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVycy5sZW5ndGgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNXcml0aW5nKSB7CkBAIC0xNTE3LDggKzE1MjcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBsaXRlcmFsIHN0cmluZyBmb3IgdGhlIGVtYWlsIHN1YmplY3QuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKLSAgICAgKiB0aGUgc3ViamVjdCBsaW5lIGRvZXMgbm90IGNvbnRhaW4gYW55IGxpbmUgYnJlYWtzLgorICAgICAqIFNldHMgYSBsaXRlcmFsIHN0cmluZyBmb3IgdGhlIGVtYWlsIHN1YmplY3QuICBBbGwgY29udHJvbCBjaGFyYWN0ZXJzIGFyZQorICAgICAqIHJlbW92ZWQgZnJvbSB0aGUgc3ViamVjdCBsaW5lLgogICAgICAqIEBwYXJhbSBzdWJqZWN0IGEgbm9uIDx0dD5udWxsPC90dD4gc3RyaW5nLgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZQogICAgICAqIGNhbGxlciBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCkBAIC0xNTQzLDggKzE1NTMsOCBAQAogICAgICAqIGVtcHR5IHN0cmluZy4gIFRoaXMgZm9ybWF0dGVyIGlzIHVzZWQgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhCiAgICAgICogc3VtbWFyeSBhYm91dCB3aGF0IGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZW1haWwuICBUaGUKICAgICAgKiA8dHQ+Z2V0VGFpbDwvdHQ+IG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHN1YmplY3QgYW5kIHJlc2V0Ci0gICAgICogYW55IGZvcm1hdHRlciBjb2xsZWN0ZWQgc3RhdGUuICBUaGUgZm9ybWF0dGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlCi0gICAgICogc3ViamVjdCBsaW5lIGRvZXMgbm90IGNvbnRhaW4gYW55IGxpbmUgYnJlYWtzLiAgVGhlIDx0dD50b1N0cmluZzwvdHQ+CisgICAgICogYW55IGZvcm1hdHRlciBjb2xsZWN0ZWQgc3RhdGUuICBBbGwgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICogd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGZvcm1hdHRlciBvdXRwdXQuICBUaGUgPHR0PnRvU3RyaW5nPC90dD4KICAgICAgKiBtZXRob2Qgb2YgdGhlIGdpdmVuIGZvcm1hdHRlciBzaG91bGQgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIGEgdXNlZnVsCiAgICAgICogc3ViamVjdCwgaWYgcG9zc2libGUuCiAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgc3ViamVjdCBmb3JtYXR0ZXIuCkBAIC0xNTg4LDkgKzE1OTgsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnJvck1hbmFnZXIuZXJyb3IobnVsbCwgZXgsIGNvZGUpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIEdMQVNTRklTSF8yMTI1OCkgewotICAgICAgICAgICAgcmVwb3J0TGlua2FnZUVycm9yKEdMQVNTRklTSF8yMTI1OCwgY29kZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIExpbmthZ2VFcnJvciBHTEFTU0ZJU0hfMjEyNTgpIHsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IExpbmthZ2VFcnJvciBHTEFTU0ZJU0hfMjEyNTgpIHsKICAgICAgICAgICAgIHJlcG9ydExpbmthZ2VFcnJvcihHTEFTU0ZJU0hfMjEyNTgsIGNvZGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYxMCwyMCArMTYxOCwxOSBAQAogICAgICAqIHRoaXMgdHlwZSBvZiBjb252ZXJzaW9uLiAgQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGJvZHkKICAgICAgKiBzaW5jZSB0aGUgYXR0YWNobWVudHMgYXJlIGNvbXB1dGVkIGJ5IGZpbGVuYW1lLgogICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBmb3IgdW5pdCB0ZXN0aW5nLgotICAgICAqIEBwYXJhbSBoZWFkIGFueSBoZWFkIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gY2h1bmsgYW55IGNoYXIgc2VxdWVuY2Ugb3IgbnVsbC4KICAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgbWltZSB0eXBlIG9yIG51bGwgZm9yIHRleHQvcGxhaW4uCiAgICAgICovCi0gICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlT2YoU3RyaW5nIGhlYWQpIHsKLSAgICAgICAgaWYgKCFpc0VtcHR5KGhlYWQpKSB7CisgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlT2YoQ2hhclNlcXVlbmNlIGNodW5rKSB7CisgICAgICAgIGlmICghaXNFbXB0eShjaHVuaykpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBNQVhfQ0hBUlMgPSAyNTsKLSAgICAgICAgICAgIGlmIChoZWFkLmxlbmd0aCgpID4gTUFYX0NIQVJTKSB7Ci0gICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3Vic3RyaW5nKDAsIE1BWF9DSEFSUyk7CisgICAgICAgICAgICBpZiAoY2h1bmsubGVuZ3RoKCkgPiBNQVhfQ0hBUlMpIHsKKyAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnN1YlNlcXVlbmNlKDAsIE1BWF9DSEFSUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZ2V0RW5jb2RpbmdOYW1lKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4KLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGhlYWQuZ2V0Qnl0ZXMoY2hhcnNldCkpOwotCisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGIgPSBjaHVuay50b1N0cmluZygpLmdldEJ5dGVzKGNoYXJzZXQpOworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwogICAgICAgICAgICAgICAgIGFzc2VydCBpbi5tYXJrU3VwcG9ydGVkKCkgOiBpbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gVVJMQ29ubmVjdGlvbi5ndWVzc0NvbnRlbnRUeXBlRnJvbVN0cmVhbShpbik7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBJT0UpIHsKQEAgLTE2NDEsMTQgKzE2NDgsMjYgQEAKICAgICAgKiBQYWNrYWdlLXByaXZhdGUgZm9yIHVuaXQgdGVzdGluZy4KICAgICAgKgogICAgICAqIEBwYXJhbSBmIHRoZSBmb3JtYXR0ZXIgb3IgbnVsbC4KLSAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgbWltZSB0eXBlIG9yIHRleHQvcGxhaW4uCisgICAgICogQHJldHVybiByZXR1cm4gdGhlIG1pbWUgdHlwZSBvciBudWxsLCBtZWFuaW5nIHRleHQvcGxhaW4uCiAgICAgICogQHNpbmNlIEphdmFNYWlsIDEuNS42CiAgICAgICovCiAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlT2YoZmluYWwgRm9ybWF0dGVyIGYpIHsKKyAgICAgICAgYXNzZXJ0IFRocmVhZC5ob2xkc0xvY2sodGhpcyk7CiAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gZ2V0Q29udGVudFR5cGUoZi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gayA9IGYuZ2V0Q2xhc3MoKTsgayAhPSBGb3JtYXR0ZXIuY2xhc3M7CiAgICAgICAgICAgICAgICAgICAgIGsgPSBrLmdldFN1cGVyY2xhc3MoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gay5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBrLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcm5hbEVycm9yIEpESzgwNTc5MTkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGsuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWR4ID0gbmFtZS5pbmRleE9mKCckJykgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgKGlkeCA9IG5hbWUuaW5kZXhPZigibWwiLCBpZHgpKSA+IC0xOyBpZHggKz0gMikgewogICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMCkgewpAQCAtMTY2Myw3ICsxNjgyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAvKioKQEAgLTE2ODgsMTEgKzE3MDcsMjYgQEAKICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIG5vQ29udGVudCkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR4dCA9IG5vQ29udGVudC5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgICBpZiAoIWlzRW1wdHkodHh0KSkgewotICAgICAgICAgICAgICAgIGZvciAoOyB0ICE9IG51bGw7IHQgPSB0LmdldENhdXNlKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5vQ29udGVudC5nZXRDbGFzcygpID09IHQuZ2V0Q2xhc3MoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR4dC5lcXVhbHModC5nZXRNZXNzYWdlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9Ob3QgYWxsIEphdmFNYWlsIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IEpESyAxLjQgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vY2hhaW5pbmcuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXNlID09IG51bGwgJiYgdCBpbnN0YW5jZW9mIE1lc3NhZ2luZ0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICgoTWVzc2FnaW5nRXhjZXB0aW9uKSB0KS5nZXROZXh0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gY2F1c2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0RlYWwgd2l0aCBleGNlc3NpdmUgY2F1c2UgY2hhaW5zIGFuZCBjeWNsaWMgdGhyb3dhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbGltaXQgPT0gKDEgPDwgMTYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy9HaXZlIHVwLgorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMTc0Niw4ICsxNzgwLDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgLnVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBMaW5rYWdlRXJyb3IgaWdub3JlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgTGlua2FnZUVycm9yIGlnbm9yZSkgewogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgTVVURVguc2V0KGlkeCk7CkBAIC0xNzkwLDEwICsxODIzLDEwIEBACiAgICAgICogU2V0IHRoZSBjb250ZW50IGZvciBhIHBhcnQgdXNpbmcgdGhlIGVuY29kaW5nIGFzc2lnbmVkIHRvIHRoZSBoYW5kbGVyLgogICAgICAqIEBwYXJhbSBwYXJ0IHRoZSBwYXJ0IHRvIGFzc2lnbi4KICAgICAgKiBAcGFyYW0gYnVmIHRoZSBmb3JtYXR0ZWQgZGF0YS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWltZSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBtaW1lIHR5cGUgb3IgbnVsbCwgbWVhbmluZyB0ZXh0L3BsYWluLgogICAgICAqIEB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Q29udGVudChNaW1lQm9keVBhcnQgcGFydCwgQ2hhclNlcXVlbmNlIGJ1ZiwgU3RyaW5nIHR5cGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBzZXRDb250ZW50KE1pbWVQYXJ0IHBhcnQsIENoYXJTZXF1ZW5jZSBidWYsIFN0cmluZyB0eXBlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXQgPSBnZXRFbmNvZGluZ05hbWUoKTsKICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiAhInRleHQvcGxhaW4iLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKICAgICAgICAgICAgIHR5cGUgPSBjb250ZW50V2l0aEVuY29kaW5nKHR5cGUsIGNoYXJzZXQpOwpAQCAtMTgyMSw3ICsxODU0LDcgQEAKICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRUeXBlIGN0ID0gbmV3IENvbnRlbnRUeXBlKHR5cGUpOwogICAgICAgICAgICAgY3Quc2V0UGFyYW1ldGVyKCJjaGFyc2V0IiwgTWltZVV0aWxpdHkubWltZUNoYXJzZXQoZW5jb2RpbmcpKTsKICAgICAgICAgICAgIGVuY29kaW5nID0gY3QudG9TdHJpbmcoKTsgLy9TZWUgamF2YXgubWFpbC5pbnRlcm5ldC5Db250ZW50VHlwZS4KLSAgICAgICAgICAgIGlmICghaXNFbXB0eShlbmNvZGluZykpIHsKKyAgICAgICAgICAgIGlmICghaXNFbXB0eShlbmNvZGluZykpIHsgLy9TdXBwb3J0IHByZSBLNTY4Ny4KICAgICAgICAgICAgICAgICB0eXBlID0gZW5jb2Rpbmc7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE1lc3NhZ2luZ0V4Y2VwdGlvbiBNRSkgewpAQCAtMTg5NSw3ICsxOTI4LDcgQEAKICAgICAgICAgZmluYWwgaW50IGV4cGVjdCA9IHRoaXMuYXR0YWNobWVudEZvcm1hdHRlcnMubGVuZ3RoOwogICAgICAgICBmaW5hbCBpbnQgY3VycmVudCA9IHRoaXMuYXR0YWNobWVudE5hbWVzLmxlbmd0aDsKICAgICAgICAgaWYgKGN1cnJlbnQgIT0gZXhwZWN0KSB7Ci0gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnROYW1lcyA9IGNvcHlPZihhdHRhY2htZW50TmFtZXMsIGV4cGVjdCwKKyAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudE5hbWVzID0gQXJyYXlzLmNvcHlPZihhdHRhY2htZW50TmFtZXMsIGV4cGVjdCwKICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyW10uY2xhc3MpOwogICAgICAgICAgICAgZml4ZWQgPSBjdXJyZW50ICE9IDA7CiAgICAgICAgIH0KQEAgLTE5MjYsNyArMTk1OSw3IEBACiAgICAgICAgIGZpbmFsIGludCBleHBlY3QgPSB0aGlzLmF0dGFjaG1lbnRGb3JtYXR0ZXJzLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IGN1cnJlbnQgPSB0aGlzLmF0dGFjaG1lbnRGaWx0ZXJzLmxlbmd0aDsKICAgICAgICAgaWYgKGN1cnJlbnQgIT0gZXhwZWN0KSB7Ci0gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRGaWx0ZXJzID0gY29weU9mKGF0dGFjaG1lbnRGaWx0ZXJzLCBleHBlY3QsCisgICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRGaWx0ZXJzID0gQXJyYXlzLmNvcHlPZihhdHRhY2htZW50RmlsdGVycywgZXhwZWN0LAogICAgICAgICAgICAgICAgICAgICBGaWx0ZXJbXS5jbGFzcyk7CiAgICAgICAgICAgICBjbGVhck1hdGNoZXMoY3VycmVudCk7CiAgICAgICAgICAgICBmaXhlZCA9IGN1cnJlbnQgIT0gMDsKQEAgLTE5NTAsMzYgKzE5ODMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgZ2l2ZW4gYXJyYXkuIENhbiBiZSByZW1vdmVkIHdoZW4gSmF2YSBNYWlsIHJlcXVpcmVzIEphdmEgMS42LgotICAgICAqIEBwYXJhbSBhIHRoZSBvcmlnaW5hbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBuZXcgc2l6ZS4KLSAgICAgKiBAcmV0dXJuIG5ldyBjb3B5Ci0gICAgICogQHNpbmNlIEphdmFNYWlsIDEuNS41Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY29weU9mKGZpbmFsIGludFtdIGEsIGZpbmFsIGludCBsZW4pIHsKLSAgICAgICAgZmluYWwgaW50W10gY29weSA9IG5ldyBpbnRbbGVuXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCBjb3B5LCAwLCBNYXRoLm1pbihsZW4sIGEubGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiBjb3B5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgZ2l2ZW4gYXJyYXkgdG8gYSBuZXcgYXJyYXkgdHlwZS4KLSAgICAgKiBDYW4gYmUgcmVtb3ZlZCB3aGVuIEphdmEgTWFpbCByZXF1aXJlcyBKYXZhIDEuNi4KLSAgICAgKiBAcGFyYW0gPFU+IHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgb3JpZ2luYWwgYXJyYXkKLSAgICAgKiBAcGFyYW0gPFQ+IHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkKLSAgICAgKiBAcGFyYW0gYSB0aGUgb3JpZ2luYWwgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbmV3IHNpemUuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGFycmF5IHR5cGUuCi0gICAgICogQHJldHVybiBuZXcgY29weQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgc3RhdGljIDxULFU+IFRbXSBjb3B5T2YoVVtdIGEsIGludCBsZW4sIENsYXNzPD8gZXh0ZW5kcyBUW10+IHR5cGUpIHsKLSAgICAgICAgZmluYWwgVFtdIGNvcHkgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZSh0eXBlLmdldENvbXBvbmVudFR5cGUoKSwgbGVuKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCBjb3B5LCAwLCBNYXRoLm1pbihsZW4sIGEubGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiBjb3B5OwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNpemUgdG8gemVybyBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGJ1ZmZlci4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CkBAIC0yMDAzLDggKzIwMDYsOCBAQAogICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBjYXBhY2l0eTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnQgbGVuICE9IGNhcGFjaXR5IDogbGVuOwotICAgICAgICB0aGlzLmRhdGEgPSBjb3B5T2YoZGF0YSwgbmV3Q2FwYWNpdHksIExvZ1JlY29yZFtdLmNsYXNzKTsKLSAgICAgICAgdGhpcy5tYXRjaGVkID0gY29weU9mKG1hdGNoZWQsIG5ld0NhcGFjaXR5KTsKKyAgICAgICAgdGhpcy5kYXRhID0gQXJyYXlzLmNvcHlPZihkYXRhLCBuZXdDYXBhY2l0eSwgTG9nUmVjb3JkW10uY2xhc3MpOworICAgICAgICB0aGlzLm1hdGNoZWQgPSBBcnJheXMuY29weU9mKG1hdGNoZWQsIG5ld0NhcGFjaXR5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNjMsNyArMjA2Niw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBPYmplY3QgY2FuaWRhdGU7CiAgICAgICAgICAgICBPYmplY3QgcmVzdWx0OwotICAgICAgICAgICAgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzZWVuID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisgICAgICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNlZW4gPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludGVybihzZWVuLCB0aGlzLmVycm9yTWFuYWdlcik7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBTZWN1cml0eUV4Y2VwdGlvbiBzZSkgewpAQCAtMjIxNiwxMSArMjIxOSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBhIHN0cmluZyB2YWx1ZSBmb3IgbnVsbCBvciBlbXB0eS4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nLgorICAgICAqIENoZWNrcyBhIGNoYXIgc2VxdWVuY2UgdmFsdWUgZm9yIG51bGwgb3IgZW1wdHkuCisgICAgICogQHBhcmFtIHMgdGhlIGNoYXIgc2VxdWVuY2UuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgbnVsbCBvciB6ZXJvIGxlbmd0aC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoZmluYWwgU3RyaW5nIHMpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoZmluYWwgQ2hhclNlcXVlbmNlIHMpIHsKICAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDA7CiAgICAgfQogCkBAIC0yMzM3LDkgKzIzNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2ldID0gTG9nTWFuYWdlclByb3BlcnRpZXMubmV3Rm9ybWF0dGVyKG5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gbGl0ZXJhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV0gPSBUYWlsTmFtZUZvcm1hdHRlci5vZihuYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gbGl0ZXJhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENsYXNzQ2FzdEV4Y2VwdGlvbiBsaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtpXSA9IFRhaWxOYW1lRm9ybWF0dGVyLm9mKG5hbWVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VjdXJpdHlFeGNlcHRpb24gU0UpIHsKQEAgLTIzODAsOSArMjM4Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld09iamVjdEZyb20obmFtZSwgQXV0aGVudGljYXRvci5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VjdXJpdHlFeGNlcHRpb24gU0UpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgU0U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBsaXRlcmFsQXV0aCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGggPSBEZWZhdWx0QXV0aGVudGljYXRvci5vZihuYW1lKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gbGl0ZXJhbEF1dGgpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICB8IENsYXNzQ2FzdEV4Y2VwdGlvbiBsaXRlcmFsQXV0aCkgewogICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGggPSBEZWZhdWx0QXV0aGVudGljYXRvci5vZihuYW1lKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gRSkgewogICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihFLmdldE1lc3NhZ2UoKSwgRSwgRXJyb3JNYW5hZ2VyLk9QRU5fRkFJTFVSRSk7CkBAIC0yNDgxLDEwICsyNDgyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VjdXJpdHlFeGNlcHRpb24gU0UpIHsKICAgICAgICAgICAgIHRocm93IFNFOyAvL0F2b2lkIGNhdGNoIGFsbC4KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBVRUUpIHsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gVUVFKSB7CiAgICAgICAgICAgICByZXBvcnRFcnJvcihVRUUuZ2V0TWVzc2FnZSgpLCBVRUUsIEVycm9yTWFuYWdlci5PUEVOX0ZBSUxVUkUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIFJFKSB7Ci0gICAgICAgICAgICByZXBvcnRFcnJvcihSRS5nZXRNZXNzYWdlKCksIFJFLCBFcnJvck1hbmFnZXIuT1BFTl9GQUlMVVJFKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ5Nyw5ICsyNDk2LDcgQEAKICAgICAgICAgRXJyb3JNYW5hZ2VyIGVtOwogICAgICAgICB0cnkgeyAvL1RyeSB0byBzaGFyZSB0aGUgc3VwZXIgZXJyb3IgbWFuYWdlci4KICAgICAgICAgICAgIGVtID0gc3VwZXIuZ2V0RXJyb3JNYW5hZ2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICBlbSA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIExpbmthZ2VFcnJvciBpZ25vcmUpIHsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IExpbmthZ2VFcnJvciBpZ25vcmUpIHsKICAgICAgICAgICAgIGVtID0gbnVsbDsKICAgICAgICAgfQogCkBAIC0yNjQxLDI3ICsyNjM4LDI0IEBACiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTdWJqZWN0KGZpbmFsIFN0cmluZyBwKSB7CiAgICAgICAgIGFzc2VydCBUaHJlYWQuaG9sZHNMb2NrKHRoaXMpOwogICAgICAgICBTdHJpbmcgbmFtZSA9IGZyb21Mb2dNYW5hZ2VyKHAuY29uY2F0KCIuc3ViamVjdCIpKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeyAvL1NvZnQgZGVwZW5kZW5jeSBvbiBDb2xsZWN0b3JGb3JtYXR0ZXIuCisgICAgICAgICAgICBuYW1lID0gImNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmcuQ29sbGVjdG9yRm9ybWF0dGVyIjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChoYXNWYWx1ZShuYW1lKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICB0aGlzLnN1YmplY3RGb3JtYXR0ZXIgPSBMb2dNYW5hZ2VyUHJvcGVydGllcy5uZXdGb3JtYXR0ZXIobmFtZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBTZWN1cml0eUV4Y2VwdGlvbiBTRSkgewogICAgICAgICAgICAgICAgIHRocm93IFNFOyAvL0F2b2lkIGNhdGNoIGFsbC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gbGl0ZXJhbFN1YmplY3QpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnN1YmplY3RGb3JtYXR0ZXIgPSBUYWlsTmFtZUZvcm1hdHRlci5vZihuYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzQ2FzdEV4Y2VwdGlvbiBsaXRlcmFsU3ViamVjdCkgeworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB8IENsYXNzQ2FzdEV4Y2VwdGlvbiBsaXRlcmFsU3ViamVjdCkgewogICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdEZvcm1hdHRlciA9IFRhaWxOYW1lRm9ybWF0dGVyLm9mKG5hbWUpOwogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIEUpIHsKICAgICAgICAgICAgICAgICB0aGlzLnN1YmplY3RGb3JtYXR0ZXIgPSBUYWlsTmFtZUZvcm1hdHRlci5vZihuYW1lKTsKICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihFLmdldE1lc3NhZ2UoKSwgRSwgRXJyb3JNYW5hZ2VyLk9QRU5fRkFJTFVSRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdWJqZWN0Rm9ybWF0dGVyID0gVGFpbE5hbWVGb3JtYXR0ZXIub2YobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5zdWJqZWN0Rm9ybWF0dGVyID09IG51bGwpIHsgLy9FbnN1cmUgbm90IG51bGwuCi0gICAgICAgICAgICB0aGlzLnN1YmplY3RGb3JtYXR0ZXIgPSBUYWlsTmFtZUZvcm1hdHRlci5vZigiIik7CisgICAgICAgIH0gZWxzZSB7IC8vVXNlciBoYXMgZm9yY2VkIGVtcHR5IG9yIGxpdGVyYWwgbnVsbC4KKyAgICAgICAgICAgIHRoaXMuc3ViamVjdEZvcm1hdHRlciA9IFRhaWxOYW1lRm9ybWF0dGVyLm9mKG5hbWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNzQ4LDcgKzI3NDIsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgZW52ZWxvcGVGb3IobXNnLCBwcmlvcml0eSk7CiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgY2NsID0gZ2V0QW5kU2V0Q29udGV4dENsYXNzTG9hZGVyKE1BSUxIQU5ETEVSX0xPQURFUik7Ci0gICAgICAgICAgICB0cnkgeyAgLy9CVUdJRCA4MDI1MjUxCisgICAgICAgICAgICB0cnkgeyAgLy9KREstODAyNTI1MQogICAgICAgICAgICAgICAgIFRyYW5zcG9ydC5zZW5kKG1zZyk7IC8vQ2FsbHMgc2F2ZSBjaGFuZ2VzLgogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBnZXRBbmRTZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2NsKTsKQEAgLTI4MzMsNyArMjgyNyw2IEBACiAgICAgICAgICAgICBpbml0U2Vzc2lvbigpOwogICAgICAgICB9CiAgICAgICAgIE1pbWVNZXNzYWdlIG1zZyA9IG5ldyBNaW1lTWVzc2FnZShzZXNzaW9uKTsKLSAgICAgICAgbXNnLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uRnJvbShjb21wYXJhdG9yLCBwdXNoTGV2ZWwsIHB1c2hGaWx0ZXIpKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUGFydHMgYXJlIGxhemlseSBjcmVhdGVkIHdoZW4gYW4gYXR0YWNobWVudCBwZXJmb3JtcyBhIGdldEhlYWQKQEAgLTI4NDYsMTMgKzI4MzksMTkgQEAKICAgICAgICAgICogVGhlIGJ1ZmZlcnMgYXJlIGxhemlseSBjcmVhdGVkIHdoZW4gdGhlIHBhcnQgcmVxdWlyZXMgYSBnZXRIZWFkLgogICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nQnVpbGRlcltdIGJ1ZmZlcnMgPSBuZXcgU3RyaW5nQnVpbGRlcltwYXJ0cy5sZW5ndGhdOwotCi0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbnVsbDsKKyAgICAgICAgZmluYWwgTWltZVBhcnQgYm9keTsKKyAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBtc2cuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb25Gcm9tKAorICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZXIoKSwgZ2V0RmlsdGVyKCksIHN1YmplY3RGb3JtYXR0ZXIpKTsKKyAgICAgICAgICAgIGJvZHkgPSBtc2c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb25Gcm9tKAorICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yLCBwdXNoTGV2ZWwsIHB1c2hGaWx0ZXIpKTsKKyAgICAgICAgICAgIGJvZHkgPSBjcmVhdGVCb2R5UGFydCgpOworICAgICAgICB9CiAKICAgICAgICAgYXBwZW5kU3ViamVjdChtc2csIGhlYWQoc3ViamVjdEZvcm1hdHRlcikpOwotCi0gICAgICAgIGZpbmFsIE1pbWVCb2R5UGFydCBib2R5ID0gY3JlYXRlQm9keVBhcnQoKTsKICAgICAgICAgZmluYWwgRm9ybWF0dGVyIGJvZHlGb3JtYXQgPSBnZXRGb3JtYXR0ZXIoKTsKICAgICAgICAgZmluYWwgRmlsdGVyIGJvZHlGaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKIApAQCAtMjg3MSw5ICsyODcwLDcgQEAKICAgICAgICAgICAgICAgICBsbWYgPSBib2R5RmlsdGVyOwogICAgICAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZCA9IGhlYWQoYm9keUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaGVhZCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVPZihoZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChoZWFkKGJvZHlGb3JtYXQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGZvcm1hdChib2R5Rm9ybWF0LCByKSk7CkBAIC0yOTA3LDcgKzI5MDQsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZm9ybWF0dGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsICYmICFsb2NhbGUuZXF1YWxzKGxhc3RMb2NhbGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJvZHkgIT0gbXNnICYmIGxvY2FsZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbG9jYWxlLmVxdWFscyhsYXN0TG9jYWxlKSkgewogICAgICAgICAgICAgICAgICAgICBhcHBlbmRDb250ZW50TGFuZyhtc2csIGxvY2FsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsgIC8vQmVsb25ncyB0byBubyBtaW1lIHBhcnQuCkBAIC0yOTQ3LDE4ICsyOTQ1LDIyIEBACiAKICAgICAgICAgYXBwZW5kU3ViamVjdChtc2csIHRhaWwoc3ViamVjdEZvcm1hdHRlciwgIiIpKTsKIAotICAgICAgICBNaW1lTXVsdGlwYXJ0IG11bHRpcGFydCA9IG5ldyBNaW1lTXVsdGlwYXJ0KCk7Ci0gICAgICAgIFN0cmluZyBhbHRUeXBlID0gZ2V0Q29udGVudFR5cGUoYm9keUZvcm1hdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlT2YoYnVmKTsKKyAgICAgICAgU3RyaW5nIGFsdFR5cGUgPSBjb250ZW50VHlwZU9mKGJvZHlGb3JtYXQpOwogICAgICAgICBzZXRDb250ZW50KGJvZHksIGJ1ZiwgYWx0VHlwZSA9PSBudWxsID8gY29udGVudFR5cGUgOiBhbHRUeXBlKTsKLSAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KGJvZHkpOworICAgICAgICBpZiAoYm9keSAhPSBtc2cpIHsKKyAgICAgICAgICAgIGZpbmFsIE1pbWVNdWx0aXBhcnQgbXVsdGlwYXJ0ID0gbmV3IE1pbWVNdWx0aXBhcnQoKTsKKyAgICAgICAgICAgIC8vYXNzZXJ0IGJvZHkgaW5zdGFuY2VvZiBCb2R5UGFydCA6IGJvZHk7CisgICAgICAgICAgICBtdWx0aXBhcnQuYWRkQm9keVBhcnQoKEJvZHlQYXJ0KSBib2R5KTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAocGFydHNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChwYXJ0c1tpXSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2cuc2V0Q29udGVudChtdWx0aXBhcnQpOwogICAgICAgICB9CiAKLSAgICAgICAgbXNnLnNldENvbnRlbnQobXVsdGlwYXJ0KTsKICAgICAgICAgcmV0dXJuIG1zZzsKICAgICB9CiAKQEAgLTI5ODMsNyArMjk4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlTZXR0aW5nczAoc2Vzc2lvbiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrICE9IG51bGwpIHsgLy9UaGlzIGNhbGwgd2lsbCBmYWlsLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sgIT0gbnVsbCkgeyAvL1Bhc3Mgc29tZSBpbnZhbGlkIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVNldHRpbmdzMChzZXNzaW9uLCBjaGVjay5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzAwNyw5ICszMDA5LDEwIEBACiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNldHRpbmdzMChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyB2ZXJpZnkpIHsKICAgICAgICAgYXNzZXJ0IHZlcmlmeSAhPSBudWxsIDogKFN0cmluZykgbnVsbDsKICAgICAgICAgaWYgKCEibG9jYWwiLmVxdWFscyh2ZXJpZnkpICYmICEicmVtb3RlIi5lcXVhbHModmVyaWZ5KQotICAgICAgICAgICAgICAgICYmICEibGltaXRlZCIuZXF1YWxzKHZlcmlmeSkgJiYgISJyZXNvbHZlIi5lcXVhbHModmVyaWZ5KSkgeworICAgICAgICAgICAgICAgICYmICEibGltaXRlZCIuZXF1YWxzKHZlcmlmeSkgJiYgISJyZXNvbHZlIi5lcXVhbHModmVyaWZ5KQorICAgICAgICAgICAgICAgICYmICEibG9naW4iLmVxdWFscyh2ZXJpZnkpKSB7CiAgICAgICAgICAgICByZXBvcnRFcnJvcigiVmVyaWZ5IG11c3QgYmUgJ2xpbWl0ZWQnLCBsb2NhbCcsICIKLSAgICAgICAgICAgICAgICAgICAgKyAiJ3Jlc29sdmUnIG9yICdyZW1vdGUnLiIsCisgICAgICAgICAgICAgICAgICAgICsgIidyZXNvbHZlJywgJ2xvZ2luJywgb3IgJ3JlbW90ZScuIiwKICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2ZXJpZnkpLAogICAgICAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuT1BFTl9GQUlMVVJFKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTMwNTEsMTIgKzMwNTQsNyBAQAogCiAgICAgICAgIHNldEluY29tcGxldGVDb3B5KGFib3J0KTsgLy9PcmlnaW5hbCBib2R5IHBhcnQgaXMgbmV2ZXIgYWRkZWQuCiAgICAgICAgIGVudmVsb3BlRm9yKGFib3J0LCB0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFib3J0LnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIE1lc3NhZ2luZ0V4Y2VwdGlvbiBNRSkgewotICAgICAgICAgICAgcmVwb3J0RXJyb3IobXNnLCBNRSwgRXJyb3JNYW5hZ2VyLkZPUk1BVF9GQUlMVVJFKTsKLSAgICAgICAgfQotCisgICAgICAgIHNhdmVDaGFuZ2VzTm9Db250ZW50KGFib3J0LCBtc2cpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy9FbnN1cmUgdHJhbnNwb3J0IHByb3ZpZGVyIGlzIGluc3RhbGxlZC4KICAgICAgICAgICAgIEFkZHJlc3NbXSBhbGwgPSBhYm9ydC5nZXRBbGxSZWNpcGllbnRzKCk7CkBAIC0zMDg4LDcgKzMwODYsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBudWxsOwotICAgICAgICAgICAgaWYgKCJyZW1vdGUiLmVxdWFscyh2ZXJpZnkpKSB7CisgICAgICAgICAgICBpZiAoInJlbW90ZSIuZXF1YWxzKHZlcmlmeSkgfHwgImxvZ2luIi5lcXVhbHModmVyaWZ5KSkgewogICAgICAgICAgICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBjbG9zZWQgPSBudWxsOwogICAgICAgICAgICAgICAgIHQuY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0zMDk5LDE1ICszMDk3LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvL0EgbWVzc2FnZSB3aXRob3V0IGNvbnRlbnQgd2lsbCBmYWlsIGF0IG1lc3NhZ2Ugd3JpdGVUbwogICAgICAgICAgICAgICAgICAgICAgICAgLy93aGVuIHNlbmRNZXNzYWdlIGlzIGNhbGxlZC4gIFRoaXMgYWxsb3dzIHRoZSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIGNhcHR1cmUgYWxsIG1haWwgcHJvcGVydGllcyBzZXQgaW4gdGhlIExvZ01hbmFnZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICB0LnNlbmRNZXNzYWdlKGFib3J0LCBhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJyZW1vdGUiLmVxdWFscyh2ZXJpZnkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZW5kTWVzc2FnZShhYm9ydCwgYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IC8vQ2xvc2UgdGhlIHRyYW5zcG9ydCBiZWZvcmUgcmVwb3J0aW5nIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTWVzc2FnaW5nRXhjZXB0aW9uIE1FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VkID0gTUU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0VW5leHBlY3RlZFNlbmQoYWJvcnQsIHZlcmlmeSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vQ2xvc2UgdGhlIHRyYW5zcG9ydCBiZWZvcmUgcmVwb3J0aW5nIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCJyZW1vdGUiLmVxdWFscyh2ZXJpZnkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRVbmV4cGVjdGVkU2VuZChhYm9ydCwgdmVyaWZ5LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm90b2NvbCA9IHQuZ2V0VVJMTmFtZSgpLmdldFByb3RvY29sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlQcm9wZXJ0aWVzKHNlc3Npb24sIHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNlbmRGYWlsZWRFeGNlcHRpb24gc2ZlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NbXSByZWNpcCA9IHNmZS5nZXRJbnZhbGlkQWRkcmVzc2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNpcCAhPSBudWxsICYmIHJlY2lwLmxlbmd0aCAhPSAwKSB7CkBAIC0zMTMxLDggKzMxMzcsOSBAQAogICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihhYm9ydCwgY2xvc2VkLCBFcnJvck1hbmFnZXIuQ0xPU0VfRkFJTFVSRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL0ZvcmNlIGEgcHJvcGVydHkgY29weS4KKyAgICAgICAgICAgICAgICAvL0ZvcmNlIGEgcHJvcGVydHkgY29weSwgSkRLLTcwOTI5ODEuCiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3RvY29sID0gdC5nZXRVUkxOYW1lKCkuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlQcm9wZXJ0aWVzKHNlc3Npb24sIHByb3RvY29sKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbWFpbEhvc3QgPSBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIKICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvdG9jb2wgKyAiLmhvc3QiKTsKICAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShtYWlsSG9zdCkpIHsKQEAgLTMxNDAsMTAgKzMxNDcsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwuaG9zdCIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIgKyBwcm90b2NvbCArICIucG9ydCIpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwuIiArIHByb3RvY29sICsgIi51c2VyIik7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC51c2VyIik7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC4iICsgcHJvdG9jb2wgKyAiLmxvY2FscG9ydCIpOworCiAgICAgICAgICAgICAgICAgbG9jYWwgPSBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIgKyBwcm90b2NvbCArICIubG9jYWxob3N0Iik7CiAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkobG9jYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC4iCkBAIC0zMTYzLDQwICszMTY3LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeUhvc3QobWFpbEhvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBJT0UpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIElPRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIE1FID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbihtc2csIElPRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvckNvbnRlbnQoYWJvcnQsIHZlcmlmeSwgTUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoYWJvcnQsIE1FLCBFcnJvck1hbmFnZXIuT1BFTl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBSRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIE1FID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbihtc2csIFJFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yQ29udGVudChhYm9ydCwgdmVyaWZ5LCBSRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihhYm9ydCwgTUUsIEVycm9yTWFuYWdlci5PUEVOX0ZBSUxVUkUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoISJsaW1pdGVkIi5lcXVhbHModmVyaWZ5KSkgewogICAgICAgICAgICAgICAgIHRyeSB7IC8vVmVyaWZ5IGhvc3QgbmFtZSBhbmQgaGl0IHRoZSBob3N0IG5hbWUgY2FjaGUuCi0gICAgICAgICAgICAgICAgICAgIGlmICghInJlbW90ZSIuZXF1YWxzKHZlcmlmeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEicmVtb3RlIi5lcXVhbHModmVyaWZ5KSAmJiAhImxvZ2luIi5lcXVhbHModmVyaWZ5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwgPSBnZXRMb2NhbEhvc3QodCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5SG9zdChsb2NhbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gSU9FKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIElPRSkgewogICAgICAgICAgICAgICAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gTUUgPSBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKG1zZywgSU9FKTsKICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JDb250ZW50KGFib3J0LCB2ZXJpZnksIE1FKTsKICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoYWJvcnQsIE1FLCBFcnJvck1hbmFnZXIuT1BFTl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIFJFKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBNRSA9IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24obXNnLCBSRSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yQ29udGVudChhYm9ydCwgdmVyaWZ5LCBNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKGFib3J0LCBNRSwgRXJyb3JNYW5hZ2VyLk9QRU5fRkFJTFVSRSk7CiAgICAgICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgICAgICB0cnkgeyAvL1ZlcmlmeSB0aGF0IHRoZSBEYXRhSGFuZGxlciBjYW4gYmUgbG9hZGVkLgogICAgICAgICAgICAgICAgICAgICBPYmplY3QgY2NsID0gZ2V0QW5kU2V0Q29udGV4dENsYXNzTG9hZGVyKE1BSUxIQU5ETEVSX0xPQURFUik7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0Fsd2F5cyBsb2FkIHRoZSBtdWx0aXBhcnQgY2xhc3Nlcy4KICAgICAgICAgICAgICAgICAgICAgICAgIE1pbWVNdWx0aXBhcnQgbXVsdGlwYXJ0ID0gbmV3IE1pbWVNdWx0aXBhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydFtdIGFtYnAgPSBuZXcgTWltZUJvZHlQYXJ0W2F0bi5sZW5ndGhdOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWltZUJvZHlQYXJ0IGJvZHk7CkBAIC0zMjA3LDcgKzMyMDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXRuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYnBbaV0gPSBjcmVhdGVCb2R5UGFydChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1icFtpXS5zZXRGaWxlTmFtZShhdG5baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgbmFtZXMgdG8gbWltZSB0eXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgbmFtZXMgdG8gbWltZSB0eXBlIHVuZGVyIGxvY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0bltpXSA9IGdldENvbnRlbnRUeXBlKGF0bltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzI3OCw2ICszMjczLDY1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSGFuZGxlcyBhbGwgZXhjZXB0aW9ucyB0aHJvd24gd2hlbiBzYXZlIGNoYW5nZXMgaXMgY2FsbGVkIG9uIGEgbWVzc2FnZQorICAgICAqIHRoYXQgZG9lc24ndCBoYXZlIGFueSBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFib3J0IHRoZSBtZXNzYWdlIHJlcXVpcmluZyBzYXZlIGNoYW5nZXMuCisgICAgICogQHBhcmFtIG1zZyB0aGUgZXJyb3IgZGVzY3JpcHRpb24uCisgICAgICogQHNpbmNlIEphdmFNYWlsIDEuNi4wCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVDaGFuZ2VzTm9Db250ZW50KGZpbmFsIE1lc3NhZ2UgYWJvcnQsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKGFib3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWJvcnQuc2F2ZUNoYW5nZXMoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB4ZmVyRW5jb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9Xb3JrYXJvdW5kIEdOVSBKYXZhTWFpbCBidWcgaW4gTWltZVV0aWxpdHkuZ2V0RW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgLy93aGVuIHRoZSBtaW1lIG1lc3NhZ2UgaGFzIG5vIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3RlID0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0LmdldEhlYWRlcihjdGUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydC5zZXRIZWFkZXIoY3RlLCAiYmFzZTY0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQuc2F2ZUNoYW5nZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgeGZlckVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgTWVzc2FnaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IHhmZXJFbmNvZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHhmZXJFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IE1lc3NhZ2luZ0V4Y2VwdGlvbiBNRSkgeworICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yKG1zZywgTUUsIEVycm9yTWFuYWdlci5GT1JNQVRfRkFJTFVSRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBjb21tb24gc2Vzc2lvbiBwcm9wZXJ0aWVzIGludG8gdGhlIExvZ01hbmFnZXJQcm9wZXJ0aWVzLiAgVGhpcyBpcworICAgICAqIGEgd29ya2Fyb3VuZCBmb3IgSkRLLTcwOTI5ODEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgdGhlIG1haWwgcHJvdG9jb2wuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBzZXNzaW9uIGlzIG51bGwuCisgICAgICogQHNpbmNlIEphdmFNYWlsIDEuNi4wCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlQcm9wZXJ0aWVzKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHByb3RvY29sKSB7CisgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwuZnJvbSIpOworICAgICAgICBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIgKyBwcm90b2NvbCArICIuZnJvbSIpOworICAgICAgICBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLmRzbi5yZXQiKTsKKyAgICAgICAgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC4iICsgcHJvdG9jb2wgKyAiLmRzbi5yZXQiKTsKKyAgICAgICAgc2Vzc2lvbi5nZXRQcm9wZXJ0eSgibWFpbC5kc24ubm90aWZ5Iik7CisgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwuIiArIHByb3RvY29sICsgIi5kc24ubm90aWZ5Iik7CisgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwuIiArIHByb3RvY29sICsgIi5wb3J0Iik7CisgICAgICAgIHNlc3Npb24uZ2V0UHJvcGVydHkoIm1haWwudXNlciIpOworICAgICAgICBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIgKyBwcm90b2NvbCArICIudXNlciIpOworICAgICAgICBzZXNzaW9uLmdldFByb3BlcnR5KCJtYWlsLiIgKyBwcm90b2NvbCArICIubG9jYWxwb3J0Iik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGVyZm9ybSBhIGxvb2t1cCBvZiB0aGUgaG9zdCBhZGRyZXNzIG9yIEZRRE4uCiAgICAgICogQHBhcmFtIGhvc3QgdGhlIGhvc3Qgb3IgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBhZGRyZXNzLgpAQCAtMzM2NCwxMCArMzQxOCw4IEBACiAgICAgICAgICAgICBtc2cuc2V0RGVzY3JpcHRpb24obXNnRGVzYyk7CiAgICAgICAgICAgICBzZXRBY2NlcHRMYW5nKG1zZyk7CiAgICAgICAgICAgICBtc2cuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgTWVzc2FnaW5nRXhjZXB0aW9uIE1FKSB7CisgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gTUUpIHsKICAgICAgICAgICAgIHJlcG9ydEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGJvZHkuIiwgTUUsIEVycm9yTWFuYWdlci5PUEVOX0ZBSUxVUkUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIFJFKSB7Ci0gICAgICAgICAgICByZXBvcnRFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBib2R5LiIsIFJFLCBFcnJvck1hbmFnZXIuT1BFTl9GQUlMVVJFKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzkzNCwxMiArMzk4Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdpbmdFeGNlcHRpb24oIk5vIGxvY2FsIGFkZHJlc3MuIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChmaW5hbCBNZXNzYWdpbmdFeGNlcHRpb24gTUUpIHsKKyAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiBNRSkgewogICAgICAgICAgICAgcmVwb3J0RXJyb3IoIlVuYWJsZSB0byBjb21wdXRlIGEgZGVmYXVsdCByZWNpcGllbnQuIiwKICAgICAgICAgICAgICAgICAgICAgTUUsIEVycm9yTWFuYWdlci5GT1JNQVRfRkFJTFVSRSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gUkUpIHsKLSAgICAgICAgICAgIHJlcG9ydEVycm9yKCJVbmFibGUgdG8gY29tcHV0ZSBhIGRlZmF1bHQgcmVjaXBpZW50LiIsCi0gICAgICAgICAgICAgICAgICAgIFJFLCBFcnJvck1hbmFnZXIuRk9STUFUX0ZBSUxVUkUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MDM0LDExICs0MDgzLDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdG9SYXdTdHJpbmcoZmluYWwgTWVzc2FnZSBtc2cpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG1zZyAhPSBudWxsKSB7CiAgICAgICAgICAgICBPYmplY3QgY2NsID0gZ2V0QW5kU2V0Q29udGV4dENsYXNzTG9hZGVyKE1BSUxIQU5ETEVSX0xPQURFUik7Ci0gICAgICAgICAgICB0cnkgeyAgLy9CVUdJRCA4MDI1MjUxCisgICAgICAgICAgICB0cnkgeyAgLy9KREstODAyNTI1MQogICAgICAgICAgICAgICAgIGludCBuYnl0ZXMgPSBNYXRoLm1heChtc2cuZ2V0U2l6ZSgpICsgTUlOX0hFQURFUl9TSVpFLCBNSU5fSEVBREVSX1NJWkUpOwogICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG5ieXRlcyk7Ci0gICAgICAgICAgICAgICAgbXNnLndyaXRlVG8ob3V0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCJVUy1BU0NJSSIpOyAvL1JhdyBtZXNzYWdlIGlzIGFsd2F5cyBBU0NJSS4KKyAgICAgICAgICAgICAgICBtc2cud3JpdGVUbyhvdXQpOyAgLy9IZWFkZXJzIGNhbiBiZSBVVEYtOCBvciBVUy1BU0NJSS4KKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCJVVEYtOCIpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBnZXRBbmRTZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2NsKTsKICAgICAgICAgICAgIH0KQEAgLTQwNjMsMTIgKzQxMTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShNSU5fSEVBREVSX1NJWkUpOwogCiAgICAgICAgICAgICAvL0NyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIHdyaXRlciBzbyBzdHJlYW1zIGFyZSBub3QgZG91YmxlIGJ1ZmZlcmVkLgotICAgICAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgcHcgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGNoYXJzZXQpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4odC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgICAgIHB3LmNsb3NlKCk7IC8vQlVHIElEIDY5OTU1MzcKKyAgICAgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtV3JpdGVyIG93cyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBjaGFyc2V0KTsKKyAgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3dzKSkgeworICAgICAgICAgICAgICAgIHB3LnByaW50bG4odC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgfSAvL0Nsb3NlIE9TVyBiZWZvcmUgZ2VuZXJhdGluZyBzdHJpbmcuIEpESy02OTk1NTM3CiAgICAgICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKGNoYXJzZXQpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHVuZXhwZWN0ZWQpIHsKICAgICAgICAgICAgIHJldHVybiB0LnRvU3RyaW5nKCkgKyAnICcgKyB1bmV4cGVjdGVkLnRvU3RyaW5nKCk7CkBAIC00MTM3LDYgKzQxODYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3B0aW9uYWwgIT0gcmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlZC5hZGRTdXBwcmVzc2VkKG9wdGlvbmFsKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CiAgICAgfQpAQCAtNDE1MCw5ICs0MjAzLDggQEAKICAgICBwcml2YXRlIFN0cmluZyBnZXRMb2NhbEhvc3QoZmluYWwgU2VydmljZSBzKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gTG9nTWFuYWdlclByb3BlcnRpZXMuZ2V0TG9jYWxIb3N0KHMpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBTZWN1cml0eUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICB9IGNhdGNoIChmaW5hbCBMaW5rYWdlRXJyb3IgaWdub3JlKSB7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgfCBMaW5rYWdlRXJyb3IgaWdub3JlKSB7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgcmVwb3J0RXJyb3Iocy50b1N0cmluZygpLCBleCwgRXJyb3JNYW5hZ2VyLk9QRU5fRkFJTFVSRSk7CiAgICAgICAgIH0KQEAgLTQxODcsNyArNDIzOSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3V0bGluZSB0aGUgY3JlYXRpb24gb2YgdGhlIGluZGV4IGVycm9yIG1lc3NhZ2UuIFNlZSBCVUcgSUQgNjUzMzE2NS4KKyAgICAgKiBPdXRsaW5lIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW5kZXggZXJyb3IgbWVzc2FnZS4gU2VlIEpESy02NTMzMTY1LgogICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvU2V2ZXJpdHlDb21wYXJhdG9yLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9TZXZlcml0eUNvbXBhcmF0b3IuamF2YQppbmRleCA3ODE3MzNmLi4yZjc3OWM0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9TZXZlcml0eUNvbXBhcmF0b3IuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvY29tL3N1bi9tYWlsL3V0aWwvbG9nZ2luZy9TZXZlcml0eUNvbXBhcmF0b3IuamF2YQpAQCAtMSwzNTYgKzEsMzU2IEBACi0vKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91Ci0gKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLSAqCi0gKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gKiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBHUEwgVmVyc2lvbiAyIHNlY3Rpb24gb2YgdGhlIExpY2Vuc2UKLSAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogTW9kaWZpY2F0aW9uczoKLSAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gKiBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAqICJQb3J0aW9ucyBDb3B5cmlnaHQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0gKgotICogQ29udHJpYnV0b3Iocyk6Ci0gKiBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlIENEREwgb3IKLSAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gKiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAqIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEKLSAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAqIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICogaXRzIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMiBjb2RlCi0gKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gKiBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICogaG9sZGVyLgotICovCi1wYWNrYWdlIGNvbS5zdW4ubWFpbC51dGlsLmxvZ2dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7Ci0KLS8qKgotICogT3JkZXJzIGxvZyByZWNvcmRzIGJ5IGxldmVsLCB0aHJvd24sIHNlcXVlbmNlLCBhbmQgdGltZS4KLSAqCi0gKiBUaGlzIGNvbXBhcmF0b3Igb3JkZXJzIExvZ1JlY29yZHMgYnkgaG93IHNldmVyZWx5IGVhY2ggaXMgYXR0cmlidXRlZCB0bwotICogZmFpbHVyZXMgaW4gYSBwcm9ncmFtLiBUaGUgcHJpbWFyeSBvcmRlcmluZyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB1c2Ugb2YgdGhlCi0gKiBsb2dnaW5nIEFQSSB0aHJvdWdob3V0IGEgcHJvZ3JhbSBieSBzcGVjaWZ5aW5nIGEgbGV2ZWwgdG8gZWFjaCBsb2cgbWVzc2FnZS4KLSAqIFRoZSBzZWNvbmRhcnkgb3JkZXJpbmcgaXMgZGV0ZXJtaW5lZCBhdCBydW50aW1lIGJ5IHRoZSB0eXBlIG9mIGVycm9ycyBhbmQKLSAqIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtLiBUaGUgcmVtYWluaW5nIG9yZGVyaW5nIGFzc3VtZXMgdGhhdAotICogb2xkZXIgbG9nIHJlY29yZHMgYXJlIGxlc3Mgc2V2ZXJlIHRoYW4gbmV3ZXIgbG9nIHJlY29yZHMuCi0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIExvZ1JlY29yZCBwcm9wZXJ0aWVzIGRldGVybWluZSBzZXZlcml0eSBvcmRlcmluZzoKLSAqIDxvbD4KLSAqIDxsaT4gVGhlIG5hdHVyYWwgY29tcGFyaXNvbiBvZiB0aGUgTG9nUmVjb3JkCi0gKiB7QGxpbmtwbGFpbiBMZXZlbCNpbnRWYWx1ZSBsZXZlbH0uCi0gKiA8bGk+IFRoZSBleHBlY3RlZCByZWNvdmVyeSBvcmRlciBvZiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0VGhyb3duKCkgdGhyb3dufQotICogcHJvcGVydHkgb2YgYSBMb2dSZWNvcmQgYW5kIGl0cyBjYXVzZSBjaGFpbi4gVGhpcyBvcmRlcmluZyBpcyBkZXJpdmVkIGZyb20KLSAqIHRoZSBKTFMgMTEuMS4xLiBUaGUgS2luZHMgb2YgRXhjZXB0aW9ucyBhbmQgSkxTIDExLjUgVGhlIEV4Y2VwdGlvbiBIaWVyYXJjaHkuCi0gKiBUaGlzIGlzIHBlcmZvcm1lZCBieSB7QGxpbmtwbGFpbiAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkgZmluZGluZ30gdGhlCi0gKiB0aHJvd2FibGUgdGhhdCBiZXN0IGRlc2NyaWJlcyB0aGUgZW50aXJlIGNhdXNlIGNoYWluLiBPbmNlIGEgc3BlY2lmaWMKLSAqIHRocm93YWJsZSBvZiBlYWNoIGNoYWluIGlzIGlkZW50aWZpZWQgaXQgaXMgdGhlbiByYW5rZWQgbG93ZXN0IHRvIGhpZ2hlc3QgYnkKLSAqIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKgotICogPHVsPgotICogPGxpPkFsbCBMb2dSZWNvcmRzIHdpdGggYSB7QGNvZGUgVGhyb3dhYmxlfSBkZWZpbmVkIGFzCi0gKiAie0BsaW5rICNpc05vcm1hbChqYXZhLmxhbmcuVGhyb3dhYmxlKSBub3JtYWwgb2NjdXJyZW5jZX0iLgotICogPGxpPkFsbCBMb2dSZWNvcmRzIHRoYXQgZG8gbm90IGhhdmUgYSB0aHJvd24gb2JqZWN0LgotICogPGxpPkFsbCBjaGVja2VkIGV4Y2VwdGlvbnMuIFRoaXMgaXMgYW55IGNsYXNzIHRoYXQgaXMgYXNzaWduYWJsZSB0byB0aGUKLSAqIHtAY29kZSBqYXZhLmxhbmcuVGhyb3dhYmxlfSBjbGFzcyBhbmQgaXMgbm90IGEKLSAqIHtAY29kZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbn0gb3IgYSB7QGNvZGUgamF2YS5sYW5nLkVycm9yfS4KLSAqIDxsaT5BbGwgdW5jaGVja2VkIGV4Y2VwdGlvbnMuIFRoaXMgaXMgYWxsIHtAY29kZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbn0KLSAqIG9iamVjdHMuCi0gKiA8bGk+QWxsIGVycm9ycyB0aGF0IGluZGljYXRlIGEgc2VyaW91cyBwcm9ibGVtLiBUaGlzIGlzIGFsbAotICoge0Bjb2RlIGphdmEubGFuZy5FcnJvcn0gb2JqZWN0cy4KLSAqIDwvdWw+Ci0gKiA8bGk+IFRoZSBuYXR1cmFsIGNvbXBhcmlzb24gb2YgdGhlIExvZ1JlY29yZAotICoge0BsaW5rcGxhaW4gTG9nUmVjb3JkI2dldFNlcXVlbmNlTnVtYmVyKCkgc2VxdWVuY2V9LgotICogPGxpPiBUaGUgbmF0dXJhbCBjb21wYXJpc29uIG9mIHRoZSBMb2dSZWNvcmQKLSAqIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRNaWxsaXMoKSBtaWxsaXN9LgotICogPC9vbD4KLSAqCi0gKiBAYXV0aG9yIEphc29uIE1laHJlbnMKLSAqIEBzaW5jZSBKYXZhTWFpbCAxLjUuMgotICovCi1wdWJsaWMgY2xhc3MgU2V2ZXJpdHlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxMb2dSZWNvcmQ+LCBTZXJpYWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogVGhlIGdlbmVyYXRlZCBzZXJpYWwgdmVyc2lvbiBVSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI2MjA0NDIyNDUyNTE3OTE5NjVMOwotCi0gICAgLyoqCi0gICAgICogQSBzaW5nbGUgaW5zdGFuY2UgdGhhdCBpcyBzaGFyZWQgYW1vbmcgdGhlIGxvZ2dpbmcgcGFja2FnZS4KLSAgICAgKiBUaGUgZmllbGQgaXMgZGVjbGFyZWQgYXMgamF2YS51dGlsLkNvbXBhcmF0b3Igc28KLSAgICAgKiBXZWJhcHBDbGFzc0xvYWRlci5jbGVhclJlZmVyZW5jZXNTdGF0aWNGaW5hbCgpIG1ldGhvZCB3aWxsIGlnbm9yZSB0aGlzCi0gICAgICogZmllbGQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxMb2dSZWNvcmQ+IElOU1RBTkNFCi0gICAgICAgICAgICA9IG5ldyBTZXZlcml0eUNvbXBhcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIEEgc2hhcmVkIGluc3RhbmNlIG9mIGEgU2V2ZXJpdHlDb21wYXJhdG9yLiBUaGlzIGlzIHBhY2thZ2UgcHJpdmF0ZSBzbyB0aGUKLSAgICAgKiBwdWJsaWMgQVBJIGlzIG5vdCBwb2xsdXRlZCB3aXRoIG1vcmUgbWV0aG9kcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzaGFyZWQgaW5zdGFuY2Ugb2YgYSBTZXZlcml0eUNvbXBhcmF0b3IuCi0gICAgICovCi0gICAgc3RhdGljIFNldmVyaXR5Q29tcGFyYXRvciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChTZXZlcml0eUNvbXBhcmF0b3IpIElOU1RBTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElkZW50aWZpZXMgYSBzaW5nbGUgdGhyb3dhYmxlIHRoYXQgYmVzdCBkZXNjcmliZXMgdGhlIGdpdmVuIHRocm93YWJsZSBhbmQKLSAgICAgKiB0aGUgZW50aXJlIHtAbGlua3BsYWluIFRocm93YWJsZSNnZXRDYXVzZSgpIGNhdXNlfSBjaGFpbi4gVGhpcyBtZXRob2QgY2FuCi0gICAgICogYmUgb3ZlcnJpZGRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCi0gICAgICoge0BsaW5rICNjb21wYXJlKGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCwgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkKX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hhaW4gdGhlIHRocm93YWJsZSBvciBudWxsLgotICAgICAqIEByZXR1cm4gbnVsbCBpZiBudWxsIHdhcyBnaXZlbiwgb3RoZXJ3aXNlIHRoZSB0aHJvd2FibGUgdGhhdCBiZXN0Ci0gICAgICogZGVzY3JpYmVzIHRoZSBlbnRpcmUgY2hhaW4uCi0gICAgICogQHNlZSAjaXNOb3JtYWwoamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGFwcGx5KGZpbmFsIFRocm93YWJsZSBjaGFpbikgewotICAgICAgICAvL01hdGNoZXMgdGhlIGoudS5mLlVuYXJ5T3BlcmF0b3I8VGhyb3dhYmxlPiBpbnRlcmZhY2UuCi0gICAgICAgIGludCBsaW1pdCA9IDA7Ci0gICAgICAgIFRocm93YWJsZSByb290ID0gY2hhaW47Ci0gICAgICAgIFRocm93YWJsZSBoaWdoID0gbnVsbDsKLSAgICAgICAgVGhyb3dhYmxlIG5vcm1hbCA9IG51bGw7Ci0gICAgICAgIGZvciAoVGhyb3dhYmxlIGNhdXNlID0gY2hhaW47IGNhdXNlICE9IG51bGw7IGNhdXNlID0gY2F1c2UuZ2V0Q2F1c2UoKSkgewotICAgICAgICAgICAgcm9vdCA9IGNhdXNlOyAgLy9GaW5kIHRoZSBkZWVwZXN0IGNhdXNlLgotCi0gICAgICAgICAgICAvL0ZpbmQgdGhlIGRlZXBlc3Qgbm9tcmFsIG9jY3VycmFuY2UuCi0gICAgICAgICAgICBpZiAoaXNOb3JtYWwoY2F1c2UpKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsID0gY2F1c2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vRmluZCB0aGUgZGVlcGVzdCBlcnJvciB0aGF0IGhhcHBlbmVkIGJlZm9yZSBhIG5vcm1hbCBvY2N1cmFuY2UuCi0gICAgICAgICAgICBpZiAobm9ybWFsID09IG51bGwgJiYgY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikgewotICAgICAgICAgICAgICAgIGhpZ2ggPSBjYXVzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9EZWFsIHdpdGggZXhjZXNzaXZlIGNhdXNlIGNoYWlucyBhbmQgY3ljbGljIHRocm93YWJsZXMuCi0gICAgICAgICAgICBpZiAoKytsaW1pdCA9PSAoMSA8PCAxNikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsgLy9HaXZlIHVwLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoaWdoICE9IG51bGwgPyBoaWdoIDogbm9ybWFsICE9IG51bGwgPyBub3JtYWwgOiByb290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAbGluayAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkgUmVkdWNlc30gZWFjaCB0aHJvd2FibGUgY2hhaW4gYXJndW1lbnQKLSAgICAgKiB0aGVuIGNvbXBhcmUgZWFjaCB0aHJvd2FibGUgcmVzdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRjMSB0aGUgZmlyc3QgdGhyb3dhYmxlIGNoYWluIG9yIG51bGwuCi0gICAgICogQHBhcmFtIHRjMiB0aGUgc2Vjb25kIHRocm93YWJsZSBjaGFpbiBvciBudWxsLgotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0Ci0gICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCi0gICAgICogQHNlZSAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkKLSAgICAgKiBAc2VlICNjb21wYXJlVGhyb3dhYmxlKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBhcHBseVRoZW5Db21wYXJlKFRocm93YWJsZSB0YzEsIFRocm93YWJsZSB0YzIpIHsKLSAgICAgICAgcmV0dXJuIHRjMSA9PSB0YzIgPyAwIDogY29tcGFyZVRocm93YWJsZShhcHBseSh0YzEpLCBhcHBseSh0YzIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gdGhyb3dhYmxlIG9iamVjdHMgb3IgbnVsbC4gVGhpcyBtZXRob2QgZG9lcyBub3QKLSAgICAgKiB7QGxpbmsgI2FwcGx5KGphdmEubGFuZy5UaHJvd2FibGUpIHJlZHVjZX0gZWFjaCBhcmd1bWVudCBiZWZvcmUKLSAgICAgKiBjb21wYXJpbmcuIFRoaXMgaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKLSAgICAgKiB7QGxpbmtwbGFpbiAjY29tcGFyZShMb2dSZWNvcmQsIExvZ1JlY29yZCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIHQxIHRoZSBmaXJzdCB0aHJvd2FibGUgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gdDIgdGhlIHNlY29uZCB0aHJvd2FibGUgb3IgbnVsbC4KLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAotICAgICAqIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgotICAgICAqIEBzZWUgI2lzTm9ybWFsKGphdmEubGFuZy5UaHJvd2FibGUpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVGhyb3dhYmxlKGZpbmFsIFRocm93YWJsZSB0MSwgZmluYWwgVGhyb3dhYmxlIHQyKSB7Ci0gICAgICAgIGlmICh0MSA9PSB0MikgeyAvL1JlZmxleGl2ZSB0ZXN0IGluY2x1ZGluZyBudWxsLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL09ubHkgb25lIG9yIHRoZSBvdGhlciBpcyBudWxsIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgICAvL0ZvcmNlIG5vcm1hbCBvY2N1cnJlbmNlIHRvIGJlIGxvd2VyIHRoYW4gbnVsbC4KLSAgICAgICAgICAgIGlmICh0MSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQyKSA/IDEgOiAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHQyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQxKSA/IC0xIDogMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vRnJvbSB0aGlzIHBvaW50IG9uIG5laXRoZXIgYXJlIG51bGwuCi0gICAgICAgICAgICAvL0ZvbGxvdyB0aGUgc2hvcnRjdXQgaWYgd2UgY2FuLgotICAgICAgICAgICAgaWYgKHQxLmdldENsYXNzKCkgPT0gdDIuZ2V0Q2xhc3MoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0Vuc3VyZSBub3JtYWwgb2NjdXJyZW5jZSBmbG93IGNvbnRyb2wgaXMgb3JkZXJlZCBsb3cuCi0gICAgICAgICAgICBpZiAoaXNOb3JtYWwodDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQyKSA/IDAgOiAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTm9ybWFsKHQyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vUmFuayB0aGUgdHdvIHVuaWRlbnRpY2lhbCB0aHJvd2FibGVzIHVzaW5nIHRoZSBydWxlcyBmcm9tCi0gICAgICAgICAgICAvL0pMUyAxMS4xLjEuIFRoZSBLaW5kcyBvZiBFeGNlcHRpb25zIGFuZAotICAgICAgICAgICAgLy9KTFMgMTEuNSBUaGUgRXhjZXB0aW9uIEhpZXJhcmNoeS4KLSAgICAgICAgICAgIGlmICh0MSBpbnN0YW5jZW9mIEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHQyIGluc3RhbmNlb2YgRXJyb3IgPyAwIDogMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodDEgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHQyIGluc3RhbmNlb2YgRXJyb3IgPyAtMQotICAgICAgICAgICAgICAgICAgICAgICAgOiB0MiBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24gPyAwIDogMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHQyIGluc3RhbmNlb2YgRXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHQyIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiA/IC0xIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsb2cgcmVjb3JkcyBiYXNlZCBvbiBzZXZlcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSB0aGUgZmlyc3QgbG9nIHJlY29yZC4KLSAgICAgKiBAcGFyYW0gbzIgdGhlIHNlY29uZCBsb2cgcmVjb3JkLgotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0Ci0gICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygib3ZlcnJpZGUiKSAvL0pESy02OTU0MjM0Ci0gICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIExvZ1JlY29yZCBvMSwgZmluYWwgTG9nUmVjb3JkIG8yKSB7Ci0gICAgICAgIGlmIChvMSA9PSBudWxsIHx8IG8yID09IG51bGwpIHsgLy9Eb24ndCBhbGxvdyBudWxsLgotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKHRvU3RyaW5nKG8xLCBvMikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvZ1JlY29yZHMgYXJlIG11dGFibGUgc28gYSByZWZsZXhpdmUgcmVsYXRpb25zaGlwIHRlc3QgaXMgYSBzYWZldHkKLSAgICAgICAgICogcmVxdWlyZW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobzEgPT0gbzIpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNtcCA9IGNvbXBhcmUobzEuZ2V0TGV2ZWwoKSwgbzIuZ2V0TGV2ZWwoKSk7Ci0gICAgICAgIGlmIChjbXAgPT0gMCkgewotICAgICAgICAgICAgY21wID0gYXBwbHlUaGVuQ29tcGFyZShvMS5nZXRUaHJvd24oKSwgbzIuZ2V0VGhyb3duKCkpOwotICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY21wID0gY29tcGFyZShvMS5nZXRTZXF1ZW5jZU51bWJlcigpLCBvMi5nZXRTZXF1ZW5jZU51bWJlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY21wID0gY29tcGFyZShvMS5nZXRNaWxsaXMoKSwgbzIuZ2V0TWlsbGlzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY21wOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhbHNvIGEgY29tcGFyYXRvciBhbmQgaXQgaW1wb3NlcyB0aGUKLSAgICAgKiBzYW1lIG9yZGVyaW5nIGFzIHRoaXMgY29tcGFyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgZXF1YWwgdG8gdGhlIGFyZ3VtZW50OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBvID09IG51bGwgPyBmYWxzZSA6IG8uZ2V0Q2xhc3MoKSA9PSBnZXRDbGFzcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIDMxICogZ2V0Q2xhc3MoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRocm93YWJsZSBpbnN0YW5jZSBpcyAibm9ybWFsIG9jY3VycmVuY2UiLiBUaGlzCi0gICAgICogaXMgYW55IGNoZWNrZWQgb3IgdW5jaGVja2VkIGV4Y2VwdGlvbiB3aXRoICdJbnRlcnJ1cHQnIGluIHRoZSBjbGFzcyBuYW1lCi0gICAgICogb3IgYW5jZXN0cmFsIGNsYXNzIG5hbWUuIEFueSB7QGNvZGUgamF2YS5sYW5nLlRocmVhZERlYXRofSBvYmplY3Qgb3IKLSAgICAgKiBzdWJjbGFzc2VzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAgICAgKiB7QGxpbmtwbGFpbiAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSl9IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlIG9yIG51bGwuCi0gICAgICogQHJldHVybiB0cnVlIHRoZSBnaXZlbiB0aHJvd2FibGUgaXMgYSAibm9ybWFsIG9jY3VycmVuY2UiLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTm9ybWFsKGZpbmFsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIGlmICh0ID09IG51bGwpIHsgLy9UaGlzIGlzIG9ubHkgbmVlZGVkIHdoZW4gY2FsbGVkIGRpcmVjdGx5LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZSB0aGUgY2xhc3MgbmFtZXMgdG8gYXZvaWQgbG9hZGluZyBtb3JlIGNsYXNzZXMuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBDbGFzczw/PiByb290ID0gVGhyb3dhYmxlLmNsYXNzOwotICAgICAgICBmaW5hbCBDbGFzczw/PiBlcnJvciA9IEVycm9yLmNsYXNzOwotICAgICAgICBmb3IgKENsYXNzPD8+IGMgPSB0LmdldENsYXNzKCk7IGMgIT0gcm9vdDsgYyA9IGMuZ2V0U3VwZXJjbGFzcygpKSB7Ci0gICAgICAgICAgICBpZiAoZXJyb3IuaXNBc3NpZ25hYmxlRnJvbShjKSkgewotICAgICAgICAgICAgICAgIGlmIChjLmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5UaHJlYWREZWF0aCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQsIEludGVycnVwdGVkIG9yIEludGVycnVwdGlvbi4KLSAgICAgICAgICAgICAgICBpZiAoYy5nZXROYW1lKCkuY29udGFpbnMoIkludGVycnVwdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gbGV2ZWwgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhIHRoZSBmaXJzdCBsZXZlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc2Vjb25kIGxldmVsLgotICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0Ci0gICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgY29tcGFyZShmaW5hbCBMZXZlbCBhLCBmaW5hbCBMZXZlbCBiKSB7Ci0gICAgICAgIHJldHVybiBhID09IGIgPyAwIDogY29tcGFyZShhLmludFZhbHVlKCksIGIuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0bGluZSB0aGUgbWVzc2FnZSBjcmVhdGUgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG8xIGFyZ3VtZW50IG9uZS4KLSAgICAgKiBAcGFyYW0gbzIgYXJndW1lbnQgdHdvLgotICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBPYmplY3QgbzEsIGZpbmFsIE9iamVjdCBvMikgewotICAgICAgICByZXR1cm4gbzEgKyAiLCAiICsgbzI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gbG9uZ3MuIENhbiBiZSByZW1vdmVkIHdoZW4gSkRLIDEuNyBpcyByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4IHRoZSBmaXJzdCBsb25nLgotICAgICAqIEBwYXJhbSB5IHRoZSBzZWNvbmQgbG9uZy4KLSAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAotICAgICAqIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNvbXBhcmUoZmluYWwgbG9uZyB4LCBmaW5hbCBsb25nIHkpIHsKLSAgICAgICAgcmV0dXJuIHggPCB5ID8gLTEgOiB4ID4geSA/IDEgOiAwOwotICAgIH0KLX0KKy8qDQorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4NCisgKg0KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgSmFzb24gTWVocmVucy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VDQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQNCisgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQ0KKyAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbg0KKyAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQ0KKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMNCisgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqDQorICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gNCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuDQorICoNCisgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoNCisgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIg0KKyAqIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQ0KKyAqIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuDQorICoNCisgKiBNb2RpZmljYXRpb25zOg0KKyAqIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzDQorICogZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246DQorICogIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSINCisgKg0KKyAqIENvbnRyaWJ1dG9yKHMpOg0KKyAqIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcg0KKyAqIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdDQorICogZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMDQorICogVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQ0KKyAqIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXINCisgKiBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8NCisgKiBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUNCisgKiBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzDQorICogb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQNCisgKiBob2xkZXIuDQorICovDQorcGFja2FnZSBjb20uc3VuLm1haWwudXRpbC5sb2dnaW5nOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7DQorDQorLyoqDQorICogT3JkZXJzIGxvZyByZWNvcmRzIGJ5IGxldmVsLCB0aHJvd24sIHNlcXVlbmNlLCBhbmQgdGltZS4NCisgKg0KKyAqIFRoaXMgY29tcGFyYXRvciBvcmRlcnMgTG9nUmVjb3JkcyBieSBob3cgc2V2ZXJlbHkgZWFjaCBpcyBhdHRyaWJ1dGVkIHRvDQorICogZmFpbHVyZXMgaW4gYSBwcm9ncmFtLiBUaGUgcHJpbWFyeSBvcmRlcmluZyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB1c2Ugb2YgdGhlDQorICogbG9nZ2luZyBBUEkgdGhyb3VnaG91dCBhIHByb2dyYW0gYnkgc3BlY2lmeWluZyBhIGxldmVsIHRvIGVhY2ggbG9nIG1lc3NhZ2UuDQorICogVGhlIHNlY29uZGFyeSBvcmRlcmluZyBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgYnkgdGhlIHR5cGUgb2YgZXJyb3JzIGFuZA0KKyAqIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtLiBUaGUgcmVtYWluaW5nIG9yZGVyaW5nIGFzc3VtZXMgdGhhdA0KKyAqIG9sZGVyIGxvZyByZWNvcmRzIGFyZSBsZXNzIHNldmVyZSB0aGFuIG5ld2VyIGxvZyByZWNvcmRzLg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBMb2dSZWNvcmQgcHJvcGVydGllcyBkZXRlcm1pbmUgc2V2ZXJpdHkgb3JkZXJpbmc6DQorICogPG9sPg0KKyAqIDxsaT4gVGhlIG5hdHVyYWwgY29tcGFyaXNvbiBvZiB0aGUgTG9nUmVjb3JkDQorICoge0BsaW5rcGxhaW4gTGV2ZWwjaW50VmFsdWUgbGV2ZWx9Lg0KKyAqIDxsaT4gVGhlIGV4cGVjdGVkIHJlY292ZXJ5IG9yZGVyIG9mIHtAbGlua3BsYWluIExvZ1JlY29yZCNnZXRUaHJvd24oKSB0aHJvd259DQorICogcHJvcGVydHkgb2YgYSBMb2dSZWNvcmQgYW5kIGl0cyBjYXVzZSBjaGFpbi4gVGhpcyBvcmRlcmluZyBpcyBkZXJpdmVkIGZyb20NCisgKiB0aGUgSkxTIDExLjEuMS4gVGhlIEtpbmRzIG9mIEV4Y2VwdGlvbnMgYW5kIEpMUyAxMS41IFRoZSBFeGNlcHRpb24gSGllcmFyY2h5Lg0KKyAqIFRoaXMgaXMgcGVyZm9ybWVkIGJ5IHtAbGlua3BsYWluICNhcHBseShqYXZhLmxhbmcuVGhyb3dhYmxlKSBmaW5kaW5nfSB0aGUNCisgKiB0aHJvd2FibGUgdGhhdCBiZXN0IGRlc2NyaWJlcyB0aGUgZW50aXJlIGNhdXNlIGNoYWluLiBPbmNlIGEgc3BlY2lmaWMNCisgKiB0aHJvd2FibGUgb2YgZWFjaCBjaGFpbiBpcyBpZGVudGlmaWVkIGl0IGlzIHRoZW4gcmFua2VkIGxvd2VzdCB0byBoaWdoZXN0IGJ5DQorICogdGhlIGZvbGxvd2luZyBydWxlczoNCisgKg0KKyAqIDx1bD4NCisgKiA8bGk+QWxsIExvZ1JlY29yZHMgd2l0aCBhIHtAY29kZSBUaHJvd2FibGV9IGRlZmluZWQgYXMNCisgKiAie0BsaW5rICNpc05vcm1hbChqYXZhLmxhbmcuVGhyb3dhYmxlKSBub3JtYWwgb2NjdXJyZW5jZX0iLg0KKyAqIDxsaT5BbGwgTG9nUmVjb3JkcyB0aGF0IGRvIG5vdCBoYXZlIGEgdGhyb3duIG9iamVjdC4NCisgKiA8bGk+QWxsIGNoZWNrZWQgZXhjZXB0aW9ucy4gVGhpcyBpcyBhbnkgY2xhc3MgdGhhdCBpcyBhc3NpZ25hYmxlIHRvIHRoZQ0KKyAqIHtAY29kZSBqYXZhLmxhbmcuVGhyb3dhYmxlfSBjbGFzcyBhbmQgaXMgbm90IGENCisgKiB7QGNvZGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb259IG9yIGEge0Bjb2RlIGphdmEubGFuZy5FcnJvcn0uDQorICogPGxpPkFsbCB1bmNoZWNrZWQgZXhjZXB0aW9ucy4gVGhpcyBpcyBhbGwge0Bjb2RlIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9ufQ0KKyAqIG9iamVjdHMuDQorICogPGxpPkFsbCBlcnJvcnMgdGhhdCBpbmRpY2F0ZSBhIHNlcmlvdXMgcHJvYmxlbS4gVGhpcyBpcyBhbGwNCisgKiB7QGNvZGUgamF2YS5sYW5nLkVycm9yfSBvYmplY3RzLg0KKyAqIDwvdWw+DQorICogPGxpPiBUaGUgbmF0dXJhbCBjb21wYXJpc29uIG9mIHRoZSBMb2dSZWNvcmQNCisgKiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0U2VxdWVuY2VOdW1iZXIoKSBzZXF1ZW5jZX0uDQorICogPGxpPiBUaGUgbmF0dXJhbCBjb21wYXJpc29uIG9mIHRoZSBMb2dSZWNvcmQNCisgKiB7QGxpbmtwbGFpbiBMb2dSZWNvcmQjZ2V0TWlsbGlzKCkgbWlsbGlzfS4NCisgKiA8L29sPg0KKyAqDQorICogQGF1dGhvciBKYXNvbiBNZWhyZW5zDQorICogQHNpbmNlIEphdmFNYWlsIDEuNS4yDQorICovDQorcHVibGljIGNsYXNzIFNldmVyaXR5Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TG9nUmVjb3JkPiwgU2VyaWFsaXphYmxlIHsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBnZW5lcmF0ZWQgc2VyaWFsIHZlcnNpb24gVUlELg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI2MjA0NDIyNDUyNTE3OTE5NjVMOw0KKw0KKyAgICAvKioNCisgICAgICogQSBzaW5nbGUgaW5zdGFuY2UgdGhhdCBpcyBzaGFyZWQgYW1vbmcgdGhlIGxvZ2dpbmcgcGFja2FnZS4NCisgICAgICogVGhlIGZpZWxkIGlzIGRlY2xhcmVkIGFzIGphdmEudXRpbC5Db21wYXJhdG9yIHNvDQorICAgICAqIFdlYmFwcENsYXNzTG9hZGVyLmNsZWFyUmVmZXJlbmNlc1N0YXRpY0ZpbmFsKCkgbWV0aG9kIHdpbGwgaWdub3JlIHRoaXMNCisgICAgICogZmllbGQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPExvZ1JlY29yZD4gSU5TVEFOQ0UNCisgICAgICAgICAgICA9IG5ldyBTZXZlcml0eUNvbXBhcmF0b3IoKTsNCisNCisgICAgLyoqDQorICAgICAqIEEgc2hhcmVkIGluc3RhbmNlIG9mIGEgU2V2ZXJpdHlDb21wYXJhdG9yLiBUaGlzIGlzIHBhY2thZ2UgcHJpdmF0ZSBzbyB0aGUNCisgICAgICogcHVibGljIEFQSSBpcyBub3QgcG9sbHV0ZWQgd2l0aCBtb3JlIG1ldGhvZHMuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gYSBzaGFyZWQgaW5zdGFuY2Ugb2YgYSBTZXZlcml0eUNvbXBhcmF0b3IuDQorICAgICAqLw0KKyAgICBzdGF0aWMgU2V2ZXJpdHlDb21wYXJhdG9yIGdldEluc3RhbmNlKCkgew0KKyAgICAgICAgcmV0dXJuIChTZXZlcml0eUNvbXBhcmF0b3IpIElOU1RBTkNFOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBJZGVudGlmaWVzIGEgc2luZ2xlIHRocm93YWJsZSB0aGF0IGJlc3QgZGVzY3JpYmVzIHRoZSBnaXZlbiB0aHJvd2FibGUgYW5kDQorICAgICAqIHRoZSBlbnRpcmUge0BsaW5rcGxhaW4gVGhyb3dhYmxlI2dldENhdXNlKCkgY2F1c2V9IGNoYWluLiBUaGlzIG1ldGhvZCBjYW4NCisgICAgICogYmUgb3ZlcnJpZGRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mDQorICAgICAqIHtAbGluayAjY29tcGFyZShqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQsIGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCl9Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gY2hhaW4gdGhlIHRocm93YWJsZSBvciBudWxsLg0KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbnVsbCB3YXMgZ2l2ZW4sIG90aGVyd2lzZSB0aGUgdGhyb3dhYmxlIHRoYXQgYmVzdA0KKyAgICAgKiBkZXNjcmliZXMgdGhlIGVudGlyZSBjaGFpbi4NCisgICAgICogQHNlZSAjaXNOb3JtYWwoamF2YS5sYW5nLlRocm93YWJsZSkNCisgICAgICovDQorICAgIHB1YmxpYyBUaHJvd2FibGUgYXBwbHkoZmluYWwgVGhyb3dhYmxlIGNoYWluKSB7DQorICAgICAgICAvL01hdGNoZXMgdGhlIGoudS5mLlVuYXJ5T3BlcmF0b3I8VGhyb3dhYmxlPiBpbnRlcmZhY2UuDQorICAgICAgICBpbnQgbGltaXQgPSAwOw0KKyAgICAgICAgVGhyb3dhYmxlIHJvb3QgPSBjaGFpbjsNCisgICAgICAgIFRocm93YWJsZSBoaWdoID0gbnVsbDsNCisgICAgICAgIFRocm93YWJsZSBub3JtYWwgPSBudWxsOw0KKyAgICAgICAgZm9yIChUaHJvd2FibGUgY2F1c2UgPSBjaGFpbjsgY2F1c2UgIT0gbnVsbDsgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpKSB7DQorICAgICAgICAgICAgcm9vdCA9IGNhdXNlOyAgLy9GaW5kIHRoZSBkZWVwZXN0IGNhdXNlLg0KKw0KKyAgICAgICAgICAgIC8vRmluZCB0aGUgZGVlcGVzdCBub21yYWwgb2NjdXJyYW5jZS4NCisgICAgICAgICAgICBpZiAoaXNOb3JtYWwoY2F1c2UpKSB7DQorICAgICAgICAgICAgICAgIG5vcm1hbCA9IGNhdXNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvL0ZpbmQgdGhlIGRlZXBlc3QgZXJyb3IgdGhhdCBoYXBwZW5lZCBiZWZvcmUgYSBub3JtYWwgb2NjdXJhbmNlLg0KKyAgICAgICAgICAgIGlmIChub3JtYWwgPT0gbnVsbCAmJiBjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7DQorICAgICAgICAgICAgICAgIGhpZ2ggPSBjYXVzZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy9EZWFsIHdpdGggZXhjZXNzaXZlIGNhdXNlIGNoYWlucyBhbmQgY3ljbGljIHRocm93YWJsZXMuDQorICAgICAgICAgICAgaWYgKCsrbGltaXQgPT0gKDEgPDwgMTYpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOyAvL0dpdmUgdXAuDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGhpZ2ggIT0gbnVsbCA/IGhpZ2ggOiBub3JtYWwgIT0gbnVsbCA/IG5vcm1hbCA6IHJvb3Q7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIHtAbGluayAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSkgUmVkdWNlc30gZWFjaCB0aHJvd2FibGUgY2hhaW4gYXJndW1lbnQNCisgICAgICogdGhlbiBjb21wYXJlIGVhY2ggdGhyb3dhYmxlIHJlc3VsdC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHRjMSB0aGUgZmlyc3QgdGhyb3dhYmxlIGNoYWluIG9yIG51bGwuDQorICAgICAqIEBwYXJhbSB0YzIgdGhlIHNlY29uZCB0aHJvd2FibGUgY2hhaW4gb3IgbnVsbC4NCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QNCisgICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuDQorICAgICAqIEBzZWUgI2FwcGx5KGphdmEubGFuZy5UaHJvd2FibGUpDQorICAgICAqIEBzZWUgI2NvbXBhcmVUaHJvd2FibGUoamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS5sYW5nLlRocm93YWJsZSkNCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBpbnQgYXBwbHlUaGVuQ29tcGFyZShUaHJvd2FibGUgdGMxLCBUaHJvd2FibGUgdGMyKSB7DQorICAgICAgICByZXR1cm4gdGMxID09IHRjMiA/IDAgOiBjb21wYXJlVGhyb3dhYmxlKGFwcGx5KHRjMSksIGFwcGx5KHRjMikpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb21wYXJlcyB0d28gdGhyb3dhYmxlIG9iamVjdHMgb3IgbnVsbC4gVGhpcyBtZXRob2QgZG9lcyBub3QNCisgICAgICoge0BsaW5rICNhcHBseShqYXZhLmxhbmcuVGhyb3dhYmxlKSByZWR1Y2V9IGVhY2ggYXJndW1lbnQgYmVmb3JlDQorICAgICAqIGNvbXBhcmluZy4gVGhpcyBpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZg0KKyAgICAgKiB7QGxpbmtwbGFpbiAjY29tcGFyZShMb2dSZWNvcmQsIExvZ1JlY29yZCl9Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdDEgdGhlIGZpcnN0IHRocm93YWJsZSBvciBudWxsLg0KKyAgICAgKiBAcGFyYW0gdDIgdGhlIHNlY29uZCB0aHJvd2FibGUgb3IgbnVsbC4NCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QNCisgICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuDQorICAgICAqIEBzZWUgI2lzTm9ybWFsKGphdmEubGFuZy5UaHJvd2FibGUpDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUaHJvd2FibGUoZmluYWwgVGhyb3dhYmxlIHQxLCBmaW5hbCBUaHJvd2FibGUgdDIpIHsNCisgICAgICAgIGlmICh0MSA9PSB0MikgeyAvL1JlZmxleGl2ZSB0ZXN0IGluY2x1ZGluZyBudWxsLg0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAvL09ubHkgb25lIG9yIHRoZSBvdGhlciBpcyBudWxsIGF0IHRoaXMgcG9pbnQuDQorICAgICAgICAgICAgLy9Gb3JjZSBub3JtYWwgb2NjdXJyZW5jZSB0byBiZSBsb3dlciB0aGFuIG51bGwuDQorICAgICAgICAgICAgaWYgKHQxID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQyKSA/IDEgOiAtMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAodDIgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQxKSA/IC0xIDogMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvL0Zyb20gdGhpcyBwb2ludCBvbiBuZWl0aGVyIGFyZSBudWxsLg0KKyAgICAgICAgICAgIC8vRm9sbG93IHRoZSBzaG9ydGN1dCBpZiB3ZSBjYW4uDQorICAgICAgICAgICAgaWYgKHQxLmdldENsYXNzKCkgPT0gdDIuZ2V0Q2xhc3MoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy9FbnN1cmUgbm9ybWFsIG9jY3VycmVuY2UgZmxvdyBjb250cm9sIGlzIG9yZGVyZWQgbG93Lg0KKyAgICAgICAgICAgIGlmIChpc05vcm1hbCh0MSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9ybWFsKHQyKSA/IDAgOiAtMTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAoaXNOb3JtYWwodDIpKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvL1JhbmsgdGhlIHR3byB1bmlkZW50aWNpYWwgdGhyb3dhYmxlcyB1c2luZyB0aGUgcnVsZXMgZnJvbQ0KKyAgICAgICAgICAgIC8vSkxTIDExLjEuMS4gVGhlIEtpbmRzIG9mIEV4Y2VwdGlvbnMgYW5kDQorICAgICAgICAgICAgLy9KTFMgMTEuNSBUaGUgRXhjZXB0aW9uIEhpZXJhcmNoeS4NCisgICAgICAgICAgICBpZiAodDEgaW5zdGFuY2VvZiBFcnJvcikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdDIgaW5zdGFuY2VvZiBFcnJvciA/IDAgOiAxOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodDEgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0MiBpbnN0YW5jZW9mIEVycm9yID8gLTENCisgICAgICAgICAgICAgICAgICAgICAgICA6IHQyIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbiA/IDAgOiAxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiB0MiBpbnN0YW5jZW9mIEVycm9yDQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdDIgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uID8gLTEgOiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29tcGFyZXMgdHdvIGxvZyByZWNvcmRzIGJhc2VkIG9uIHNldmVyaXR5Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbzEgdGhlIGZpcnN0IGxvZyByZWNvcmQuDQorICAgICAqIEBwYXJhbSBvMiB0aGUgc2Vjb25kIGxvZyByZWNvcmQuDQorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0DQorICAgICAqIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLg0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBhcmd1bWVudCBpcyBudWxsLg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoIm92ZXJyaWRlIikgLy9KREstNjk1NDIzNA0KKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgTG9nUmVjb3JkIG8xLCBmaW5hbCBMb2dSZWNvcmQgbzIpIHsNCisgICAgICAgIGlmIChvMSA9PSBudWxsIHx8IG8yID09IG51bGwpIHsgLy9Eb24ndCBhbGxvdyBudWxsLg0KKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbih0b1N0cmluZyhvMSwgbzIpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogTG9nUmVjb3JkcyBhcmUgbXV0YWJsZSBzbyBhIHJlZmxleGl2ZSByZWxhdGlvbnNoaXAgdGVzdCBpcyBhIHNhZmV0eQ0KKyAgICAgICAgICogcmVxdWlyZW1lbnQuDQorICAgICAgICAgKi8NCisgICAgICAgIGlmIChvMSA9PSBvMikgew0KKyAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW50IGNtcCA9IGNvbXBhcmUobzEuZ2V0TGV2ZWwoKSwgbzIuZ2V0TGV2ZWwoKSk7DQorICAgICAgICBpZiAoY21wID09IDApIHsNCisgICAgICAgICAgICBjbXAgPSBhcHBseVRoZW5Db21wYXJlKG8xLmdldFRocm93bigpLCBvMi5nZXRUaHJvd24oKSk7DQorICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGNtcCA9IGNvbXBhcmUobzEuZ2V0U2VxdWVuY2VOdW1iZXIoKSwgbzIuZ2V0U2VxdWVuY2VOdW1iZXIoKSk7DQorICAgICAgICAgICAgICAgIGlmIChjbXAgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgY21wID0gY29tcGFyZShvMS5nZXRNaWxsaXMoKSwgbzIuZ2V0TWlsbGlzKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGNtcDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFsc28gYSBjb21wYXJhdG9yIGFuZCBpdCBpbXBvc2VzIHRoZQ0KKyAgICAgKiBzYW1lIG9yZGVyaW5nIGFzIHRoaXMgY29tcGFyYXRvci4NCisgICAgICoNCisgICAgICogQHBhcmFtIG8gdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlLg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgZXF1YWwgdG8gdGhlIGFyZ3VtZW50OyBmYWxzZSBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7DQorICAgICAgICByZXR1cm4gbyA9PSBudWxsID8gZmFsc2UgOiBvLmdldENsYXNzKCkgPT0gZ2V0Q2xhc3MoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4NCisgICAgICoNCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGUgb2JqZWN0Lg0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gMzEgKiBnZXRDbGFzcygpLmhhc2hDb2RlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRocm93YWJsZSBpbnN0YW5jZSBpcyAibm9ybWFsIG9jY3VycmVuY2UiLiBUaGlzDQorICAgICAqIGlzIGFueSBjaGVja2VkIG9yIHVuY2hlY2tlZCBleGNlcHRpb24gd2l0aCAnSW50ZXJydXB0JyBpbiB0aGUgY2xhc3MgbmFtZQ0KKyAgICAgKiBvciBhbmNlc3RyYWwgY2xhc3MgbmFtZS4gQW55IHtAY29kZSBqYXZhLmxhbmcuVGhyZWFkRGVhdGh9IG9iamVjdCBvcg0KKyAgICAgKiBzdWJjbGFzc2VzLg0KKyAgICAgKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoZQ0KKyAgICAgKiB7QGxpbmtwbGFpbiAjYXBwbHkoamF2YS5sYW5nLlRocm93YWJsZSl9IG1ldGhvZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHQgYSB0aHJvd2FibGUgb3IgbnVsbC4NCisgICAgICogQHJldHVybiB0cnVlIHRoZSBnaXZlbiB0aHJvd2FibGUgaXMgYSAibm9ybWFsIG9jY3VycmVuY2UiLg0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNOb3JtYWwoZmluYWwgVGhyb3dhYmxlIHQpIHsNCisgICAgICAgIGlmICh0ID09IG51bGwpIHsgLy9UaGlzIGlzIG9ubHkgbmVlZGVkIHdoZW4gY2FsbGVkIGRpcmVjdGx5Lg0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVXNlIHRoZSBjbGFzcyBuYW1lcyB0byBhdm9pZCBsb2FkaW5nIG1vcmUgY2xhc3Nlcy4NCisgICAgICAgICAqLw0KKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcm9vdCA9IFRocm93YWJsZS5jbGFzczsNCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGVycm9yID0gRXJyb3IuY2xhc3M7DQorICAgICAgICBmb3IgKENsYXNzPD8+IGMgPSB0LmdldENsYXNzKCk7IGMgIT0gcm9vdDsgYyA9IGMuZ2V0U3VwZXJjbGFzcygpKSB7DQorICAgICAgICAgICAgaWYgKGVycm9yLmlzQXNzaWduYWJsZUZyb20oYykpIHsNCisgICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlRocmVhZERlYXRoIikpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQsIEludGVycnVwdGVkIG9yIEludGVycnVwdGlvbi4NCisgICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpLmNvbnRhaW5zKCJJbnRlcnJ1cHQiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbXBhcmUgdHdvIGxldmVsIG9iamVjdHMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhIHRoZSBmaXJzdCBsZXZlbC4NCisgICAgICogQHBhcmFtIGIgdGhlIHNlY29uZCBsZXZlbC4NCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QNCisgICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGludCBjb21wYXJlKGZpbmFsIExldmVsIGEsIGZpbmFsIExldmVsIGIpIHsNCisgICAgICAgIHJldHVybiBhID09IGIgPyAwIDogY29tcGFyZShhLmludFZhbHVlKCksIGIuaW50VmFsdWUoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE91dGxpbmUgdGhlIG1lc3NhZ2UgY3JlYXRlIHN0cmluZy4NCisgICAgICoNCisgICAgICogQHBhcmFtIG8xIGFyZ3VtZW50IG9uZS4NCisgICAgICogQHBhcmFtIG8yIGFyZ3VtZW50IHR3by4NCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgT2JqZWN0IG8xLCBmaW5hbCBPYmplY3QgbzIpIHsNCisgICAgICAgIHJldHVybiBvMSArICIsICIgKyBvMjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29tcGFyZSB0d28gbG9uZ3MuIENhbiBiZSByZW1vdmVkIHdoZW4gSkRLIDEuNyBpcyByZXF1aXJlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHggdGhlIGZpcnN0IGxvbmcuDQorICAgICAqIEBwYXJhbSB5IHRoZSBzZWNvbmQgbG9uZy4NCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QNCisgICAgICogYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuDQorICAgICAqLw0KKyAgICBwcml2YXRlIGludCBjb21wYXJlKGZpbmFsIGxvbmcgeCwgZmluYWwgbG9uZyB5KSB7DQorICAgICAgICByZXR1cm4geCA8IHkgPyAtMSA6IHggPiB5ID8gMSA6IDA7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvcGFja2FnZS5odG1sIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL2xvZ2dpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRhYzFhLi4wMDAwMDAwCi0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9sb2dnaW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotICA8aGVhZD4KLTwhLS0KLQotICAgIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCi0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIEphc29uIE1laHJlbnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKLSAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0KLSAgICBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAgICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICAgIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQotICAgIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLSAgICBNb2RpZmljYXRpb25zOgotICAgIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gICAgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgIENvbnRyaWJ1dG9yKHMpOgotICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgotICAgIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gICAgZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gICAgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQotICAgIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAgICBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAgICBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKLSAgICBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gICAgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAgICBob2xkZXIuCi0KLS0tPgotCi0gICAgPHRpdGxlPjwvdGl0bGU+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8L2hlYWQ+Ci0gIDxib2R5PgotICAgICAgQ29udGFpbnMgSmF2YU1haWw8c3VwPjxmb250IHNpemU9Ii0yIj5UTTwvZm9udD48L3N1cD4gZXh0ZW5zaW9ucyBmb3IKLSAgICAgIHRoZSBKYXZhPFNVUD48Rk9OVCBTSVpFPSItMiI+VE08L0ZPTlQ+PC9TVVA+IHBsYXRmb3JtJ3MgY29yZSBsb2dnaW5nCi0gICAgICBmYWNpbGl0aWVzLiAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdXNlZCB0byBleHBvcnQgbG9nIG1lc3NhZ2VzCi0gICAgICBhcyBhIGZvcm1hdHRlZCBlbWFpbCBtZXNzYWdlLiAgQ2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgdHlwaWNhbGx5IHVzZQotICAgICAgTG9nTWFuYWdlciBwcm9wZXJ0aWVzIHRvIHNldCBkZWZhdWx0IHZhbHVlczsgc2VlIHRoZSBzcGVjaWZpYwotICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBjb25jcmV0ZSBjbGFzcy4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL3BhY2thZ2UuaHRtbCBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9jb20vc3VuL21haWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjM3NDUuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vbWFpbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tCi0KLSAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgQ29weXJpZ2h0IChjKSAxOTk3LTIwMTIgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCi0gICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAgICBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQotICAgIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgotICAgIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gICAgb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwotICAgIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICAgIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLQotICAgIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgotICAgIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gICAgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlCi0gICAgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLQotICAgIE1vZGlmaWNhdGlvbnM6Ci0gICAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMKLSAgICBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotCi0gICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yCi0gICAgb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0KLSAgICBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAgICBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhCi0gICAgcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotICAgIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICAgIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQotICAgIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMKLSAgICBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICAgIGhvbGRlci4KLQotLS0+Ci0KLTwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLQotVXRpbGl0eSBjbGFzc2VzIGZvciB1c2Ugd2l0aCB0aGUgSmF2YU1haWwgQVBJLgotVGhlc2UgdXRpbGl0eSBjbGFzc2VzIGFyZSBub3QgcGFydCBvZiB0aGUgSmF2YU1haWwgc3BlY2lmaWNhdGlvbi4KLVdoaWxlIHRoaXMgcGFja2FnZSBjb250YWlucyBtYW55IGNsYXNzZXMgdXNlZCBieSB0aGUgSmF2YU1haWwgaW1wbGVtZW50YXRpb24KLWFuZCBub3QgaW50ZW5kZWQgZm9yIGRpcmVjdCB1c2UgYnkgYXBwbGljYXRpb25zLCB0aGUgY2xhc3NlcyBkb2N1bWVudGVkCi1oZXJlIG1heSBiZSBvZiB1c2UgdG8gYXBwbGljYXRpb25zLgotPFA+Ci1DbGFzc2VzIGluIHRoaXMgcGFja2FnZSBsb2cgZGVidWdnaW5nIGluZm9ybWF0aW9uIHVzaW5nCi17QGxpbmsgamF2YS51dGlsLmxvZ2dpbmd9IGFzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPkxvZ2dlciBOYW1lPC9USD4KLTxUSD5Mb2dnaW5nIExldmVsPC9USD4KLTxUSD5QdXJwb3NlPC9USD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5jb20uc3VuLm1haWwudXRpbC5zb2NrZXQ8L1REPgotPFREPkZJTkVSPC9URD4KLTxURD5EZWJ1Z2dpbmcgb3V0cHV0IHJlbGF0ZWQgdG8gY3JlYXRpbmcgc29ja2V0czwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08c3Ryb25nPldBUk5JTkc6PC9zdHJvbmc+IFRoZSBBUElzIGluIHRoaXMgcGFja2FnZSBzaG91bGQgYmUKLWNvbnNpZGVyZWQgPHN0cm9uZz5FWFBFUklNRU5UQUw8L3N0cm9uZz4uICBUaGV5IG1heSBiZSBjaGFuZ2VkIGluIHRoZQotZnV0dXJlIGluIHdheXMgdGhhdCBhcmUgaW5jb21wYXRpYmxlIHdpdGggYXBwbGljYXRpb25zIHVzaW5nIHRoZQotY3VycmVudCBBUElzLgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvZG9jLWZpbGVzL3NwZWNsaWNlbnNlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvZG9jLWZpbGVzL3NwZWNsaWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWFiMzkuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2RvYy1maWxlcy9zcGVjbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U3BlY2lmaWNhdGlvbiBMaWNlbnNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotU3BlY2lmaWNhdGlvbjogSlNSLTkxOSBKYXZhTWFpbCBBUEkgU3BlY2lmaWNhdGlvbiAoIlNwZWNpZmljYXRpb24iKQotPGJyLz4KLVZlcnNpb246IDEuNQotPGJyLz4KLVN0YXR1czogRmluYWwgUmVsZWFzZQotPGJyLz4KLVNwZWNpZmljYXRpb24gTGVhZDogT3JhY2xlIEFtZXJpY2EsIEluYy4gKCJTcGVjaWZpY2F0aW9uIExlYWQiKQotPGJyLz4KLVJlbGVhc2U6IE1hcmNoIDE4LCAyMDEzCi08YnIvPgotCi08YnIvPgotQ29weXJpZ2h0ICYjMTY5OyAyMDEzIE9yYWNsZSBBbWVyaWNhLCBJbmMuCi08YnIvPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTxici8+Ci08cD4KLUxJTUlURUQgTElDRU5TRSBHUkFOVFMKLTxici8+Ci0xLiBMaWNlbnNlIGZvciBFdmFsdWF0aW9uIFB1cnBvc2VzLiBTcGVjaWZpY2F0aW9uIExlYWQgaGVyZWJ5IGdyYW50cwoteW91IGEgZnVsbHktcGFpZCwgbm9uLWV4Y2x1c2l2ZSwgbm9uLXRyYW5zZmVyYWJsZSwgd29ybGR3aWRlLCBsaW1pdGVkCi1saWNlbnNlICh3aXRob3V0IHRoZSByaWdodCB0byBzdWJsaWNlbnNlKSwgdW5kZXIgU3BlY2lmaWNhdGlvbiBMZWFkJ3MKLWFwcGxpY2FibGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyB0byB2aWV3LCBkb3dubG9hZCwgdXNlIGFuZAotcmVwcm9kdWNlIHRoZSBTcGVjaWZpY2F0aW9uIG9ubHkgZm9yIHRoZSBwdXJwb3NlIG9mIGludGVybmFsCi1ldmFsdWF0aW9uLiAgVGhpcyBpbmNsdWRlcyAoaSkgZGV2ZWxvcGluZyBhcHBsaWNhdGlvbnMgaW50ZW5kZWQgdG8gcnVuCi1vbiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3BlY2lmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCBzdWNoCi1hcHBsaWNhdGlvbnMgZG8gbm90IHRoZW1zZWx2ZXMgaW1wbGVtZW50IGFueSBwb3J0aW9uKHMpIG9mIHRoZQotU3BlY2lmaWNhdGlvbiwgYW5kIChpaSkgZGlzY3Vzc2luZyB0aGUgU3BlY2lmaWNhdGlvbiB3aXRoIGFueSB0aGlyZAotcGFydHk7IGFuZCAoaWlpKSBleGNlcnB0aW5nIGJyaWVmIHBvcnRpb25zIG9mIHRoZSBTcGVjaWZpY2F0aW9uIGluIG9yYWwKLW9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbnMgd2hpY2ggZGlzY3VzcyB0aGUgU3BlY2lmaWNhdGlvbiBwcm92aWRlZCB0aGF0Ci1zdWNoIGV4Y2VycHRzIGRvIG5vdCBpbiB0aGUgYWdncmVnYXRlIGNvbnN0aXR1dGUgYSBzaWduaWZpY2FudCBwb3J0aW9uCi1vZiB0aGUgU3BlY2lmaWNhdGlvbi4KLTwvcD4KLTxwPgotMi4gTGljZW5zZSBmb3IgdGhlIERpc3RyaWJ1dGlvbiBvZiBDb21wbGlhbnQgSW1wbGVtZW50YXRpb25zLgotU3BlY2lmaWNhdGlvbiBMZWFkICBhbHNvIGdyYW50cyB5b3UgYSBwZXJwZXR1YWwsIG5vbi1leGNsdXNpdmUsCi1ub24tdHJhbnNmZXJhYmxlLCB3b3JsZHdpZGUsIGZ1bGx5IHBhaWQtdXAsIHJveWFsdHkgZnJlZSwgbGltaXRlZAotbGljZW5zZSAod2l0aG91dCB0aGUgcmlnaHQgdG8gc3VibGljZW5zZSkgdW5kZXIgYW55IGFwcGxpY2FibGUKLWNvcHlyaWdodHMgb3IsIHN1YmplY3QgdG8gdGhlIHByb3Zpc2lvbnMgb2Ygc3Vic2VjdGlvbiA0IGJlbG93LCBwYXRlbnQKLXJpZ2h0cyBpdCBtYXkgaGF2ZSBjb3ZlcmluZyB0aGUgU3BlY2lmaWNhdGlvbiB0byBjcmVhdGUgYW5kL29yCi1kaXN0cmlidXRlIGFuIEluZGVwZW5kZW50IEltcGxlbWVudGF0aW9uIG9mIHRoZSBTcGVjaWZpY2F0aW9uIHRoYXQ6IChhKQotZnVsbHkgaW1wbGVtZW50cyB0aGUgU3BlY2lmaWNhdGlvbiBpbmNsdWRpbmcgYWxsIGl0cyByZXF1aXJlZAotaW50ZXJmYWNlcyBhbmQgZnVuY3Rpb25hbGl0eTsgKGIpIGRvZXMgbm90IG1vZGlmeSwgc3Vic2V0LCBzdXBlcnNldCBvcgotb3RoZXJ3aXNlIGV4dGVuZCB0aGUgTGljZW5zb3IgTmFtZSBTcGFjZSwgb3IgaW5jbHVkZSBhbnkgcHVibGljIG9yCi1wcm90ZWN0ZWQgcGFja2FnZXMsIGNsYXNzZXMsIEphdmEgaW50ZXJmYWNlcywgZmllbGRzIG9yIG1ldGhvZHMgd2l0aGluCi10aGUgTGljZW5zb3IgTmFtZSBTcGFjZSBvdGhlciB0aGFuIHRob3NlIHJlcXVpcmVkL2F1dGhvcml6ZWQgYnkgdGhlCi1TcGVjaWZpY2F0aW9uIG9yIFNwZWNpZmljYXRpb25zIGJlaW5nIGltcGxlbWVudGVkOyBhbmQgKGMpIHBhc3NlcyB0aGUKLVRlY2hub2xvZ3kgQ29tcGF0aWJpbGl0eSBLaXQgKGluY2x1ZGluZyBzYXRpc2Z5aW5nIHRoZSByZXF1aXJlbWVudHMgb2YKLXRoZSBhcHBsaWNhYmxlIFRDSyBVc2VycyBHdWlkZSkgZm9yIHN1Y2ggU3BlY2lmaWNhdGlvbiAoIkNvbXBsaWFudAotSW1wbGVtZW50YXRpb24iKS4gIEluIGFkZGl0aW9uLCB0aGUgZm9yZWdvaW5nIGxpY2Vuc2UgaXMgZXhwcmVzc2x5Ci1jb25kaXRpb25lZCBvbiB5b3VyIG5vdCBhY3Rpbmcgb3V0c2lkZSBpdHMgc2NvcGUuICBObyBsaWNlbnNlIGlzCi1ncmFudGVkIGhlcmV1bmRlciBmb3IgYW55IG90aGVyIHB1cnBvc2UgKGluY2x1ZGluZywgZm9yIGV4YW1wbGUsCi1tb2RpZnlpbmcgdGhlIFNwZWNpZmljYXRpb24sIG90aGVyIHRoYW4gdG8gdGhlIGV4dGVudCBvZiB5b3VyIGZhaXIgdXNlCi1yaWdodHMsIG9yIGRpc3RyaWJ1dGluZyB0aGUgU3BlY2lmaWNhdGlvbiB0byB0aGlyZCBwYXJ0aWVzKS4gIEFsc28sIG5vCi1yaWdodCwgdGl0bGUsIG9yIGludGVyZXN0IGluIG9yIHRvIGFueSB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvcgotdHJhZGUgbmFtZXMgb2YgU3BlY2lmaWNhdGlvbiBMZWFkIG9yIFNwZWNpZmljYXRpb24gTGVhZCdzIGxpY2Vuc29ycyBpcwotZ3JhbnRlZCBoZXJldW5kZXIuICBKYXZhLCBhbmQgSmF2YS1yZWxhdGVkIGxvZ29zLCBtYXJrcyBhbmQgbmFtZXMgYXJlCi10cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQW1lcmljYSwgSW5jLiBpbiB0aGUgVS5TLgotYW5kIG90aGVyIGNvdW50cmllcy4KLTwvcD4KLTxwPgotMy4gUGFzcy10aHJvdWdoIENvbmRpdGlvbnMuIFlvdSBuZWVkIG5vdCBpbmNsdWRlIGxpbWl0YXRpb25zIChhKS0oYykKLWZyb20gdGhlIHByZXZpb3VzIHBhcmFncmFwaCBvciBhbnkgb3RoZXIgcGFydGljdWxhciAicGFzcyB0aHJvdWdoIgotcmVxdWlyZW1lbnRzIGluIGFueSBsaWNlbnNlIFlvdSBncmFudCBjb25jZXJuaW5nIHRoZSB1c2Ugb2YgeW91cgotSW5kZXBlbmRlbnQgSW1wbGVtZW50YXRpb24gb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIGl0LiAgSG93ZXZlciwKLWV4Y2VwdCB3aXRoIHJlc3BlY3QgdG8gSW5kZXBlbmRlbnQgSW1wbGVtZW50YXRpb25zIChhbmQgcHJvZHVjdHMKLWRlcml2ZWQgZnJvbSB0aGVtKSB0aGF0IHNhdGlzZnkgbGltaXRhdGlvbnMgKGEpLShjKSBmcm9tIHRoZSBwcmV2aW91cwotcGFyYWdyYXBoLCBZb3UgbWF5IG5laXRoZXI6ICAoYSkgZ3JhbnQgb3Igb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaCB0bwoteW91ciBsaWNlbnNlZXMgYW55IGxpY2Vuc2VzIHVuZGVyIFNwZWNpZmljYXRpb24gTGVhZCdzICBhcHBsaWNhYmxlCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzOyBub3IgKGIpIGF1dGhvcml6ZSB5b3VyIGxpY2Vuc2VlcyB0byBtYWtlCi1hbnkgY2xhaW1zIGNvbmNlcm5pbmcgdGhlaXIgaW1wbGVtZW50YXRpb24ncyBjb21wbGlhbmNlIHdpdGggdGhlCi1TcGVjaWZpY2F0aW9uIGluIHF1ZXN0aW9uLgotPC9wPgotPHA+Ci00LiBSZWNpcHJvY2l0eSBDb25jZXJuaW5nIFBhdGVudCBMaWNlbnNlcy4gIAotPGJyLz4KLWEuICBXaXRoIHJlc3BlY3QgdG8gYW55IHBhdGVudCBjbGFpbXMgY292ZXJlZCBieSB0aGUgbGljZW5zZSBncmFudGVkCi11bmRlciBzdWJwYXJhZ3JhcGggMiBhYm92ZSB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBhbGwgdGVjaG5pY2FsbHkKLWZlYXNpYmxlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgU3BlY2lmaWNhdGlvbiwgc3VjaCBsaWNlbnNlIGlzCi1jb25kaXRpb25lZCB1cG9uIHlvdXIgb2ZmZXJpbmcgb24gZmFpciwgcmVhc29uYWJsZSBhbmQKLW5vbi1kaXNjcmltaW5hdG9yeSB0ZXJtcywgdG8gYW55IHBhcnR5IHNlZWtpbmcgaXQgZnJvbSBZb3UsIGEKLXBlcnBldHVhbCwgbm9uLWV4Y2x1c2l2ZSwgbm9uLXRyYW5zZmVyYWJsZSwgd29ybGR3aWRlIGxpY2Vuc2UgdW5kZXIKLVlvdXIgcGF0ZW50IHJpZ2h0cyB3aGljaCBhcmUgb3Igd291bGQgYmUgaW5mcmluZ2VkIGJ5IGFsbCB0ZWNobmljYWxseQotZmVhc2libGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTcGVjaWZpY2F0aW9uIHRvIGRldmVsb3AsIGRpc3RyaWJ1dGUKLWFuZCB1c2UgYSBDb21wbGlhbnQgSW1wbGVtZW50YXRpb24uCi08YnIvPgotYi4gIFdpdGggcmVzcGVjdCB0byBhbnkgcGF0ZW50IGNsYWltcyBvd25lZCBieSBTcGVjaWZpY2F0aW9uIExlYWQgYW5kCi1jb3ZlcmVkIGJ5IHRoZSBsaWNlbnNlIGdyYW50ZWQgdW5kZXIgc3VicGFyYWdyYXBoIDIsIHdoZXRoZXIgb3Igbm90Ci10aGVpciBpbmZyaW5nZW1lbnQgY2FuIGJlIGF2b2lkZWQgaW4gYSB0ZWNobmljYWxseSBmZWFzaWJsZSBtYW5uZXIgd2hlbgotaW1wbGVtZW50aW5nIHRoZSBTcGVjaWZpY2F0aW9uLCBzdWNoIGxpY2Vuc2Ugc2hhbGwgdGVybWluYXRlIHdpdGgKLXJlc3BlY3QgdG8gc3VjaCBjbGFpbXMgaWYgWW91IGluaXRpYXRlIGEgY2xhaW0gYWdhaW5zdCBTcGVjaWZpY2F0aW9uCi1MZWFkIHRoYXQgaXQgaGFzLCBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgaXRzIHJlc3BvbnNpYmlsaXRpZXMgYXMKLXRoZSBTcGVjaWZpY2F0aW9uIExlYWQsIGluZHVjZWQgYW55IG90aGVyIGVudGl0eSB0byBpbmZyaW5nZSBZb3VyCi1wYXRlbnQgcmlnaHRzLgotPGJyLz4KLWMuICBBbHNvIHdpdGggcmVzcGVjdCB0byBhbnkgcGF0ZW50IGNsYWltcyBvd25lZCBieSBTcGVjaWZpY2F0aW9uIExlYWQKLWFuZCBjb3ZlcmVkIGJ5IHRoZSBsaWNlbnNlIGdyYW50ZWQgdW5kZXIgc3VicGFyYWdyYXBoIDIgYWJvdmUsIHdoZXJlCi10aGUgaW5mcmluZ2VtZW50IG9mIHN1Y2ggY2xhaW1zIGNhbiBiZSBhdm9pZGVkIGluIGEgdGVjaG5pY2FsbHkKLWZlYXNpYmxlIG1hbm5lciB3aGVuIGltcGxlbWVudGluZyB0aGUgU3BlY2lmaWNhdGlvbiBzdWNoIGxpY2Vuc2UsIHdpdGgKLXJlc3BlY3QgdG8gc3VjaCBjbGFpbXMsIHNoYWxsIHRlcm1pbmF0ZSBpZiBZb3UgaW5pdGlhdGUgYSBjbGFpbSBhZ2FpbnN0Ci1TcGVjaWZpY2F0aW9uIExlYWQgIHRoYXQgaXRzIG1ha2luZywgaGF2aW5nIG1hZGUsIHVzaW5nLCBvZmZlcmluZyB0bwotc2VsbCwgc2VsbGluZyBvciBpbXBvcnRpbmcgYSBDb21wbGlhbnQgSW1wbGVtZW50YXRpb24gaW5mcmluZ2VzIFlvdXIKLXBhdGVudCByaWdodHMuCi08L3A+Ci08cD4KLTUuIERlZmluaXRpb25zLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgQWdyZWVtZW50OiAgIkluZGVwZW5kZW50Ci1JbXBsZW1lbnRhdGlvbiIgc2hhbGwgbWVhbiBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3BlY2lmaWNhdGlvbiB0aGF0Ci1uZWl0aGVyIGRlcml2ZXMgZnJvbSBhbnkgb2YgU3BlY2lmaWNhdGlvbiBMZWFkJ3MgIHNvdXJjZSBjb2RlIG9yIGJpbmFyeQotY29kZSBtYXRlcmlhbHMgbm9yLCBleGNlcHQgd2l0aCBhbiBhcHByb3ByaWF0ZSBhbmQgc2VwYXJhdGUgbGljZW5zZQotZnJvbSBTcGVjaWZpY2F0aW9uIExlYWQsIGluY2x1ZGVzIGFueSBvZiBTcGVjaWZpY2F0aW9uIExlYWQncyAgc291cmNlCi1jb2RlIG9yIGJpbmFyeSBjb2RlIG1hdGVyaWFsczsgIkxpY2Vuc29yIE5hbWUgU3BhY2UiIHNoYWxsIG1lYW4gdGhlCi1wdWJsaWMgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJqYXZhIiwKLSJqYXZheCIsICJjb20uc3VuIiBhbmQgImNvbS5vcmFjbGUiIG9yIHRoZWlyIGVxdWl2YWxlbnRzIGluIGFueQotc3Vic2VxdWVudCBuYW1pbmcgY29udmVudGlvbiBhZG9wdGVkIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIHRocm91Z2gKLXRoZSBKYXZhIENvbW11bml0eSBQcm9jZXNzLCBvciBhbnkgcmVjb2duaXplZCBzdWNjZXNzb3JzIG9yCi1yZXBsYWNlbWVudHMgdGhlcmVvZjsgYW5kICJUZWNobm9sb2d5IENvbXBhdGliaWxpdHkgS2l0IiBvciAiVENLIiBzaGFsbAotbWVhbiB0aGUgdGVzdCBzdWl0ZSBhbmQgYWNjb21wYW55aW5nIFRDSyBVc2VyJ3MgR3VpZGUgcHJvdmlkZWQgYnkKLVNwZWNpZmljYXRpb24gTGVhZCAgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIFNwZWNpZmljYXRpb24gYW5kIHRoYXQgd2FzCi1hdmFpbGFibGUgZWl0aGVyIChpKSBmcm9tIFNwZWNpZmljYXRpb24gTGVhZCdzIDEyMCBkYXlzIGJlZm9yZSB0aGUKLWZpcnN0IHJlbGVhc2Ugb2YgWW91ciBJbmRlcGVuZGVudCBJbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBpdHMgdXNlCi1mb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgb3IgKGlpKSBtb3JlIHJlY2VudGx5IHRoYW4gMTIwIGRheXMgZnJvbSBzdWNoCi1yZWxlYXNlIGJ1dCBhZ2FpbnN0IHdoaWNoIFlvdSBlbGVjdCB0byB0ZXN0IFlvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi1TcGVjaWZpY2F0aW9uLgotPC9wPgotPHA+Ci1UaGlzIEFncmVlbWVudCB3aWxsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseSB3aXRob3V0IG5vdGljZSBmcm9tCi1TcGVjaWZpY2F0aW9uIExlYWQgaWYgeW91IGJyZWFjaCB0aGUgQWdyZWVtZW50IG9yIGFjdCBvdXRzaWRlIHRoZSBzY29wZQotb2YgdGhlIGxpY2Vuc2VzIGdyYW50ZWQgYWJvdmUuCi08L3A+Ci08cD4KLURJU0NMQUlNRVIgT0YgV0FSUkFOVElFUyAKLTxici8+Ci1USEUgU1BFQ0lGSUNBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiLiBTUEVDSUZJQ0FUSU9OIExFQUQgTUFLRVMgTk8KLVJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi1OT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSwgTk9OLUlORlJJTkdFTUVOVCAoSU5DTFVESU5HIEFTIEEgQ09OU0VRVUVOQ0UgT0YgQU5ZIFBSQUNUSUNFCi1PUiBJTVBMRU1FTlRBVElPTiBPRiBUSEUgU1BFQ0lGSUNBVElPTiksIE9SIFRIQVQgVEhFIENPTlRFTlRTIE9GIFRIRQotU1BFQ0lGSUNBVElPTiBBUkUgU1VJVEFCTEUgRk9SIEFOWSBQVVJQT1NFLiAgVGhpcyBkb2N1bWVudCBkb2VzIG5vdAotcmVwcmVzZW50IGFueSBjb21taXRtZW50IHRvIHJlbGVhc2Ugb3IgaW1wbGVtZW50IGFueSBwb3J0aW9uIG9mIHRoZQotU3BlY2lmaWNhdGlvbiBpbiBhbnkgcHJvZHVjdC4gSW4gYWRkaXRpb24sIHRoZSBTcGVjaWZpY2F0aW9uIGNvdWxkCi1pbmNsdWRlIHRlY2huaWNhbCBpbmFjY3VyYWNpZXMgb3IgdHlwb2dyYXBoaWNhbCBlcnJvcnMuCi08L3A+Ci08cD4KLUxJTUlUQVRJT04gT0YgTElBQklMSVRZCi08YnIvPgotVE8gVEhFIEVYVEVOVCBOT1QgUFJPSElCSVRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFdJTEwgU1BFQ0lGSUNBVElPTgotTEVBRCBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMsIElOQ0xVRElORyBXSVRIT1VUCi1MSU1JVEFUSU9OLCBMT1NUIFJFVkVOVUUsIFBST0ZJVFMgT1IgREFUQSwgT1IgRk9SIFNQRUNJQUwsIElORElSRUNULAotQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRSBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQKLVJFR0FSRExFU1MgT0YgVEhFIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIFJFTEFURUQgSU4gQU5ZCi1XQVkgVE8gWU9VUiBIQVZJTkcsIElNUEVMRU1FTlRJTkcgT1IgT1RIRVJXSVNFIFVTSU5HIFVTSU5HICBUSEUKLVNQRUNJRklDQVRJT04sIEVWRU4gSUYgU1BFQ0lGSUNBVElPTiBMRUFEIEFORC9PUiBJVFMgTElDRU5TT1JTIEhBVkUKLUJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiAgWW91IHdpbGwgaW5kZW1uaWZ5LAotaG9sZCBoYXJtbGVzcywgYW5kIGRlZmVuZCBTcGVjaWZpY2F0aW9uIExlYWQgYW5kIGl0cyBsaWNlbnNvcnMgZnJvbSBhbnkKLWNsYWltcyBhcmlzaW5nIG9yIHJlc3VsdGluZyBmcm9tOiAoaSkgeW91ciB1c2Ugb2YgdGhlIFNwZWNpZmljYXRpb247Ci0oaWkpIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uIG9mIHlvdXIgSmF2YSBhcHBsaWNhdGlvbiwgYXBwbGV0IGFuZC9vcgotaW1wbGVtZW50YXRpb247IGFuZC9vciAoaWlpKSBhbnkgY2xhaW1zIHRoYXQgbGF0ZXIgdmVyc2lvbnMgb3IgcmVsZWFzZXMKLW9mIGFueSBTcGVjaWZpY2F0aW9uIGZ1cm5pc2hlZCB0byB5b3UgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZQotU3BlY2lmaWNhdGlvbiBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhpcyBsaWNlbnNlLgotPC9wPgotPHA+Ci1SRVNUUklDVEVEIFJJR0hUUyBMRUdFTkQgCi08YnIvPgotVS5TLiBHb3Zlcm5tZW50OiBJZiB0aGlzIFNwZWNpZmljYXRpb24gaXMgYmVpbmcgYWNxdWlyZWQgYnkgb3Igb24KLWJlaGFsZiBvZiB0aGUgVS5TLiBHb3Zlcm5tZW50IG9yIGJ5IGEgVS5TLiBHb3Zlcm5tZW50IHByaW1lIGNvbnRyYWN0b3IKLW9yIHN1YmNvbnRyYWN0b3IgKGF0IGFueSB0aWVyKSwgdGhlbiB0aGUgR292ZXJubWVudCdzIHJpZ2h0cyBpbiB0aGUKLVNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBzaGFsbCBiZSBvbmx5IGFzIHNldCBmb3J0aCBpbgotdGhpcyBsaWNlbnNlOyB0aGlzIGlzIGluIGFjY29yZGFuY2Ugd2l0aCA0OCBDLkYuUi4gMjI3LjcyMDEgdGhyb3VnaAotMjI3LjcyMDItNCAoZm9yIERlcGFydG1lbnQgb2YgRGVmZW5zZSAoRG9EKSBhY3F1aXNpdGlvbnMpIGFuZCB3aXRoIDQ4Ci1DLkYuUi4gMi4xMDEgYW5kIDEyLjIxMiAoZm9yIG5vbi1Eb0QgYWNxdWlzaXRpb25zKS4KLTwvcD4KLTxwPgotUkVQT1JUCi08YnIvPgotSWYgeW91IHByb3ZpZGUgU3BlY2lmaWNhdGlvbiBMZWFkIHdpdGggYW55IGNvbW1lbnRzIG9yIHN1Z2dlc3Rpb25zCi1jb25jZXJuaW5nIHRoZSBTcGVjaWZpY2F0aW9uICgiRmVlZGJhY2siKSwgeW91IGhlcmVieTogKGkpIGFncmVlIHRoYXQKLXN1Y2ggRmVlZGJhY2sgaXMgcHJvdmlkZWQgb24gYSBub24tcHJvcHJpZXRhcnkgYW5kIG5vbi1jb25maWRlbnRpYWwKLWJhc2lzLCBhbmQgKGlpKSBncmFudCBTcGVjaWZpY2F0aW9uIExlYWQgYSBwZXJwZXR1YWwsIG5vbi1leGNsdXNpdmUsCi13b3JsZHdpZGUsIGZ1bGx5IHBhaWQtdXAsIGlycmV2b2NhYmxlIGxpY2Vuc2UsIHdpdGggdGhlIHJpZ2h0IHRvCi1zdWJsaWNlbnNlIHRocm91Z2ggbXVsdGlwbGUgbGV2ZWxzIG9mIHN1YmxpY2Vuc2VlcywgdG8gaW5jb3Jwb3JhdGUsCi1kaXNjbG9zZSwgYW5kIHVzZSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIEZlZWRiYWNrIGZvciBhbnkgcHVycG9zZS4KLTwvcD4KLTxwPgotR0VORVJBTCBURVJNUwotPGJyLz4KLUFueSBhY3Rpb24gcmVsYXRlZCB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJlIGdvdmVybmVkIGJ5IENhbGlmb3JuaWEgbGF3Ci1hbmQgY29udHJvbGxpbmcgVS5TLiBmZWRlcmFsIGxhdy4gVGhlIFUuTi4gQ29udmVudGlvbiBmb3IgdGhlCi1JbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgYW5kIHRoZSBjaG9pY2Ugb2YgbGF3IHJ1bGVzIG9mIGFueQotanVyaXNkaWN0aW9uIHdpbGwgbm90IGFwcGx5LgotPC9wPgotPHA+Ci1UaGUgU3BlY2lmaWNhdGlvbiBpcyBzdWJqZWN0IHRvIFUuUy4gZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgbWF5IGJlCi1zdWJqZWN0IHRvIGV4cG9ydCBvciBpbXBvcnQgcmVndWxhdGlvbnMgaW4gb3RoZXIgY291bnRyaWVzLiBMaWNlbnNlZQotYWdyZWVzIHRvIGNvbXBseSBzdHJpY3RseSB3aXRoIGFsbCBzdWNoIGxhd3MgYW5kIHJlZ3VsYXRpb25zIGFuZAotYWNrbm93bGVkZ2VzIHRoYXQgaXQgaGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBvYnRhaW4gc3VjaCBsaWNlbnNlcyB0bwotZXhwb3J0LCByZS1leHBvcnQgb3IgaW1wb3J0IGFzIG1heSBiZSByZXF1aXJlZCBhZnRlciBkZWxpdmVyeSB0bwotTGljZW5zZWUuCi08L3A+Ci08cD4KLVRoaXMgQWdyZWVtZW50IGlzIHRoZSBwYXJ0aWVzJyBlbnRpcmUgYWdyZWVtZW50IHJlbGF0aW5nIHRvIGl0cyBzdWJqZWN0Ci1tYXR0ZXIuIEl0IHN1cGVyc2VkZXMgYWxsIHByaW9yIG9yIGNvbnRlbXBvcmFuZW91cyBvcmFsIG9yIHdyaXR0ZW4KLWNvbW11bmljYXRpb25zLCBwcm9wb3NhbHMsIGNvbmRpdGlvbnMsIHJlcHJlc2VudGF0aW9ucyBhbmQgd2FycmFudGllcwotYW5kIHByZXZhaWxzIG92ZXIgYW55IGNvbmZsaWN0aW5nIG9yIGFkZGl0aW9uYWwgdGVybXMgb2YgYW55IHF1b3RlLAotb3JkZXIsICBhY2tub3dsZWRnbWVudCwgb3Igb3RoZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBwYXJ0aWVzCi1yZWxhdGluZyB0byBpdHMgc3ViamVjdCBtYXR0ZXIgZHVyaW5nIHRoZSB0ZXJtIG9mIHRoaXMgQWdyZWVtZW50LiBObwotbW9kaWZpY2F0aW9uIHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYmUgYmluZGluZywgdW5sZXNzIGluIHdyaXRpbmcgYW5kCi1zaWduZWQgYnkgYW4gYXV0aG9yaXplZCByZXByZXNlbnRhdGl2ZSBvZiBlYWNoIHBhcnR5LgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQWRkcmVzcy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQWRkcmVzcy5qYXZhCmluZGV4IGFlNDQ5ZTMuLjJjOGE2ZTcgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0FkZHJlc3MuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9BZGRyZXNzLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03MCw2ICs3MCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKCk7CiAKICAgICAvKioKQEAgLTg0LDUgKzg1LDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbQlhZGRyZXNzCUFkZHJlc3Mgb2JqZWN0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhZGRyZXNzKTsKIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0F1dGhlbnRpY2F0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9BdXRoZW50aWNhdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDE0NzdmYTguLmNkMzRlN2UgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0F1dGhlbnRpY2F0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQXV0aGVudGljYXRpb25GYWlsZWRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0F1dGhlbnRpY2F0b3IuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0F1dGhlbnRpY2F0b3IuamF2YQppbmRleCBhOWY3ZTU3Li42ODg2NTIzIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9BdXRoZW50aWNhdG9yLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQXV0aGVudGljYXRvci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQm9keVBhcnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0JvZHlQYXJ0LmphdmEKaW5kZXggNWZmNTRhZC4uMWNiOTViZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvQm9keVBhcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Cb2R5UGFydC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRW5jb2RpbmdBd2FyZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRW5jb2RpbmdBd2FyZS5qYXZhCmluZGV4IDJhODE0YTIuLjE2N2RhNzEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0VuY29kaW5nQXdhcmUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9FbmNvZGluZ0F3YXJlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9FdmVudFF1ZXVlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9FdmVudFF1ZXVlLmphdmEKaW5kZXggZDY1YWNiOS4uOTM4YWExZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRXZlbnRRdWV1ZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0V2ZW50UXVldWUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTQgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTczLDYgKzczLDcgQEAKIAkgICAgc3VwZXIobmV3IE9iamVjdCgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwYXRjaChPYmplY3QgbGlzdGVuZXIpIHsKIAkgICAgLy8gS2lsbCB0aGUgZXZlbnQgZGlzcGF0Y2hpbmcgdGhyZWFkLgogCSAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAJICAgIFZlY3Rvcjw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmVjdG9yKSB7CiAJLy8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQsIGNyZWF0ZSB0aGUgcXVldWUgYW5kIHN0YXJ0IHRoZSBldmVudCB0YXNrCiAJaWYgKHEgPT0gbnVsbCkgewotCSAgICBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UXVldWVFbGVtZW50PigpOworCSAgICBxID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8PigpOwogCSAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgewogCQlleGVjdXRvci5leGVjdXRlKHRoaXMpOwogCSAgICB9IGVsc2UgewpAQCAtMTI0LDcgKzEyNSw3IEBACiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHZvaWQgdGVybWluYXRlUXVldWUoKSB7CiAJaWYgKHEgIT0gbnVsbCkgewotCSAgICBWZWN0b3I8RXZlbnRMaXN0ZW5lcj4gZHVtbXlMaXN0ZW5lcnMgPSBuZXcgVmVjdG9yPEV2ZW50TGlzdGVuZXI+KCk7CisJICAgIFZlY3RvcjxFdmVudExpc3RlbmVyPiBkdW1teUxpc3RlbmVycyA9IG5ldyBWZWN0b3I8PigpOwogCSAgICBkdW1teUxpc3RlbmVycy5zZXRTaXplKDEpOyAvLyBuZWVkIGF0bGVhc3Qgb25lIGxpc3RlbmVyCiAJICAgIHEuYWRkKG5ldyBRdWV1ZUVsZW1lbnQobmV3IFRlcm1pbmF0b3JFdmVudCgpLCBkdW1teUxpc3RlbmVycykpOwogCSAgICBxID0gbnVsbDsKQEAgLTEzOCw3ICsxMzksNyBAQAogICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgRXZlbnRRdWV1ZSBnZXRBcHBsaWNhdGlvbkV2ZW50UXVldWUoRXhlY3V0b3IgZXgpIHsKIAlDbGFzc0xvYWRlciBjbCA9IFNlc3Npb24uZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CiAJaWYgKGFwcHEgPT0gbnVsbCkKLQkgICAgYXBwcSA9IG5ldyBXZWFrSGFzaE1hcDxDbGFzc0xvYWRlcixFdmVudFF1ZXVlPigpOworCSAgICBhcHBxID0gbmV3IFdlYWtIYXNoTWFwPD4oKTsKIAlFdmVudFF1ZXVlIHEgPSBhcHBxLmdldChjbCk7CiAJaWYgKHEgPT0gbnVsbCkgewogCSAgICBxID0gbmV3IEV2ZW50UXVldWUoZXgpOwpAQCAtMTUwLDYgKzE1MSw3IEBACiAgICAgLyoqCiAgICAgICogUHVsbCBldmVudHMgb2ZmIHRoZSBxdWV1ZSBhbmQgZGlzcGF0Y2ggdGhlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAKIAlCbG9ja2luZ1F1ZXVlPFF1ZXVlRWxlbWVudD4gYnEgPSBxOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRmV0Y2hQcm9maWxlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9GZXRjaFByb2ZpbGUuamF2YQppbmRleCBmOGNjNmNmLi5jOTNmNzhjIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9GZXRjaFByb2ZpbGUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9GZXRjaFByb2ZpbGUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE1Niw2ICsxNTYsNyBAQAogCS8qKgogCSAqIEluY2x1ZGUgdGhlIG5hbWUgaW4gdGhlIHRvU3RyaW5nIHJldHVybiB2YWx1ZSBmb3IgZGVidWdnaW5nLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbIiArIG5hbWUgKyAiXSI7CiAJfQpAQCAtMTgwLDcgKzE4MSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKEl0ZW0gaXRlbSkgeyAKIAlpZiAoc3BlY2lhbHMgPT0gbnVsbCkKLQkgICAgc3BlY2lhbHMgPSBuZXcgVmVjdG9yPEl0ZW0+KCk7CisJICAgIHNwZWNpYWxzID0gbmV3IFZlY3Rvcjw+KCk7CiAJc3BlY2lhbHMuYWRkRWxlbWVudChpdGVtKTsKICAgICB9CiAKQEAgLTE5Miw3ICsxOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaGVhZGVyTmFtZSkgeyAKICAgIAlpZiAoaGVhZGVycyA9PSBudWxsKQotCSAgICBoZWFkZXJzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisJICAgIGhlYWRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAloZWFkZXJzLmFkZEVsZW1lbnQoaGVhZGVyTmFtZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9GbGFncy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRmxhZ3MuamF2YQppbmRleCA3ZGRkNThmLi5iY2MwOTIxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9GbGFncy5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0ZsYWdzLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMDAsNiArMTAwLDggQEAKIHB1YmxpYyBjbGFzcyBGbGFncyBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKIAogICAgIHByaXZhdGUgaW50IHN5c3RlbV9mbGFncyA9IDA7CisgICAgLy8gdXNlZCBhcyBhIGNhc2UtaW5kZXBlbmRlbnQgU2V0IHRoYXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBjYXNlLAorICAgIC8vIHRoZSBrZXkgaXMgdGhlIGxvd2VyY2FzZSBmbGFnIG5hbWUgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgb3JpZ2luYWwKICAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gdXNlcl9mbGFncyA9IG51bGw7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQU5TV0VSRURfQklUIAk9IDB4MDE7CkBAIC0xNTMsNyArMTU1LDcgQEAKIAogCS8qKgogCSAqIFRoaXMgbWVzc2FnZSBpcyBzZWVuLiBUaGlzIGZsYWcgaXMgaW1wbGljaXRseSBzZXQgYnkgdGhlIAotCSAqIGltcGxlbWVudGF0aW9uIHdoZW4gdGhlIHRoaXMgTWVzc2FnZSdzIGNvbnRlbnQgaXMgcmV0dXJuZWQgCisJICogaW1wbGVtZW50YXRpb24gd2hlbiB0aGlzIE1lc3NhZ2UncyBjb250ZW50IGlzIHJldHVybmVkIAogCSAqIHRvIHRoZSBjbGllbnQgaW4gc29tZSBmb3JtLiBUaGUgPGNvZGU+Z2V0SW5wdXRTdHJlYW08L2NvZGU+CiAJICogYW5kIDxjb2RlPmdldENvbnRlbnQ8L2NvZGU+IG1ldGhvZHMgb24gTWVzc2FnZSBjYXVzZSB0aGlzCiAJICogZmxhZyB0byBiZSBzZXQuIDxwPgpAQCAtMjEzLDcgKzIxNSw3IEBACiAgICAgICogQHBhcmFtIGZsYWcJdGhlIGZsYWcgZm9yIGluaXRpYWxpemF0aW9uCiAgICAgICovCiAgICAgcHVibGljIEZsYWdzKFN0cmluZyBmbGFnKSB7Ci0JdXNlcl9mbGFncyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KDEpOworCXVzZXJfZmxhZ3MgPSBuZXcgSGFzaHRhYmxlPD4oMSk7CiAJdXNlcl9mbGFncy5wdXQoZmxhZy50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCksIGZsYWcpOwogICAgIH0KIApAQCAtMjMzLDcgKzIzNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBmbGFnKSB7CiAJaWYgKHVzZXJfZmxhZ3MgPT0gbnVsbCkKLQkgICAgdXNlcl9mbGFncyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KDEpOworCSAgICB1c2VyX2ZsYWdzID0gbmV3IEhhc2h0YWJsZTw+KDEpOwogCXVzZXJfZmxhZ3MucHV0KGZsYWcudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLCBmbGFnKTsKICAgICB9CiAKQEAgLTI0OCw3ICsyNTAsNyBAQAogCiAJaWYgKGYudXNlcl9mbGFncyAhPSBudWxsKSB7IC8vIGFkZCB1c2VyLWRlZmluZWQgZmxhZ3MKIAkgICAgaWYgKHVzZXJfZmxhZ3MgPT0gbnVsbCkKLQkJdXNlcl9mbGFncyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KDEpOworCQl1c2VyX2ZsYWdzID0gbmV3IEhhc2h0YWJsZTw+KDEpOwogCiAJICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGYudXNlcl9mbGFncy5rZXlzKCk7CiAKQEAgLTI5OCw2ICszMDAsNDUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGZsYWdzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGluIHRoZSBnaXZlbiBGbGFncyBvYmplY3QuCisgICAgICogVXNlZnVsIGZvciBjbGVhcmluZyBmbGFncyBub3Qgc3VwcG9ydGVkIGJ5IGEgc2VydmVyLiAgSWYgdGhlCisgICAgICogZ2l2ZW4gRmxhZ3Mgb2JqZWN0IGluY2x1ZGVzIHRoZSBGbGFncy5GbGFnLlVTRVIgZmxhZywgYWxsIHVzZXIKKyAgICAgKiBmbGFncyBpbiB0aGlzIEZsYWdzIG9iamVjdCBhcmUgcmV0YWluZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0JZgl0aGUgZmxhZ3MgdG8ga2VlcAorICAgICAqIEByZXR1cm4JCXRydWUgaWYgdGhpcyBGbGFncyBvYmplY3QgY2hhbmdlZAorICAgICAqIEBzaW5jZQkJSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKEZsYWdzIGYpIHsKKwlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKwlpbnQgc2YgPSBzeXN0ZW1fZmxhZ3MgJiBmLnN5c3RlbV9mbGFnczsKKwlpZiAoc3lzdGVtX2ZsYWdzICE9IHNmKSB7CisJICAgIHN5c3RlbV9mbGFncyA9IHNmOworCSAgICBjaGFuZ2VkID0gdHJ1ZTsKKwl9CisKKwkvLyBpZiB3ZSBoYXZlIHVzZXIgZmxhZ3MsIGFuZCB0aGUgVVNFUiBmbGFnIGlzIG5vdCBzZXQgaW4gImYiLAorCS8vIGRldGVybWluZSB3aGljaCB1c2VyIGZsYWdzIHRvIGNsZWFyCisJaWYgKHVzZXJfZmxhZ3MgIT0gbnVsbCAmJiAoZi5zeXN0ZW1fZmxhZ3MgJiBVU0VSX0JJVCkgPT0gMCkgeworCSAgICBpZiAoZi51c2VyX2ZsYWdzICE9IG51bGwpIHsKKwkJRW51bWVyYXRpb248U3RyaW5nPiBlID0gdXNlcl9mbGFncy5rZXlzKCk7CisJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisJCSAgICBTdHJpbmcga2V5ID0gZS5uZXh0RWxlbWVudCgpOworCQkgICAgaWYgKCFmLnVzZXJfZmxhZ3MuY29udGFpbnNLZXkoa2V5KSkgeworCQkJdXNlcl9mbGFncy5yZW1vdmUoa2V5KTsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSB7CisJCS8vIGlmIGFueXRoaW5nIGluIHVzZXJfZmxhZ3MsIHRocm93IHRoZW0gYXdheQorCQljaGFuZ2VkID0gdXNlcl9mbGFncy5zaXplKCkgPiAwOworCQl1c2VyX2ZsYWdzID0gbnVsbDsKKwkgICAgfQorCX0KKwlyZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGZsYWcgaXMgcHJlc2VudCBpbiB0aGlzIEZsYWdzIG9iamVjdC4KICAgICAgKgogICAgICAqIEBwYXJhbQlmbGFnCXRoZSBmbGFnIHRvIHRlc3QKQEAgLTM1NCw2ICszOTUsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybgl0cnVlIGlmIHRoZXkncmUgZXF1YWwKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIEZsYWdzKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzY1LDE4ICs0MDcsMTIgQEAKIAkgICAgcmV0dXJuIGZhbHNlOwogCiAJLy8gQ2hlY2sgdXNlciBmbGFncwotCWlmIChmLnVzZXJfZmxhZ3MgPT0gbnVsbCAmJiB0aGlzLnVzZXJfZmxhZ3MgPT0gbnVsbCkKKwlpbnQgc2l6ZSA9IHRoaXMudXNlcl9mbGFncyA9PSBudWxsID8gMCA6IHRoaXMudXNlcl9mbGFncy5zaXplKCk7CisJaW50IGZzaXplID0gZi51c2VyX2ZsYWdzID09IG51bGwgPyAwIDogZi51c2VyX2ZsYWdzLnNpemUoKTsKKwlpZiAoc2l6ZSA9PSAwICYmIGZzaXplID09IDApCiAJICAgIHJldHVybiB0cnVlOwotCWlmIChmLnVzZXJfZmxhZ3MgIT0gbnVsbCAmJiB0aGlzLnVzZXJfZmxhZ3MgIT0gbnVsbCAmJgotCQlmLnVzZXJfZmxhZ3Muc2l6ZSgpID09IHRoaXMudXNlcl9mbGFncy5zaXplKCkpIHsKLQkgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gZi51c2VyX2ZsYWdzLmtleXMoKTsKLQotCSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlpZiAoIXRoaXMudXNlcl9mbGFncy5jb250YWluc0tleShlLm5leHRFbGVtZW50KCkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAgIHJldHVybiB0cnVlOwotCX0KKwlpZiAoZi51c2VyX2ZsYWdzICE9IG51bGwgJiYgdGhpcy51c2VyX2ZsYWdzICE9IG51bGwgJiYgZnNpemUgPT0gc2l6ZSkKKwkgICAgcmV0dXJuIHVzZXJfZmxhZ3Mua2V5U2V0KCkuZXF1YWxzKGYudXNlcl9mbGFncy5rZXlTZXQoKSk7CiAKIAlyZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzg2LDYgKzQyMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCXRoZSBoYXNoIGNvZGUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCWludCBoYXNoID0gc3lzdGVtX2ZsYWdzOwogCWlmICh1c2VyX2ZsYWdzICE9IG51bGwpIHsKQEAgLTQwMyw3ICs0NDAsNyBAQAogICAgICAqIEByZXR1cm4JYXJyYXkgb2YgRmxhZ3MuRmxhZyBvYmplY3RzIHJlcHJlc2VudGluZyBzeXN0ZW0gZmxhZ3MKICAgICAgKi8KICAgICBwdWJsaWMgRmxhZ1tdIGdldFN5c3RlbUZsYWdzKCkgewotCVZlY3RvcjxGbGFnPiB2ID0gbmV3IFZlY3RvcjxGbGFnPigpOworCVZlY3RvcjxGbGFnPiB2ID0gbmV3IFZlY3Rvcjw+KCk7CiAJaWYgKChzeXN0ZW1fZmxhZ3MgJiBBTlNXRVJFRF9CSVQpICE9IDApCiAJICAgIHYuYWRkRWxlbWVudChGbGFnLkFOU1dFUkVEKTsKIAlpZiAoKHN5c3RlbV9mbGFncyAmIERFTEVURURfQklUKSAhPSAwKQpAQCAtNDMxLDcgKzQ2OCw3IEBACiAgICAgICogQHJldHVybglhcnJheSBvZiBTdHJpbmdzLCBlYWNoIFN0cmluZyByZXByZXNlbnRzIGEgZmxhZy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXNlckZsYWdzKCkgewotCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKwlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3Rvcjw+KCk7CiAJaWYgKHVzZXJfZmxhZ3MgIT0gbnVsbCkgewogCSAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSB1c2VyX2ZsYWdzLmVsZW1lbnRzKCk7CiAKQEAgLTQ0NSw5ICs0ODIsMjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgb2YgdGhlIHN5c3RlbSBmbGFncy4KKyAgICAgKgorICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclN5c3RlbUZsYWdzKCkgeworCXN5c3RlbV9mbGFncyA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYWxsIG9mIHRoZSB1c2VyIGZsYWdzLgorICAgICAqCisgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyVXNlckZsYWdzKCkgeworCXVzZXJfZmxhZ3MgPSBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIEZsYWdzIG9iamVjdC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogCUZsYWdzIGYgPSBudWxsOwogCXRyeSB7CkBAIC00NjAsNiArNTE2LDQ3IEBACiAJcmV0dXJuIGY7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRmxhZ3Mgb2JqZWN0LgorICAgICAqIE5vdGUgdGhhdCB0aGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCWlmICgoc3lzdGVtX2ZsYWdzICYgQU5TV0VSRURfQklUKSAhPSAwKQorCSAgICBzYi5hcHBlbmQoIlxcQW5zd2VyZWQgIik7CisJaWYgKChzeXN0ZW1fZmxhZ3MgJiBERUxFVEVEX0JJVCkgIT0gMCkKKwkgICAgc2IuYXBwZW5kKCJcXERlbGV0ZWQgIik7CisJaWYgKChzeXN0ZW1fZmxhZ3MgJiBEUkFGVF9CSVQpICE9IDApCisJICAgIHNiLmFwcGVuZCgiXFxEcmFmdCAiKTsKKwlpZiAoKHN5c3RlbV9mbGFncyAmIEZMQUdHRURfQklUKSAhPSAwKQorCSAgICBzYi5hcHBlbmQoIlxcRmxhZ2dlZCAiKTsKKwlpZiAoKHN5c3RlbV9mbGFncyAmIFJFQ0VOVF9CSVQpICE9IDApCisJICAgIHNiLmFwcGVuZCgiXFxSZWNlbnQgIik7CisJaWYgKChzeXN0ZW1fZmxhZ3MgJiBTRUVOX0JJVCkgIT0gMCkKKwkgICAgc2IuYXBwZW5kKCJcXFNlZW4gIik7CisJaWYgKChzeXN0ZW1fZmxhZ3MgJiBVU0VSX0JJVCkgIT0gMCkKKwkgICAgc2IuYXBwZW5kKCJcXCogIik7CisKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwlpZiAodXNlcl9mbGFncyAhPSBudWxsKSB7CisJICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHVzZXJfZmxhZ3MuZWxlbWVudHMoKTsKKworCSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworCQlpZiAoZmlyc3QpCisJCSAgICBmaXJzdCA9IGZhbHNlOworCQllbHNlCisJCSAgICBzYi5hcHBlbmQoJyAnKTsKKwkJc2IuYXBwZW5kKGUubmV4dEVsZW1lbnQoKSk7CisJICAgIH0KKwl9CisKKwlpZiAoZmlyc3QgJiYgc2IubGVuZ3RoKCkgPiAwKQorCSAgICBzYi5zZXRMZW5ndGgoc2IubGVuZ3RoKCkgLSAxKTsJLy8gc21hc2ggdHJhaWxpbmcgc3BhY2UKKworCXJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKwogICAgIC8qKioqKgogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHRocm93cyBFeGNlcHRpb24gewogCS8vIGEgbmV3IGZsYWdzIG9iamVjdApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRm9sZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXIuamF2YQppbmRleCA2NGE0NzZhLi43NDM4M2MzIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogTm90ZSB0aGF0IGEgTWVzc2FnZSdzIG1lc3NhZ2UgbnVtYmVyIGNhbiBjaGFuZ2Ugd2l0aGluIGEKICAqIHNlc3Npb24gaWYgdGhlIGNvbnRhaW5pbmcgRm9sZGVyIGlzIGV4cHVuZ2VkIHVzaW5nIHRoZSBleHB1bmdlCiAgKiBtZXRob2QuICBDbGllbnRzIHRoYXQgdXNlIG1lc3NhZ2UgbnVtYmVycyBhcyByZWZlcmVuY2VzIHRvIG1lc3NhZ2VzCi0gKiBzaG91bGQgYmUgYXdhcmUgb2YgdGhpcyBhbmQgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCAKKyAqIHNob3VsZCBiZSBhd2FyZSBvZiB0aGlzIGFuZCBzaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIHRoaXMKICAqIHNpdHVhdGlvbiAocHJvYmFibHkgYnkgZmx1c2hpbmcgb3V0IGV4aXN0aW5nIG1lc3NhZ2UgbnVtYmVyIHJlZmVyZW5jZXMKICAqIGFuZCByZWxvYWRpbmcgdGhlbSkuIEJlY2F1c2Ugb2YgdGhpcyBjb21wbGV4aXR5LCBpdCBpcyBiZXR0ZXIgZm9yCiAgKiBjbGllbnRzIHRvIHVzZSBNZXNzYWdlIG9iamVjdHMgYXMgcmVmZXJlbmNlcyB0byBtZXNzYWdlcywgcmF0aGVyIHRoYW4KQEAgLTExNiw3ICsxMTYsNyBAQAogICogQGF1dGhvciBCaWxsIFNoYW5ub24KICAqLwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9sZGVyIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKIAogICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgc3RvcmUuCkBAIC0xOTMsNyArMTkzLDcgQEAKICAgICBwdWJsaWMgVVJMTmFtZSBnZXRVUkxOYW1lKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJVVJMTmFtZSBzdG9yZVVSTCA9IGdldFN0b3JlKCkuZ2V0VVJMTmFtZSgpOwogCVN0cmluZyBmdWxsbmFtZSA9IGdldEZ1bGxOYW1lKCk7Ci0JU3RyaW5nQnVmZmVyIGVuY29kZWROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVN0cmluZ0J1aWxkZXIgZW5jb2RlZE5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCiAJaWYgKGZ1bGxuYW1lICE9IG51bGwpIHsKIAkgICAgLyoKQEAgLTY0Nyw2ICs2NDcsMjkgQEAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZShib29sZWFuIGV4cHVuZ2UpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247CiAKICAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIEZvbGRlciBhbmQgZXhwdW5nZSBkZWxldGVkIG1lc3NhZ2VzLiA8cD4KKyAgICAgKgorICAgICAqIEEgQ0xPU0VEIENvbm5lY3Rpb25FdmVudCBpcyBkZWxpdmVyZWQgdG8gYW55IENvbm5lY3Rpb25MaXN0ZW5lcnMKKyAgICAgKiByZWdpc3RlcmVkIG9uIHRoaXMgRm9sZGVyLiBOb3RlIHRoYXQgdGhlIGZvbGRlciBpcyBjbG9zZWQgZXZlbgorICAgICAqIGlmIHRoaXMgbWV0aG9kIHRlcm1pbmF0ZXMgYWJub3JtYWxseSBieSB0aHJvd2luZyBhCisgICAgICogTWVzc2FnaW5nRXhjZXB0aW9uLiA8cD4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSB7QGxpbmsgamF2YS5sYW5nLkF1dG9DbG9zZWFibGUgQXV0b0Nsb3NlYWJsZX0KKyAgICAgKiBpbnRlcmZhY2UuIDxwPgorICAgICAqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5jbG9zZSh0cnVlKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGZvbGRlciBpcyBub3Qgb3BlbmVkCisgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCisgICAgICogQHNlZSAJCWphdmF4Lm1haWwuZXZlbnQuQ29ubmVjdGlvbkV2ZW50CisgICAgICogQHNpbmNlCQlKYXZhTWFpbCAxLjYKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworCWNsb3NlKHRydWUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgRm9sZGVyIGlzIGluIHRoZSAnb3Blbicgc3RhdGUuCiAgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIEZvbGRlciBpcyBpbiB0aGUgJ29wZW4nIHN0YXRlLgogICAgICAqLwpAQCAtMTI4OCw3ICsxMzExLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZVtdIHNlYXJjaChTZWFyY2hUZXJtIHRlcm0sIE1lc3NhZ2VbXSBtc2dzKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotCUxpc3Q8TWVzc2FnZT4gbWF0Y2hlZE1zZ3MgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2U+KCk7CisJTGlzdDxNZXNzYWdlPiBtYXRjaGVkTXNncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJLy8gUnVuIHRocnUgdGhlIGdpdmVuIG1lc3NhZ2VzCiAJZm9yIChNZXNzYWdlIG1zZyA6IG1zZ3MpIHsKQEAgLTEzMzcsNyArMTM2MCw3IEBACiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkCiAgICAgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsKSB7IAogICAgCWlmIChjb25uZWN0aW9uTGlzdGVuZXJzID09IG51bGwpIAotCSAgICBjb25uZWN0aW9uTGlzdGVuZXJzID0gbmV3IFZlY3RvcjxDb25uZWN0aW9uTGlzdGVuZXI+KCk7CisJICAgIGNvbm5lY3Rpb25MaXN0ZW5lcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAljb25uZWN0aW9uTGlzdGVuZXJzLmFkZEVsZW1lbnQobCk7CiAgICAgfQogCkBAIC0xNDAzLDcgKzE0MjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGb2xkZXJMaXN0ZW5lcihGb2xkZXJMaXN0ZW5lciBsKSB7IAogICAgCWlmIChmb2xkZXJMaXN0ZW5lcnMgPT0gbnVsbCkKLQkgICAgZm9sZGVyTGlzdGVuZXJzID0gbmV3IFZlY3RvcjxGb2xkZXJMaXN0ZW5lcj4oKTsKKwkgICAgZm9sZGVyTGlzdGVuZXJzID0gbmV3IFZlY3Rvcjw+KCk7CiAJZm9sZGVyTGlzdGVuZXJzLmFkZEVsZW1lbnQobCk7CiAgICAgfQogCkBAIC0xNDg0LDcgKzE1MDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRNZXNzYWdlQ291bnRMaXN0ZW5lcihNZXNzYWdlQ291bnRMaXN0ZW5lciBsKSB7IAogICAgCWlmIChtZXNzYWdlQ291bnRMaXN0ZW5lcnMgPT0gbnVsbCkKLQkgICAgbWVzc2FnZUNvdW50TGlzdGVuZXJzID0gbmV3IFZlY3RvcjxNZXNzYWdlQ291bnRMaXN0ZW5lcj4oKTsKKwkgICAgbWVzc2FnZUNvdW50TGlzdGVuZXJzID0gbmV3IFZlY3Rvcjw+KCk7CiAJbWVzc2FnZUNvdW50TGlzdGVuZXJzLmFkZEVsZW1lbnQobCk7CiAgICAgfQogCkBAIC0xNTc0LDcgKzE1OTcsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZAogCQkJYWRkTWVzc2FnZUNoYW5nZWRMaXN0ZW5lcihNZXNzYWdlQ2hhbmdlZExpc3RlbmVyIGwpIHsgCiAgICAJaWYgKG1lc3NhZ2VDaGFuZ2VkTGlzdGVuZXJzID09IG51bGwpCi0JICAgIG1lc3NhZ2VDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IFZlY3RvcjxNZXNzYWdlQ2hhbmdlZExpc3RlbmVyPigpOworCSAgICBtZXNzYWdlQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBWZWN0b3I8PigpOwogCW1lc3NhZ2VDaGFuZ2VkTGlzdGVuZXJzLmFkZEVsZW1lbnQobCk7CiAgICAgfQogCkBAIC0xNjMyLDYgKzE2NTUsNyBAQAogCXEuZW5xdWV1ZShldmVudCwgdik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAl0cnkgewogCSAgICBxLnRlcm1pbmF0ZVF1ZXVlKCk7CkBAIC0xNjQ2LDYgKzE2NzAsNyBAQAogICAgICAqIHRoZSBkZWZhdWx0IHRvU3RyaW5nKCkgYmVoYXZpb3IuCiAgICAgICovCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gZ2V0RnVsbE5hbWUoKTsKIAlpZiAocyAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRm9sZGVyQ2xvc2VkRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXJDbG9zZWRFeGNlcHRpb24uamF2YQppbmRleCAzYWJlMjhlLi5jYzJiNThhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXJDbG9zZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXJDbG9zZWRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0ZvbGRlck5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Gb2xkZXJOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGJjMDBlYjAuLjZkNDZhYmQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0ZvbGRlck5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvRm9sZGVyTm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0hlYWRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvSGVhZGVyLmphdmEKaW5kZXggMTIzNjIyOS4uYWQzYzYyNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvSGVhZGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvSGVhZGVyLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9JbGxlZ2FsV3JpdGVFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0lsbGVnYWxXcml0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGVhMGI3ZDMuLjc2MmUzOTIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0lsbGVnYWxXcml0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL0lsbGVnYWxXcml0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWFpbFNlc3Npb25EZWZpbml0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NYWlsU2Vzc2lvbkRlZmluaXRpb24uamF2YQppbmRleCA2ZjZjZmQ0Li4yY2RmOTc1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NYWlsU2Vzc2lvbkRlZmluaXRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NYWlsU2Vzc2lvbkRlZmluaXRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ0LDYgKzQ0LDcgQEAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXBlYXRhYmxlOwogCiAvKioKICAqIEFubm90YXRpb24gdXNlZCBieSBKYXZhIEVFIGFwcGxpY2F0aW9ucyB0byBkZWZpbmUgYSA8Y29kZT5NYWlsU2Vzc2lvbjwvY29kZT4KQEAgLTYxLDYgKzYyLDcgQEAKICAqLwogQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRX0pCiBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFJlcGVhdGFibGUoTWFpbFNlc3Npb25EZWZpbml0aW9ucy5jbGFzcykKIHB1YmxpYyBAaW50ZXJmYWNlIE1haWxTZXNzaW9uRGVmaW5pdGlvbiB7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01haWxTZXNzaW9uRGVmaW5pdGlvbnMuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01haWxTZXNzaW9uRGVmaW5pdGlvbnMuamF2YQppbmRleCA3N2VhM2U0Li5lNmNiNDZmIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NYWlsU2Vzc2lvbkRlZmluaXRpb25zLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWFpbFNlc3Npb25EZWZpbml0aW9ucy5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2UuamF2YQppbmRleCBkZWViNDA5Li4yNTRlNDNiIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMjc2LDYgKzI3Niw3IEBACiAJCSAgICAiQXR0ZW1wdCB0byByZXNvbHZlIHVua25vd24gUmVjaXBpZW50VHlwZTogIiArIHR5cGUpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJICAgIHJldHVybiB0eXBlOwogCX0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2VBd2FyZS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZUF3YXJlLmphdmEKaW5kZXggOTY0MmFkMi4uZjQ4YjY3MSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZUF3YXJlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZUF3YXJlLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdlQ29udGV4dC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZUNvbnRleHQuamF2YQppbmRleCBlZDM2OWYyLi5iNzI0N2VhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdlQ29udGV4dC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2VDb250ZXh0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdlUmVtb3ZlZEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWVzc2FnZVJlbW92ZWRFeGNlcHRpb24uamF2YQppbmRleCA5MGY0ZTgxLi5lZGFkOGRkIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdlUmVtb3ZlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2VSZW1vdmVkRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXNzYWdpbmdFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2luZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDIwNTVjMzEuLjMyMTJlNmIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2luZ0V4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL01lc3NhZ2luZ0V4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTEyLDYgKzExMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCW5leHQgRXhjZXB0aW9uLCBudWxsIGlmIG5vbmUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CiAJcmV0dXJuIG5leHQ7CiAgICAgfQpAQCAtMTQ0LDEyICsxNDUsMTMgQEAKICAgICAgKiBPdmVycmlkZSB0b1N0cmluZyBtZXRob2QgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbgogICAgICAqIG5lc3RlZCBleGNlcHRpb25zLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gc3VwZXIudG9TdHJpbmcoKTsKIAlFeGNlcHRpb24gbiA9IG5leHQ7CiAJaWYgKG4gPT0gbnVsbCkKIAkgICAgcmV0dXJuIHM7Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzID09IG51bGwgPyAiIiA6IHMpOworCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzID09IG51bGwgPyAiIiA6IHMpOwogCXdoaWxlIChuICE9IG51bGwpIHsKIAkgICAgc2IuYXBwZW5kKCI7XG4gIG5lc3RlZCBleGNlcHRpb24gaXM6XG5cdCIpOwogCSAgICBpZiAobiBpbnN0YW5jZW9mIE1lc3NhZ2luZ0V4Y2VwdGlvbikgewpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCBmMjNiOTM3Li5jMWYzNjBlIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL011bHRpcGFydC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTXVsdGlwYXJ0LmphdmEKaW5kZXggYmI3ZGM3NC4uMGM5OWE2ZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTXVsdGlwYXJ0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTXVsdGlwYXJ0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02OSw4ICs2OSw3IEBACiAgICAgLyoqCiAgICAgICogVmVjdG9yIG9mIEJvZHlQYXJ0IG9iamVjdHMuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIHBhcnRzID0gbmV3IFZlY3RvcigpOyAvLyBIb2xkcyBCb2R5UGFydHMKKyAgICBwcm90ZWN0ZWQgVmVjdG9yPEJvZHlQYXJ0PiBwYXJ0cyA9IG5ldyBWZWN0b3I8PigpOyAvLyBIb2xkcyBCb2R5UGFydHMKIAogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBjb250ZW50LXR5cGUgb2YgdGhpcyBtdWx0aXBhcnQKQEAgLTE1Niw3ICsxNTUsNyBAQAogCWlmIChwYXJ0cyA9PSBudWxsKQogCSAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiTm8gc3VjaCBCb2R5UGFydCIpOwogCi0JcmV0dXJuIChCb2R5UGFydClwYXJ0cy5lbGVtZW50QXQoaW5kZXgpOworCXJldHVybiBwYXJ0cy5lbGVtZW50QXQoaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk3LDcgKzE5Niw3IEBACiAJaWYgKHBhcnRzID09IG51bGwpCiAJICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJObyBzdWNoIEJvZHlQYXJ0Iik7CiAKLQlCb2R5UGFydCBwYXJ0ID0gKEJvZHlQYXJ0KXBhcnRzLmVsZW1lbnRBdChpbmRleCk7CisJQm9keVBhcnQgcGFydCA9IHBhcnRzLmVsZW1lbnRBdChpbmRleCk7CiAJcGFydHMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKIAlwYXJ0LnNldFBhcmVudChudWxsKTsKICAgICB9CkBAIC0yMTIsMTEgKzIxMSwxMCBAQAogICAgICAqCQkJb2YgZXhpc3RpbmcgdmFsdWVzCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEJvZHlQYXJ0KEJvZHlQYXJ0IHBhcnQpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAocGFydHMgPT0gbnVsbCkKLQkgICAgcGFydHMgPSBuZXcgVmVjdG9yPEJvZHlQYXJ0PigpOworCSAgICBwYXJ0cyA9IG5ldyBWZWN0b3I8PigpOwogCiAJcGFydHMuYWRkRWxlbWVudChwYXJ0KTsKIAlwYXJ0LnNldFBhcmVudCh0aGlzKTsKQEAgLTIzNiwxMSArMjM0LDEwIEBACiAgICAgICoJCQlvZiBleGlzdGluZyB2YWx1ZXMKICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQm9keVBhcnQoQm9keVBhcnQgcGFydCwgaW50IGluZGV4KSAKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAocGFydHMgPT0gbnVsbCkKLQkgICAgcGFydHMgPSBuZXcgVmVjdG9yPEJvZHlQYXJ0PigpOworCSAgICBwYXJ0cyA9IG5ldyBWZWN0b3I8PigpOwogCiAJcGFydHMuaW5zZXJ0RWxlbWVudEF0KHBhcnQsIGluZGV4KTsKIAlwYXJ0LnNldFBhcmVudCh0aGlzKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL011bHRpcGFydERhdGFTb3VyY2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL011bHRpcGFydERhdGFTb3VyY2UuamF2YQppbmRleCA4NjU0ZGRlLi4xZWIyY2YxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9NdWx0aXBhcnREYXRhU291cmNlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTXVsdGlwYXJ0RGF0YVNvdXJjZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL05vU3VjaFByb3ZpZGVyRXhjZXB0aW9uLmphdmEKaW5kZXggYjQ1M2M1OC4uNjc5NGQ5YyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUGFydC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUGFydC5qYXZhCmluZGV4IDMyMjdkN2YuLjEwNzI3ZjIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1BhcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9QYXJ0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00NDksOCArNDQ5LDcgQEAKICAgICAgKiBAcmV0dXJuICBlbnVtZXJhdGlvbiBvZiBIZWFkZXIgb2JqZWN0cwogICAgICAqIEBleGNlcHRpb24gICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEhlYWRlcnMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOworICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxIZWFkZXI+IGdldEFsbEhlYWRlcnMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIG1hdGNoaW5nIGhlYWRlcnMgZnJvbSB0aGlzIHBhcnQgYXMgYW4gRW51bWVyYXRpb24gb2YKQEAgLTQ2MCw4ICs0NTksNyBAQAogICAgICAqIEByZXR1cm4gIGVudW1lcmF0aW9uIG9mIEhlYWRlciBvYmplY3RzCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIGhlYWRlcl9uYW1lcykKKyAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRNYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gaGVhZGVyX25hbWVzKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247CiAKICAgICAvKioKQEAgLTQ3Miw3ICs0NzAsNiBAQAogICAgICAqIEByZXR1cm4gIGVudW1lcmF0aW9uIG9mIEhlYWRlciBvYmplY3RzCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIGhlYWRlcl9uYW1lcykgCisgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIGhlYWRlcl9uYW1lcykgCiAJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1Bhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1Bhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YQppbmRleCAxYTM1OGEzLi4wYjFkNjMxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9QYXNzd29yZEF1dGhlbnRpY2F0aW9uLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUGFzc3dvcmRBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUHJvdmlkZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1Byb3ZpZGVyLmphdmEKaW5kZXggNmQzOTYwZC4uNzg4YTU5OSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUHJvdmlkZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9Qcm92aWRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNjksNiArNjksNyBAQAogCSAgICB0aGlzLnR5cGUgPSB0eXBlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJICAgIHJldHVybiB0eXBlOwogCX0KQEAgLTE0NCw2ICsxNDUsNyBAQAogICAgIH0KIAogICAgIC8qKiBPdmVycmlkZXMgT2JqZWN0LnRvU3RyaW5nKCkgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZyBzID0gImphdmF4Lm1haWwuUHJvdmlkZXJbIiArIHR5cGUgKyAiLCIgKwogCQkgICAgcHJvdG9jb2wgKyAiLCIgKyBjbGFzc05hbWU7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9RdW90YS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUXVvdGEuamF2YQppbmRleCA2YzZiNDUxLi44MzUxNmFhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9RdW90YS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1F1b3RhLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9RdW90YUF3YXJlU3RvcmUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1F1b3RhQXdhcmVTdG9yZS5qYXZhCmluZGV4IDFmZjFiMjMuLmE1YzE5NmYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1F1b3RhQXdhcmVTdG9yZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1F1b3RhQXdhcmVTdG9yZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUmVhZE9ubHlGb2xkZXJFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1JlYWRPbmx5Rm9sZGVyRXhjZXB0aW9uLmphdmEKaW5kZXggM2NjYTllMC4uZmU3YjFhYiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvUmVhZE9ubHlGb2xkZXJFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9SZWFkT25seUZvbGRlckV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU2VuZEZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU2VuZEZhaWxlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGUxMjFhMWEuLjhlNWQ2NmEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1NlbmRGYWlsZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TZW5kRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TZXJ2aWNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TZXJ2aWNlLmphdmEKaW5kZXggMGZmMzM2NC4uYjI4MTVlNyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU2VydmljZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1NlcnZpY2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTU5LDcgKzU5LDcgQEAKICAqIEBhdXRob3IgS2Fud2FyIE9iZXJvaQogICovCiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2aWNlIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CiAKICAgICAvKioKICAgICAgKiBUaGUgc2Vzc2lvbiBmcm9tIHdoaWNoIHRoaXMgc2VydmljZSB3YXMgY3JlYXRlZC4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgKiBkZWFkbG9ja3Mgd2hlbiBub3RpZnlpbmcgbGlzdGVuZXJzLikKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxDb25uZWN0aW9uTGlzdGVuZXI+IGNvbm5lY3Rpb25MaXN0ZW5lcnMKLQkgICAgPSBuZXcgVmVjdG9yPENvbm5lY3Rpb25MaXN0ZW5lcj4oKTsKKwkgICAgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBxdWV1ZSBvZiBldmVudHMgdG8gYmUgZGVsaXZlcmVkLgpAQCAtNjIzLDYgKzYyMyw3IEBACiAgICAgICogUmV0dXJuIDxjb2RlPmdldFVSTE5hbWUudG9TdHJpbmcoKTwvY29kZT4gaWYgdGhpcyBzZXJ2aWNlIGhhcyBhIFVSTE5hbWUsCiAgICAgICogb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IDxjb2RlPnRvU3RyaW5nPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVVSTE5hbWUgdXJsID0gZ2V0VVJMTmFtZSgpOwogCWlmICh1cmwgIT0gbnVsbCkKQEAgLTYzNyw4ICs2MzgsOCBAQAogICAgICAqIEBwYXJhbQlldmVudAl0aGUgZXZlbnQKICAgICAgKiBAcGFyYW0JdmVjdG9yCXRoZSB2ZWN0b3Igb2YgbGlzdGVuZXJzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBxdWV1ZUV2ZW50KE1haWxFdmVudCBldmVudCwgVmVjdG9yIHZlY3RvcikgeworICAgIHByb3RlY3RlZCB2b2lkIHF1ZXVlRXZlbnQoTWFpbEV2ZW50IGV2ZW50LAorCSAgICBWZWN0b3I8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZlY3RvcikgewogCS8qCiAgICAgICAgICAqIENvcHkgdGhlIHZlY3RvciBpbiBvcmRlciB0byBmcmVlemUgdGhlIHN0YXRlIG9mIHRoZSBzZXQKICAgICAgICAgICogb2YgRXZlbnRMaXN0ZW5lcnMgdGhlIGV2ZW50IHNob3VsZCBiZSBkZWxpdmVyZWQgdG8gcHJpb3IKQEAgLTY1NSw2ICs2NTYsNyBAQAogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkIHNvIHRoZSBxdWV1ZSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAl0cnkgewogCSAgICBxLnRlcm1pbmF0ZVF1ZXVlKCk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TZXNzaW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TZXNzaW9uLmphdmEKaW5kZXggMjRjZGMxOS4uMTZlNzU3ZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU2Vzc2lvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1Nlc3Npb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ0LDE5ICs0NCwyMCBAQAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLm5ldC4qOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2VydmljZUxvYWRlcjsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIAotCiBpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTGluZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLk1haWxMb2dnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIFRoZSBTZXNzaW9uIGNsYXNzIHJlcHJlc2VudHMgYSBtYWlsIHNlc3Npb24gYW5kIGlzIG5vdCBzdWJjbGFzc2VkLgpAQCAtNzcsMTggKzc4LDI0IEBACiAgKiBFYWNoIDxjb2RlPmphdmFtYWlsLjwvY29kZT48aT5YPC9pPiByZXNvdXJjZSBmaWxlIGlzIHNlYXJjaGVkIGZvciB1c2luZwogICogdGhyZWUgbWV0aG9kcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgogICogPG9sPgotICogIDxsaT4gPGNvZGU+amF2YS5ob21lL2xpYi9qYXZhbWFpbC48L2NvZGU+PGk+WDwvaT4gPC9saT4KKyAqICA8bGk+IDxjb2RlPjxpPmphdmEuaG9tZTwvaT4vPGk+Y29uZjwvaT4vamF2YW1haWwuPC9jb2RlPjxpPlg8L2k+IDwvbGk+CiAgKiAgPGxpPiA8Y29kZT5NRVRBLUlORi9qYXZhbWFpbC48L2NvZGU+PGk+WDwvaT4gPC9saT4KICAqICA8bGk+IDxjb2RlPk1FVEEtSU5GL2phdmFtYWlsLmRlZmF1bHQuPC9jb2RlPjxpPlg8L2k+IDwvbGk+CiAgKiA8L29sPgogICogPHA+CisgKiAoV2hlcmUgPGk+amF2YS5ob21lPC9pPiBpcyB0aGUgdmFsdWUgb2YgdGhlICJqYXZhLmhvbWUiIFN5c3RlbSBwcm9wZXJ0eQorICogYW5kIDxpPmNvbmY8L2k+IGlzIHRoZSBkaXJlY3RvcnkgbmFtZWQgImNvbmYiIGlmIGl0IGV4aXN0cywKKyAqIG90aGVyd2lzZSB0aGUgZGlyZWN0b3J5IG5hbWVkICJsaWIiOyB0aGUgImNvbmYiIGRpcmVjdG9yeSB3YXMKKyAqIGludHJvZHVjZWQgaW4gSkRLIDEuOS4pCisgKiA8cD4KICAqIFRoZSBmaXJzdCBtZXRob2QgYWxsb3dzIHRoZSB1c2VyIHRvIGluY2x1ZGUgdGhlaXIgb3duIHZlcnNpb24gb2YgdGhlCi0gKiByZXNvdXJjZSBmaWxlIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3J5IHdoZXJlIHRoZQorICogcmVzb3VyY2UgZmlsZSBieSBwbGFjaW5nIGl0IGluIHRoZSA8aT5jb25mPC9pPiBkaXJlY3Rvcnkgd2hlcmUgdGhlCiAgKiA8Y29kZT5qYXZhLmhvbWU8L2NvZGU+IHByb3BlcnR5IHBvaW50cy4gIFRoZSBzZWNvbmQgbWV0aG9kIGFsbG93cyBhbgogICogYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoZSBKYXZhTWFpbCBBUElzIHRvIGluY2x1ZGUgdGhlaXIgb3duIHJlc291cmNlCiAgKiBmaWxlcyBpbiB0aGVpciBhcHBsaWNhdGlvbidzIG9yIGphciBmaWxlJ3MgPGNvZGU+TUVUQS1JTkY8L2NvZGU+CiAgKiBkaXJlY3RvcnkuICBUaGUgPGNvZGU+amF2YW1haWwuZGVmYXVsdC48L2NvZGU+PGk+WDwvaT4gZGVmYXVsdCBmaWxlcwotICogYXJlIHBhcnQgb2YgdGhlIEphdmFNYWlsIDxjb2RlPm1haWwuamFyPC9jb2RlPiBmaWxlLiA8cD4KKyAqIGFyZSBwYXJ0IG9mIHRoZSBKYXZhTWFpbCA8Y29kZT5tYWlsLmphcjwvY29kZT4gZmlsZSBhbmQgc2hvdWxkIG5vdCBiZQorICogc3VwcGxpZWQgYnkgdXNlcnMuIDxwPgogICoKICAqIEZpbGUgbG9jYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IG1ldGhvZAogICogPGNvZGU+Z2V0UmVzb3VyY2U8L2NvZGU+IGlzIGltcGxlbWVudGVkLiAgVXN1YWxseSwgdGhlCkBAIC0xNTIsNiArMTU5LDI5IEBACiAgKiBwcm90b2NvbD1zbXRwOyB0eXBlPXRyYW5zcG9ydDsgY2xhc3M9Y29tLnN1bi5tYWlsLnNtdHAuU01UUFRyYW5zcG9ydDsgdmVuZG9yPU9yYWNsZTsKICAqIDwvcHJlPjxwPgogICoKKyAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFsc28gc3VwcG9ydHMgY29uZmlndXJpbmcgcHJvdmlkZXJzIHVzaW5nCisgKiB0aGUgSmF2YSBTRSB7QGxpbmsgamF2YS51dGlsLlNlcnZpY2VMb2FkZXIgU2VydmljZUxvYWRlcn0gbWVjaGFuaXNtLgorICogV2hlbiBjcmVhdGluZyB5b3VyIG93biBwcm92aWRlciwgY3JlYXRlIGEge0BsaW5rIFByb3ZpZGVyfSBzdWJjbGFzcywKKyAqIGZvciBleGFtcGxlOgorICogPHByZT4KKyAqIHBhY2thZ2UgY29tLmV4YW1wbGU7CisgKgorICogaW1wb3J0IGphdmF4Lm1haWwuUHJvdmlkZXI7CisgKgorICogcHVibGljIGNsYXNzIE15UHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlciB7CisgKiAgICAgcHVibGljIE15UHJvdmlkZXIoKSB7CisgKiAgICAgICAgIHN1cGVyKFByb3ZpZGVyLlR5cGUuU1RPUkUsICJteXByb3QiLCBNeVN0b3JlLmNsYXNzLmdldE5hbWUoKSwKKyAqICAgICAgICAgICAgICJFeGFtcGxlIiwgbnVsbCk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiBUaGVuIGluY2x1ZGUgYSBmaWxlIG5hbWVkIDxjb2RlPk1FVEEtSU5GL3NlcnZpY2VzL2phdmF4Lm1haWwuUHJvdmlkZXI8L2NvZGU+CisgKiBpbiB5b3VyIGphciBmaWxlIHRoYXQgbGlzdHMgdGhlIG5hbWUgb2YgeW91ciBQcm92aWRlciBjbGFzczoKKyAqIDxwcmU+CisgKiBjb20uZXhhbXBsZS5NeVByb3ZpZGVyCisgKiA8L3ByZT4KKyAqIDxwPgorICoKICAqIDxiPjxjb2RlPmphdmFtYWlsLmFkZHJlc3MubWFwPC9jb2RlPjwvYj4gYW5kCiAgKiA8Yj48Y29kZT5qYXZhbWFpbC5kZWZhdWx0LmFkZHJlc3MubWFwPC9jb2RlPjwvYj48cD4KICAqCkBAIC0xODYsMjMgKzIxNiw0NyBAQAogICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wczsKICAgICBwcml2YXRlIGZpbmFsIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvcjsKICAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxVUkxOYW1lLCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uPiBhdXRoVGFibGUKLQkgICAgPSBuZXcgSGFzaHRhYmxlPFVSTE5hbWUsIFBhc3N3b3JkQXV0aGVudGljYXRpb24+KCk7CisJICAgID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQ7CQkJLy8gZGVidWcgb3V0cHV0IHN0cmVhbQogICAgIHByaXZhdGUgTWFpbExvZ2dlciBsb2dnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8UHJvdmlkZXI+IHByb3ZpZGVycyA9IG5ldyBWZWN0b3I8UHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBQcm92aWRlcj4gcHJvdmlkZXJzQnlQcm90b2NvbAotCSAgICA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBQcm92aWRlcj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFByb3ZpZGVyPiBwcm92aWRlcnNCeUNsYXNzTmFtZQotCSAgICA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBQcm92aWRlcj4oKTsKKyAgICBwcml2YXRlIExpc3Q8UHJvdmlkZXI+IHByb3ZpZGVyczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb3ZpZGVyPiBwcm92aWRlcnNCeVByb3RvY29sID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvdmlkZXI+IHByb3ZpZGVyc0J5Q2xhc3NOYW1lID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBhZGRyZXNzTWFwID0gbmV3IFByb3BlcnRpZXMoKTsKIAkJCQkJCS8vIG1hcHMgdHlwZSB0byBwcm90b2NvbAorICAgIHByaXZhdGUgYm9vbGVhbiBsb2FkZWRQcm92aWRlcnM7CS8vIGphdmFtYWlsLltkZWZhdWx0Ll1wcm92aWRlcnMgbG9hZGVkPwogICAgIC8vIHRoZSBxdWV1ZSBvZiBldmVudHMgdG8gYmUgZGVsaXZlcmVkLCBpZiBtYWlsLmV2ZW50LnNjb3BlPT09c2Vzc2lvbgogICAgIHByaXZhdGUgZmluYWwgRXZlbnRRdWV1ZSBxOwogCiAgICAgLy8gVGhlIGRlZmF1bHQgc2Vzc2lvbi4KICAgICBwcml2YXRlIHN0YXRpYyBTZXNzaW9uIGRlZmF1bHRTZXNzaW9uID0gbnVsbDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25mRGlyOworCisgICAgc3RhdGljIHsKKwlTdHJpbmcgZGlyID0gbnVsbDsKKwl0cnkgeworCSAgICBkaXIgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKwkJbmV3IFByaXZpbGVnZWRBY3Rpb248U3RyaW5nPigpIHsKKwkJICAgIEBPdmVycmlkZQorCQkgICAgcHVibGljIFN0cmluZyBydW4oKSB7CisJCQlTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7CisJCQlTdHJpbmcgbmV3ZGlyID0gaG9tZSArIEZpbGUuc2VwYXJhdG9yICsgImNvbmYiOworCQkJRmlsZSBjb25mID0gbmV3IEZpbGUobmV3ZGlyKTsKKwkJCWlmIChjb25mLmV4aXN0cygpKQorCQkJICAgIHJldHVybiBuZXdkaXIgKyBGaWxlLnNlcGFyYXRvcjsKKwkJCWVsc2UKKwkJCSAgICByZXR1cm4gaG9tZSArIEZpbGUuc2VwYXJhdG9yICsKKwkJCQkgICAgImxpYiIgKyBGaWxlLnNlcGFyYXRvcjsKKwkJICAgIH0KKwkJfSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIC8vIGlnbm9yZSBhbnkgZXhjZXB0aW9ucworCX0KKwljb25mRGlyID0gZGlyOworICAgIH0KKwogICAgIC8vIENvbnN0cnVjdG9yIGlzIG5vdCBwdWJsaWMKICAgICBwcml2YXRlIFNlc3Npb24oUHJvcGVydGllcyBwcm9wcywgQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yKSB7CiAJdGhpcy5wcm9wcyA9IHByb3BzOwpAQCAtMjIxLDcgKzI3NSw2IEBACiAJZWxzZQogCSAgICBjbCA9IHRoaXMuZ2V0Q2xhc3MoKTsKIAkvLyBsb2FkIHRoZSByZXNvdXJjZXMKLQlsb2FkUHJvdmlkZXJzKGNsKTsKIAlsb2FkQWRkcmVzc01hcChjbCk7CiAJcSA9IG5ldyBFdmVudFF1ZXVlKChFeGVjdXRvcilwcm9wcy5nZXQoIm1haWwuZXZlbnQuZXhlY3V0b3IiKSk7CiAgICAgfQpAQCAtNDMzLDggKzQ4NiwyMSBAQAogICAgICAqIEByZXR1cm4gQXJyYXkgb2YgY29uZmlndXJlZCBwcm92aWRlcnMKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFByb3ZpZGVyW10gZ2V0UHJvdmlkZXJzKCkgewotCVByb3ZpZGVyW10gX3Byb3ZpZGVycyA9IG5ldyBQcm92aWRlcltwcm92aWRlcnMuc2l6ZSgpXTsKLQlwcm92aWRlcnMuY29weUludG8oX3Byb3ZpZGVycyk7CisJTGlzdDxQcm92aWRlcj4gcGxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3ZpZGVyPigpOworCWJvb2xlYW4gbmVlZEZhbGxiYWNrID0gdHJ1ZTsKKwkvLyBmaXJzdCwgYWRkIGFsbCB0aGUgc2VydmljZXMKKwlTZXJ2aWNlTG9hZGVyPFByb3ZpZGVyPiBsb2FkZXIgPSBTZXJ2aWNlTG9hZGVyLmxvYWQoUHJvdmlkZXIuY2xhc3MpOworCWZvciAoUHJvdmlkZXIgcCA6IGxvYWRlcikgeworCSAgICBwbGlzdC5hZGQocCk7CisJICAgIG5lZWRGYWxsYmFjayA9IGZhbHNlOworCX0KKwkvLyB0aGVuLCBhZGQgYWxsIHRoZSBwcm92aWRlcnMgZnJvbSBjb25maWcgZmlsZXMKKwlpZiAoIWxvYWRlZFByb3ZpZGVycykKKwkgICAgbG9hZFByb3ZpZGVycyhuZWVkRmFsbGJhY2spOworCWlmIChwcm92aWRlcnMgIT0gbnVsbCkKKwkgICAgcGxpc3QuYWRkQWxsKHByb3ZpZGVycyk7CisJUHJvdmlkZXJbXSBfcHJvdmlkZXJzID0gbmV3IFByb3ZpZGVyW3BsaXN0LnNpemUoKV07CisJcGxpc3QudG9BcnJheShfcHJvdmlkZXJzKTsKIAlyZXR1cm4gX3Byb3ZpZGVyczsKICAgICB9CiAKQEAgLTQ2OSwxNSArNTM1LDExIEBACiAJCQkJICAgIi5jbGFzcyBwcm9wZXJ0eSBleGlzdHMgYW5kIHBvaW50cyB0byAiICsgCiAJCQkJICAgX2NsYXNzTmFtZSk7CiAJICAgIH0KLQkgICAgX3Byb3ZpZGVyID0gcHJvdmlkZXJzQnlDbGFzc05hbWUuZ2V0KF9jbGFzc05hbWUpOworCSAgICBfcHJvdmlkZXIgPSBnZXRQcm92aWRlckJ5Q2xhc3NOYW1lKF9jbGFzc05hbWUpOwogCX0gCiAKLQlpZiAoX3Byb3ZpZGVyICE9IG51bGwpIHsKLQkgICAgcmV0dXJuIF9wcm92aWRlcjsKLQl9IGVsc2UgewotCSAgICAvLyByZXR1cm5pbmcgY3VycmVudGx5IGRlZmF1bHQgcHJvdG9jb2wgaW4gcHJvdmlkZXJzQnlQcm90b2NvbAotCSAgICBfcHJvdmlkZXIgPSBwcm92aWRlcnNCeVByb3RvY29sLmdldChwcm90b2NvbCk7Ci0JfQorCWlmIChfcHJvdmlkZXIgPT0gbnVsbCkKKwkgICAgX3Byb3ZpZGVyID0gZ2V0UHJvdmlkZXJCeVByb3RvY29sKHByb3RvY29sKTsKIAogCWlmIChfcHJvdmlkZXIgPT0gbnVsbCkgewogCSAgICB0aHJvdyBuZXcgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24oIk5vIHByb3ZpZGVyIGZvciAiICsgcHJvdG9jb2wpOwpAQCAtNTA0LDYgKzU2Niw3IEBACiAJICAgIHRocm93IG5ldyBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IG51bGwgcHJvdmlkZXIiKTsKIAl9CiAJcHJvdmlkZXJzQnlQcm90b2NvbC5wdXQocHJvdmlkZXIuZ2V0UHJvdG9jb2woKSwgcHJvdmlkZXIpOworCXByb3ZpZGVyc0J5Q2xhc3NOYW1lLnB1dChwcm92aWRlci5nZXRDbGFzc05hbWUoKSwgcHJvdmlkZXIpOwogCXByb3BzLnB1dCgibWFpbC4iICsgcHJvdmlkZXIuZ2V0UHJvdG9jb2woKSArICIuY2xhc3MiLCAKIAkJICBwcm92aWRlci5nZXRDbGFzc05hbWUoKSk7CiAgICAgfQpAQCAtOTExLDMyICs5NzQsOTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBwcm90b2NvbCBwcm92aWRlcnMgY29uZmlnIGZpbGVzLgorICAgICAqIEdldCB0aGUgUHJvdmlkZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbQljbGFzc05hbWUJdGhlIGNsYXNzIG5hbWUKKyAgICAgKiBAcmV0dXJuCQl0aGUgUHJvdmlkZXIKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVycyhDbGFzczw/PiBjbCkgeworICAgIHByaXZhdGUgUHJvdmlkZXIgZ2V0UHJvdmlkZXJCeUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJLy8gZmlyc3QsIHRyeSBvdXIgbG9jYWwgbGlzdCBvZiBwcm92aWRlcnMKKwlQcm92aWRlciBwID0gcHJvdmlkZXJzQnlDbGFzc05hbWUuZ2V0KGNsYXNzTmFtZSk7CisJaWYgKHAgIT0gbnVsbCkKKwkgICAgcmV0dXJuIHA7CisKKwkvLyBub3csIHRyeSBzZXJ2aWNlcworCVNlcnZpY2VMb2FkZXI8UHJvdmlkZXI+IGxvYWRlciA9IFNlcnZpY2VMb2FkZXIubG9hZChQcm92aWRlci5jbGFzcyk7CisJZm9yIChQcm92aWRlciBwcCA6IGxvYWRlcikgeworCSAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhwcC5nZXRDbGFzc05hbWUoKSkpCisJCXJldHVybiBwcDsKKwl9CisKKwkvLyBmaW5hbGx5LCBpZiB3ZSBoYXZlbid0IGxvYWRlZCBvdXIgY29uZmlnLCBsb2FkIGl0IGFuZCB0cnkgYWdhaW4KKwlpZiAoIWxvYWRlZFByb3ZpZGVycykgeworCSAgICBsb2FkUHJvdmlkZXJzKHRydWUpOworCSAgICBwID0gcHJvdmlkZXJzQnlDbGFzc05hbWUuZ2V0KGNsYXNzTmFtZSk7CisJfQorCXJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgUHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0JcHJvdG9jb2wJdGhlIHByb3RvY29sCisgICAgICogQHJldHVybgkJdGhlIFByb3ZpZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBQcm92aWRlciBnZXRQcm92aWRlckJ5UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisJLy8gZmlyc3QsIHRyeSBvdXIgbG9jYWwgbGlzdCBvZiBwcm92aWRlcnMKKwlQcm92aWRlciBwID0gcHJvdmlkZXJzQnlQcm90b2NvbC5nZXQocHJvdG9jb2wpOworCWlmIChwICE9IG51bGwpCisJICAgIHJldHVybiBwOworCisJLy8gbm93LCB0cnkgc2VydmljZXMKKwlTZXJ2aWNlTG9hZGVyPFByb3ZpZGVyPiBsb2FkZXIgPSBTZXJ2aWNlTG9hZGVyLmxvYWQoUHJvdmlkZXIuY2xhc3MpOworCWZvciAoUHJvdmlkZXIgcHAgOiBsb2FkZXIpIHsKKwkgICAgaWYgKHByb3RvY29sLmVxdWFscyhwcC5nZXRQcm90b2NvbCgpKSkKKwkJcmV0dXJuIHBwOworCX0KKworCS8vIGZpbmFsbHksIGlmIHdlIGhhdmVuJ3QgbG9hZGVkIG91ciBjb25maWcsIGxvYWQgaXQgYW5kIHRyeSBhZ2FpbgorCWlmICghbG9hZGVkUHJvdmlkZXJzKSB7CisJICAgIGxvYWRQcm92aWRlcnModHJ1ZSk7CisJICAgIHAgPSBwcm92aWRlcnNCeVByb3RvY29sLmdldChwcm90b2NvbCk7CisJfQorCXJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIHByb3RvY29sIHByb3ZpZGVycyBjb25maWcgZmlsZXMuCisgICAgICogSWYgZmFsbGJhY2sgaXMgdHJ1ZSwgcHJvdmlkZSBidWlsdCBpbiBkZWZhdWx0cyBpZiBub3RoaW5nIGlzIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVycyhib29sZWFuIGZhbGxiYWNrKSB7CiAJU3RyZWFtTG9hZGVyIGxvYWRlciA9IG5ldyBTdHJlYW1Mb2FkZXIoKSB7CisJICAgIEBPdmVycmlkZQogCSAgICBwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb2FkUHJvdmlkZXJzRnJvbVN0cmVhbShpcyk7CiAJICAgIH0KIAl9OwogCi0JLy8gbG9hZCBzeXN0ZW0td2lkZSBqYXZhbWFpbC5wcm92aWRlcnMgZnJvbSB0aGUgPGphdmEuaG9tZT4vbGliIGRpcgorCS8vIGxvYWQgc3lzdGVtLXdpZGUgamF2YW1haWwucHJvdmlkZXJzIGZyb20gdGhlCisJLy8gPGphdmEuaG9tZT4ve2NvbmYsbGlifSBkaXJlY3RvcnkKIAl0cnkgewotCSAgICBTdHJpbmcgcmVzID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArIAotCQkJCUZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyAKLQkJCQlGaWxlLnNlcGFyYXRvciArICJqYXZhbWFpbC5wcm92aWRlcnMiOwotCSAgICBsb2FkRmlsZShyZXMsIGxvYWRlcik7Ci0JfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2V4KSB7Ci0JICAgIGxvZ2dlci5sb2coTGV2ZWwuQ09ORklHLCAiY2FuJ3QgZ2V0IGphdmEuaG9tZSIsIHNleCk7Ci0JfQorCSAgICBpZiAoY29uZkRpciAhPSBudWxsKQorCQlsb2FkRmlsZShjb25mRGlyICsgImphdmFtYWlsLnByb3ZpZGVycyIsIGxvYWRlcik7CisJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHt9CisKKwkvLyBnZXQgdGhlIENsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXV0aGVudGljYXRvcgorCUNsYXNzPD8+IGNsOworCWlmIChhdXRoZW50aWNhdG9yICE9IG51bGwpCisJICAgIGNsID0gYXV0aGVudGljYXRvci5nZXRDbGFzcygpOworCWVsc2UKKwkgICAgY2wgPSB0aGlzLmdldENsYXNzKCk7CiAKIAkvLyBsb2FkIHRoZSBNRVRBLUlORi9qYXZhbWFpbC5wcm92aWRlcnMgZmlsZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbgogCWxvYWRBbGxSZXNvdXJjZXMoIk1FVEEtSU5GL2phdmFtYWlsLnByb3ZpZGVycyIsIGNsLCBsb2FkZXIpOwogCiAJLy8gbG9hZCBkZWZhdWx0IE1FVEEtSU5GL2phdmFtYWlsLmRlZmF1bHQucHJvdmlkZXJzIGZyb20gbWFpbC5qYXIgZmlsZQotCWxvYWRSZXNvdXJjZSgiL01FVEEtSU5GL2phdmFtYWlsLmRlZmF1bHQucHJvdmlkZXJzIiwgY2wsIGxvYWRlcik7CisJbG9hZFJlc291cmNlKCIvTUVUQS1JTkYvamF2YW1haWwuZGVmYXVsdC5wcm92aWRlcnMiLCBjbCwgbG9hZGVyLCBmYWxzZSk7CiAKLQlpZiAocHJvdmlkZXJzLnNpemUoKSA9PSAwKSB7CisJLyoKKwkgKiBJZiB3ZSBoYXZlbid0IGxvYWRlZCBhbnkgcHJvdmlkZXJzIGFuZCB0aGUgZmFsbGJhY2sgY29uZmlndXJhdGlvbgorCSAqIGlzIG5lZWRlZCwgZmFrZSBpdC4KKwkgKi8KKwlpZiAoKHByb3ZpZGVycyA9PSBudWxsIHx8IHByb3ZpZGVycy5zaXplKCkgPT0gMCkgJiYgZmFsbGJhY2spIHsKIAkgICAgbG9nZ2VyLmNvbmZpZygiZmFpbGVkIHRvIGxvYWQgYW55IHByb3ZpZGVycywgdXNpbmcgZGVmYXVsdHMiKTsKIAkgICAgLy8gZmFpbGVkIHRvIGxvYWQgYW55IHByb3ZpZGVycywgaW5pdGlhbGl6ZSB3aXRoIG91ciBkZWZhdWx0cwogCSAgICBhZGRQcm92aWRlcihuZXcgUHJvdmlkZXIoUHJvdmlkZXIuVHlwZS5TVE9SRSwKQEAgLTk2MSwxMiArMTA4OCwxMyBAQAogCiAJaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKIAkgICAgLy8gZHVtcCB0aGUgb3V0cHV0IG9mIHRoZSB0YWJsZXMgZm9yIGRlYnVnZ2luZwotCSAgICBsb2dnZXIuY29uZmlnKCJUYWJsZXMgb2YgbG9hZGVkIHByb3ZpZGVycyIpOworCSAgICBsb2dnZXIuY29uZmlnKCJUYWJsZXMgb2YgbG9hZGVkIHByb3ZpZGVycyBmcm9tIGphdmFtYWlsLnByb3ZpZGVycyIpOwogCSAgICBsb2dnZXIuY29uZmlnKCJQcm92aWRlcnMgTGlzdGVkIEJ5IENsYXNzIE5hbWU6ICIgKyAKIAkgICAgICAgcHJvdmlkZXJzQnlDbGFzc05hbWUudG9TdHJpbmcoKSk7CiAJICAgIGxvZ2dlci5jb25maWcoIlByb3ZpZGVycyBMaXN0ZWQgQnkgUHJvdG9jb2w6ICIgKyAKIAkgICAgICAgcHJvdmlkZXJzQnlQcm90b2NvbC50b1N0cmluZygpKTsKIAl9CisJbG9hZGVkUHJvdmlkZXJzID0gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVyc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMpIApAQCAtOTgwLDYgKzExMDgsOCBAQAogCiAJCWlmIChjdXJyTGluZS5zdGFydHNXaXRoKCIjIikpCiAJCSAgICBjb250aW51ZTsKKwkJaWYgKGN1cnJMaW5lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQorCQkgICAgY29udGludWU7CS8vIHNraXAgYmxhbmsgbGluZQogCQlQcm92aWRlci5UeXBlIHR5cGUgPSBudWxsOwogCQlTdHJpbmcgcHJvdG9jb2wgPSBudWxsLCBjbGFzc05hbWUgPSBudWxsOwogCQlTdHJpbmcgdmVuZG9yID0gbnVsbCwgdmVyc2lvbiA9IG51bGw7CkBAIC0xMDMzLDcgKzExNjMsOSBAQAogICAgICAqIEBzaW5jZQlKYXZhTWFpbCAxLjQKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvdmlkZXIoUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQlwcm92aWRlcnMuYWRkRWxlbWVudChwcm92aWRlcik7CisJaWYgKHByb3ZpZGVycyA9PSBudWxsKQorCSAgICBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PFByb3ZpZGVyPigpOworCXByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwogCXByb3ZpZGVyc0J5Q2xhc3NOYW1lLnB1dChwcm92aWRlci5nZXRDbGFzc05hbWUoKSwgcHJvdmlkZXIpOwogCWlmICghcHJvdmlkZXJzQnlQcm90b2NvbC5jb250YWluc0tleShwcm92aWRlci5nZXRQcm90b2NvbCgpKSkKIAkgICAgcHJvdmlkZXJzQnlQcm90b2NvbC5wdXQocHJvdmlkZXIuZ2V0UHJvdG9jb2woKSwgcHJvdmlkZXIpOwpAQCAtMTA0MywyNiArMTE3NSwyNCBAQAogICAgIC8vIG1hcCBpcyBsb2FkZWQgbGFzdCBzaW5jZSBpdHMgZW50cmllcyB3aWxsIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBvbmVzCiAgICAgcHJpdmF0ZSB2b2lkIGxvYWRBZGRyZXNzTWFwKENsYXNzPD8+IGNsKSB7CiAJU3RyZWFtTG9hZGVyIGxvYWRlciA9IG5ldyBTdHJlYW1Mb2FkZXIoKSB7CisJICAgIEBPdmVycmlkZQogCSAgICBwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhZGRyZXNzTWFwLmxvYWQoaXMpOwogCSAgICB9CiAJfTsKIAogCS8vIGxvYWQgZGVmYXVsdCBNRVRBLUlORi9qYXZhbWFpbC5kZWZhdWx0LmFkZHJlc3MubWFwIGZyb20gbWFpbC5qYXIKLQlsb2FkUmVzb3VyY2UoIi9NRVRBLUlORi9qYXZhbWFpbC5kZWZhdWx0LmFkZHJlc3MubWFwIiwgY2wsIGxvYWRlcik7CisJbG9hZFJlc291cmNlKCIvTUVUQS1JTkYvamF2YW1haWwuZGVmYXVsdC5hZGRyZXNzLm1hcCIsIGNsLCBsb2FkZXIsIHRydWUpOwogCiAJLy8gbG9hZCB0aGUgTUVUQS1JTkYvamF2YW1haWwuYWRkcmVzcy5tYXAgZmlsZSBzdXBwbGllZCBieSBhbiBhcHAKIAlsb2FkQWxsUmVzb3VyY2VzKCJNRVRBLUlORi9qYXZhbWFpbC5hZGRyZXNzLm1hcCIsIGNsLCBsb2FkZXIpOwogCi0JLy8gbG9hZCBzeXN0ZW0td2lkZSBqYXZhbWFpbC5hZGRyZXNzLm1hcCBmcm9tIHRoZSA8amF2YS5ob21lPi9saWIgZGlyCisJLy8gbG9hZCBzeXN0ZW0td2lkZSBqYXZhbWFpbC5hZGRyZXNzLm1hcCBmcm9tIHRoZQorCS8vIDxqYXZhLmhvbWU+L3tjb25mLGxpYn0gZGlyZWN0b3J5CiAJdHJ5IHsKLQkgICAgU3RyaW5nIHJlcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyAKLQkJCQlGaWxlLnNlcGFyYXRvciArICJsaWIiICsgCi0JCQkJRmlsZS5zZXBhcmF0b3IgKyAiamF2YW1haWwuYWRkcmVzcy5tYXAiOwotCSAgICBsb2FkRmlsZShyZXMsIGxvYWRlcik7Ci0JfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2V4KSB7Ci0JICAgIGxvZ2dlci5sb2coTGV2ZWwuQ09ORklHLCAiY2FuJ3QgZ2V0IGphdmEuaG9tZSIsIHNleCk7Ci0JfQorCSAgICBpZiAoY29uZkRpciAhPSBudWxsKQorCQlsb2FkRmlsZShjb25mRGlyICsgImphdmFtYWlsLmFkZHJlc3MubWFwIiwgbG9hZGVyKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkge30KIAogCWlmIChhZGRyZXNzTWFwLmlzRW1wdHkoKSkgewogCSAgICBsb2dnZXIuY29uZmlnKCJmYWlsZWQgdG8gbG9hZCBhZGRyZXNzIG1hcCwgdXNpbmcgZGVmYXVsdHMiKTsKQEAgLTExMTcsNyArMTI0Nyw4IEBACiAgICAgLyoqCiAgICAgICogTG9hZCBmcm9tIHRoZSBuYW1lZCByZXNvdXJjZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlKFN0cmluZyBuYW1lLCBDbGFzczw/PiBjbCwgU3RyZWFtTG9hZGVyIGxvYWRlcikgeworICAgIHByaXZhdGUgdm9pZCBsb2FkUmVzb3VyY2UoU3RyaW5nIG5hbWUsIENsYXNzPD8+IGNsLCBTdHJlYW1Mb2FkZXIgbG9hZGVyLAorCQkJCWJvb2xlYW4gZXhwZWN0ZWQpIHsKIAlJbnB1dFN0cmVhbSBjbGlzID0gbnVsbDsKIAl0cnkgewogCSAgICBjbGlzID0gZ2V0UmVzb3VyY2VBc1N0cmVhbShjbCwgbmFtZSk7CkBAIC0xMTI2LDkgKzEyNTcsOSBAQAogCQlsb2dnZXIubG9nKExldmVsLkNPTkZJRywgInN1Y2Nlc3NmdWxseSBsb2FkZWQgcmVzb3VyY2U6IHswfSIsCiAJCQkJCSAgICBuYW1lKTsKIAkgICAgfSBlbHNlIHsKLQkJLyoKLQkJbG9nZ2VyLmxvZyhMZXZlbC5DT05GSUcsICJub3QgbG9hZGluZyByZXNvdXJjZTogezB9IiwgbmFtZSk7Ci0JCSovCisJCWlmIChleHBlY3RlZCkKKwkJICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywKKwkJCQkgICAgImV4cGVjdGVkIHJlc291cmNlIG5vdCBmb3VuZDogezB9IiwgbmFtZSk7CiAJICAgIH0KIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJICAgIGxvZ2dlci5sb2coTGV2ZWwuQ09ORklHLCAiRXhjZXB0aW9uIGxvYWRpbmcgcmVzb3VyY2UiLCBlKTsKQEAgLTEyMDAsNyArMTMzMSw3IEBACiAJICAgIC8qCiAJICAgIGxvZ2dlci5jb25maWcoIiFhbnlMb2FkZWQiKTsKIAkgICAgKi8KLQkgICAgbG9hZFJlc291cmNlKCIvIiArIG5hbWUsIGNsLCBsb2FkZXIpOworCSAgICBsb2FkUmVzb3VyY2UoIi8iICsgbmFtZSwgY2wsIGxvYWRlciwgZmFsc2UpOwogCX0KICAgICB9CiAKQEAgLTEyMTEsNiArMTM0Miw3IEBACiAgICAgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKIAlyZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCiAJCW5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKwkJICAgIEBPdmVycmlkZQogCQkgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKIAkJCUNsYXNzTG9hZGVyIGNsID0gbnVsbDsKIAkJCXRyeSB7CkBAIC0xMjI4LDYgKzEzNjAsNyBAQAogCXRyeSB7CiAJICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKIAkJICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPElucHV0U3RyZWFtPigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIElucHV0U3RyZWFtIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkgICAgdHJ5IHsKIAkJCQlyZXR1cm4gYy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwpAQCAtMTI0OCw2ICsxMzgxLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIFVSTFtdIGdldFJlc291cmNlcyhmaW5hbCBDbGFzc0xvYWRlciBjbCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKIAlyZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248VVJMW10+KCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIFVSTFtdIHJ1bigpIHsKIAkJVVJMW10gcmV0ID0gbnVsbDsKIAkJdHJ5IHsKQEAgLTEyNjUsNiArMTM5OSw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBVUkxbXSBnZXRTeXN0ZW1SZXNvdXJjZXMoZmluYWwgU3RyaW5nIG5hbWUpIHsKIAlyZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248VVJMW10+KCkgeworCSAgICBAT3ZlcnJpZGUKIAkgICAgcHVibGljIFVSTFtdIHJ1bigpIHsKIAkJVVJMW10gcmV0ID0gbnVsbDsKIAkJdHJ5IHsKQEAgLTEyODUsNiArMTQyMCw3IEBACiAJdHJ5IHsKIAkgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAogCQkgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248SW5wdXRTdHJlYW0+KCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSW5wdXRTdHJlYW0gcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCSAgICByZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKIAkJCX0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1N0b3JlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TdG9yZS5qYXZhCmluZGV4IDZkYzcwYzQuLjNlNzY5YzQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1N0b3JlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU3RvcmUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdG9yZUxpc3RlbmVyKFN0b3JlTGlzdGVuZXIgbCkgewogCWlmIChzdG9yZUxpc3RlbmVycyA9PSBudWxsKQotCSAgICBzdG9yZUxpc3RlbmVycyA9IG5ldyBWZWN0b3I8U3RvcmVMaXN0ZW5lcj4oKTsKKwkgICAgc3RvcmVMaXN0ZW5lcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAlzdG9yZUxpc3RlbmVycy5hZGRFbGVtZW50KGwpOwogICAgIH0KIApAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEZvbGRlckxpc3RlbmVyKEZvbGRlckxpc3RlbmVyIGwpIHsKICAgIAlpZiAoZm9sZGVyTGlzdGVuZXJzID09IG51bGwpCi0JICAgIGZvbGRlckxpc3RlbmVycyA9IG5ldyBWZWN0b3I8Rm9sZGVyTGlzdGVuZXI+KCk7CisJICAgIGZvbGRlckxpc3RlbmVycyA9IG5ldyBWZWN0b3I8PigpOwogCWZvbGRlckxpc3RlbmVycy5hZGRFbGVtZW50KGwpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU3RvcmVDbG9zZWRFeGNlcHRpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1N0b3JlQ2xvc2VkRXhjZXB0aW9uLmphdmEKaW5kZXggMmE3OWQyYi4uNTU1OWZhZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvU3RvcmVDbG9zZWRFeGNlcHRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9TdG9yZUNsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvVHJhbnNwb3J0LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9UcmFuc3BvcnQuamF2YQppbmRleCBlNTEyNDhiLi44ZWUxMGM2IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9UcmFuc3BvcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9UcmFuc3BvcnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTIxNCwxMiArMjE0LDEyIEBACiAJICogaW5kZXhlZCBieSBhZGRyZXNzIHR5cGUKIAkgKi8KIAlNYXA8U3RyaW5nLCBMaXN0PEFkZHJlc3M+PiBwcm90b2NvbHMKLQkJPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QWRkcmVzcz4+KCk7CisJCT0gbmV3IEhhc2hNYXA8PigpOwogCiAJLy8gTGlzdHMgb2YgYWRkcmVzc2VzCi0JTGlzdDxBZGRyZXNzPiBpbnZhbGlkID0gbmV3IEFycmF5TGlzdDxBZGRyZXNzPigpOwotCUxpc3Q8QWRkcmVzcz4gdmFsaWRTZW50ID0gbmV3IEFycmF5TGlzdDxBZGRyZXNzPigpOwotCUxpc3Q8QWRkcmVzcz4gdmFsaWRVbnNlbnQgPSBuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KCk7CisJTGlzdDxBZGRyZXNzPiBpbnZhbGlkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJTGlzdDxBZGRyZXNzPiB2YWxpZFNlbnQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlMaXN0PEFkZHJlc3M+IHZhbGlkVW5zZW50ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAlmb3IgKGludCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewogCSAgICAvLyBpcyB0aGlzIGFkZHJlc3MgdHlwZSBhbHJlYWR5IGluIHRoZSBtYXA/CkBAIC0yMjgsNyArMjI4LDcgQEAKIAkJdi5hZGQoYWRkcmVzc2VzW2ldKTsKIAkgICAgfSBlbHNlIHsKIAkJLy8gbmVlZCB0byBhZGQgYSBuZXcgcHJvdG9jb2wKLQkJTGlzdDxBZGRyZXNzPiB3ID0gbmV3IEFycmF5TGlzdDxBZGRyZXNzPigpOworCQlMaXN0PEFkZHJlc3M+IHcgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdy5hZGQoYWRkcmVzc2VzW2ldKTsKIAkJcHJvdG9jb2xzLnB1dChhZGRyZXNzZXNbaV0uZ2V0VHlwZSgpLCB3KTsKIAkgICAgfQpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFRyYW5zcG9ydExpc3RlbmVyKFRyYW5zcG9ydExpc3RlbmVyIGwpIHsKIAlpZiAodHJhbnNwb3J0TGlzdGVuZXJzID09IG51bGwpCi0JICAgIHRyYW5zcG9ydExpc3RlbmVycyA9IG5ldyBWZWN0b3I8VHJhbnNwb3J0TGlzdGVuZXI+KCk7CisJICAgIHRyYW5zcG9ydExpc3RlbmVycyA9IG5ldyBWZWN0b3I8PigpOwogCXRyYW5zcG9ydExpc3RlbmVycy5hZGRFbGVtZW50KGwpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvVUlERm9sZGVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9VSURGb2xkZXIuamF2YQppbmRleCBmZDNlOWUyLi5iYmUzZDAxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9VSURGb2xkZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9VSURGb2xkZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTc1LDYgKzc1LDcgQEAKICAqCiAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+PHA+CiAgKgorICogQGF1dGhvciBCaWxsIFNoYW5ub24KICAqIEBhdXRob3IgSm9obiBNYW5pCiAgKi8KIApAQCAtMTE5LDcgKzEyMCwyNCBAQAogICAgICAqCiAgICAgICogQHNlZSAjZ2V0TWVzc2FnZXNCeVVJRAogICAgICAqLyAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTEFTVFVJRCA9IC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBMQVNUVUlEID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2VzdCB2YWx1ZSBwb3NzaWJsZSBmb3IgYSBVSUQsIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBmZXRjaCBhbGwgbmV3IG1lc3NhZ2VzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCisgICAgICogbGFzdCBVSUQgdGhhdCB3YXMgc2VlbiBhbmQgdXNpbmc6CisgICAgICogPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgKgorICAgICAqIAlGb2xkZXIgZiA9IHN0b3JlLmdldEZvbGRlcigid2hhdGV2ZXIiKTsKKyAgICAgKglVSURGb2xkZXIgdWYgPSAoVUlERm9sZGVyKWY7CisgICAgICoJTWVzc2FnZVtdIG5ld01zZ3MgPQorICAgICAqCQl1Zi5nZXRNZXNzYWdlc0J5VUlEKGxhc3RTZWVuVUlEICsgMSwgVUlERm9sZGVyLk1BWFVJRCk7CisgICAgICoKKyAgICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+PHA+CisgICAgICoKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1BWFVJRCA9IDB4ZmZmZmZmZmZMOyAvLyBtYXggMzItYml0IHVuc2lnbmVkIGludAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgVUlEVmFsaWRpdHkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZm9sZGVyLiA8cD4KQEAgLTE5MSw0ICsyMDksMjIgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRVSUQoTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJlZGljdGVkIFVJRCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlCisgICAgICogbmV4dCBtZXNzYWdlIHRoYXQgaXMgYXBwZW5kZWQgdG8gdGhpcyBmb2xkZXIuCisgICAgICogTWVzc2FnZXMgbWlnaHQgYmUgYXBwZW5kZWQgdG8gdGhlIGZvbGRlciBhZnRlciB0aGlzIHZhbHVlCisgICAgICogaXMgcmV0cmlldmVkLCBjYXVzaW5nIHRoaXMgdmFsdWUgdG8gYmUgb3V0IG9mIGRhdGUuCisgICAgICogVGhpcyB2YWx1ZSBtaWdodCBvbmx5IGJlIHVwZGF0ZWQgd2hlbiBhIGZvbGRlciBpcyBmaXJzdCBvcGVuZWQuCisgICAgICogTm90ZSB0aGF0IG1lc3NhZ2VzIG1heSBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gdGhlIGZvbGRlcgorICAgICAqIHdoaWxlIGl0IHdhcyBvcGVuIGFuZCB0aHVzIHRoaXMgdmFsdWUgbWF5IGJlIG91dCBvZgorICAgICAqIGRhdGUuIDxwPgorICAgICAqCisgICAgICogSWYgdGhlIHZhbHVlIGlzIHVua25vd24sIC0xIGlzIHJldHVybmVkLiAgPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuCQl0aGUgVUlETkVYVCB2YWx1ZSwgb3IgLTEgaWYgdW5rbm93bgorICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcworICAgICAqIEBzaW5jZQkJSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VUlETmV4dCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9VUkxOYW1lLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9VUkxOYW1lLmphdmEKaW5kZXggOTJhOGI1Yy4uMWUyOGEzMiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvVVJMTmFtZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL1VSTE5hbWUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTQgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE4OSwxMCArMTg5LDExIEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTE5hbWUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlpZiAoZnVsbFVSTCA9PSBudWxsKSB7CiAJICAgIC8vIGFkZCB0aGUgInByb3RvY29sOiIKLQkgICAgU3RyaW5nQnVmZmVyIHRlbXBVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJICAgIFN0cmluZ0J1aWxkZXIgdGVtcFVSTCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJICAgIGlmIChwcm90b2NvbCAhPSBudWxsKSB7CiAJCXRlbXBVUkwuYXBwZW5kKHByb3RvY29sKTsKIAkJdGVtcFVSTC5hcHBlbmQoIjoiKTsKQEAgLTQwOSw3ICs0MTAsMTMgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZAogICAgICAqLwogICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgVVJMKGdldFByb3RvY29sKCksIGdldEhvc3QoKSwgZ2V0UG9ydCgpLCBnZXRGaWxlKCkpOworCS8vIFVSTCBleHBlY3RzIHRoZSBmaWxlIHRvIGluY2x1ZGUgdGhlIHNlcGFyYXRpbmcgIi8iCisJU3RyaW5nIGYgPSBnZXRGaWxlKCk7CisJaWYgKGYgPT0gbnVsbCkKKwkgICAgZiA9ICIiOworCWVsc2UKKwkgICAgZiA9ICIvIiArIGY7CisgICAgICAgIHJldHVybiBuZXcgVVJMKGdldFByb3RvY29sKCksIGdldEhvc3QoKSwgZ2V0UG9ydCgpLCBmKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzMyw2ICs0NDAsNyBAQAogICAgICAqIE5vdGUgYWxzbyB0aGF0IHRoZSBwYXNzd29yZCBmaWVsZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbXBhcmlzb24sCiAgICAgICogbm9yIGlzIGFueSByZWZlcmVuY2UgZmllbGQgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVSTE5hbWUpKQogCSAgICByZXR1cm4gZmFsc2U7CkBAIC00ODUsNiArNDkzLDcgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgVVJMTmFtZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCWlmIChoYXNoQ29kZSAhPSAwKQogCSAgICByZXR1cm4gaGFzaENvZGU7CkBAIC01ODksNyArNTk4LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfZW5jb2RlKFN0cmluZyBzKSB7CiAJaW50IG1heEJ5dGVzUGVyQ2hhciA9IDEwOwotICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3RyaW5nQnVpbGRlcihzLmxlbmd0aCgpKTsKIAlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShtYXhCeXRlc1BlckNoYXIpOwogCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1Zik7CiAKQEAgLTY2OCw3ICs2NzcsNyBAQAogCWlmIChpbmRleE9mQW55KHMsICIrJSIpID09IC0xKQogCSAgICByZXR1cm4gczsJCS8vIHRoZSBjb21tb24gY2FzZQogCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKICAgICAgICAgICAgIHN3aXRjaCAoYykgewpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEKaW5kZXggYmJhMmRhOS4uZWZmMWIyYyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Db25uZWN0aW9uQWRhcHRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDksNyArNDksMTAgQEAKICAqIEBhdXRob3IgSm9obiBNYW5pCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25uZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7CisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25FdmVudCBlKSB7fQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RlZChDb25uZWN0aW9uRXZlbnQgZSkge30KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbkV2ZW50IGUpIHt9CiB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Db25uZWN0aW9uRXZlbnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25FdmVudC5qYXZhCmluZGV4IGI5ZjJlNTguLjM4ZjMzNTYgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25FdmVudC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25FdmVudC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtODksNiArODksNyBAQAogICAgIC8qKgogICAgICAqIEludm9rZXMgdGhlIGFwcHJvcHJpYXRlIENvbm5lY3Rpb25MaXN0ZW5lciBtZXRob2QKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChPYmplY3QgbGlzdGVuZXIpIHsKIAlpZiAodHlwZSA9PSBPUEVORUQpCiAJICAgICgoQ29ubmVjdGlvbkxpc3RlbmVyKWxpc3RlbmVyKS5vcGVuZWQodGhpcyk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Db25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCmluZGV4IGRiNTljMjQuLmQ2Zjk2YjUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvRm9sZGVyQWRhcHRlci5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvRm9sZGVyQWRhcHRlci5qYXZhCmluZGV4IGFlOWNiZGEuLjA1N2JhZDUgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0ZvbGRlckFkYXB0ZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Gb2xkZXJBZGFwdGVyLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00OSw3ICs0OSwxMCBAQAogICogQGF1dGhvciBKb2huIE1hbmkKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEZvbGRlckFkYXB0ZXIgaW1wbGVtZW50cyBGb2xkZXJMaXN0ZW5lciB7CisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZm9sZGVyQ3JlYXRlZChGb2xkZXJFdmVudCBlKSB7fQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZvbGRlclJlbmFtZWQoRm9sZGVyRXZlbnQgZSkge30KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmb2xkZXJEZWxldGVkKEZvbGRlckV2ZW50IGUpIHt9CiB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Gb2xkZXJFdmVudC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvRm9sZGVyRXZlbnQuamF2YQppbmRleCAxZDQ4ZmExLi5mNjM3ZGI0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Gb2xkZXJFdmVudC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0ZvbGRlckV2ZW50LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xNTYsNiArMTU2LDcgQEAKICAgICAvKioKICAgICAgKiBJbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBGb2xkZXJMaXN0ZW5lciBtZXRob2QKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChPYmplY3QgbGlzdGVuZXIpIHsKIAlpZiAodHlwZSA9PSBDUkVBVEVEKQogCSAgICAoKEZvbGRlckxpc3RlbmVyKWxpc3RlbmVyKS5mb2xkZXJDcmVhdGVkKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvRm9sZGVyTGlzdGVuZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L0ZvbGRlckxpc3RlbmVyLmphdmEKaW5kZXggMTk2ZDdhYy4uZDVjYTRiNiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvRm9sZGVyTGlzdGVuZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9Gb2xkZXJMaXN0ZW5lci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWFpbEV2ZW50LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NYWlsRXZlbnQuamF2YQppbmRleCBlMmI5YmE0Li42ODJiOGUwIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NYWlsRXZlbnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NYWlsRXZlbnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDaGFuZ2VkRXZlbnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDaGFuZ2VkRXZlbnQuamF2YQppbmRleCBiZGZmZjE3Li5iZTlmMWVjIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ2hhbmdlZEV2ZW50LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNoYW5nZWRFdmVudC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTAxLDYgKzEwMSw3IEBACiAgICAgLyoqCiAgICAgICogSW52b2tlcyB0aGUgYXBwcm9wcmlhdGUgTWVzc2FnZUNoYW5nZWRMaXN0ZW5lciBtZXRob2QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goT2JqZWN0IGxpc3RlbmVyKSB7CiAJKChNZXNzYWdlQ2hhbmdlZExpc3RlbmVyKWxpc3RlbmVyKS5tZXNzYWdlQ2hhbmdlZCh0aGlzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ2hhbmdlZExpc3RlbmVyLmphdmEKaW5kZXggNjVmZGExNi4uNjA4ZDNhZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDaGFuZ2VkTGlzdGVuZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDb3VudEFkYXB0ZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDb3VudEFkYXB0ZXIuamF2YQppbmRleCAyNzk1YjEzLi44OTcyZGQ1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ291bnRBZGFwdGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNvdW50QWRhcHRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDksNiArNDksOCBAQAogICogQGF1dGhvciBKb2huIE1hbmkKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VDb3VudEFkYXB0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQ291bnRMaXN0ZW5lciB7CisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZXNBZGRlZChNZXNzYWdlQ291bnRFdmVudCBlKSB7fQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VzUmVtb3ZlZChNZXNzYWdlQ291bnRFdmVudCBlKSB7fQogfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNvdW50RXZlbnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDb3VudEV2ZW50LmphdmEKaW5kZXggNTE2N2I4Ni4uMGZlYWM3ZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNvdW50RXZlbnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ291bnRFdmVudC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTQ4LDYgKzE0OCw3IEBACiAgICAgLyoqCiAgICAgICogSW52b2tlcyB0aGUgYXBwcm9wcmlhdGUgTWVzc2FnZUNvdW50TGlzdGVuZXIgbWV0aG9kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoKE9iamVjdCBsaXN0ZW5lcikgewogCWlmICh0eXBlID09IEFEREVEKQogCSAgICAoKE1lc3NhZ2VDb3VudExpc3RlbmVyKWxpc3RlbmVyKS5tZXNzYWdlc0FkZGVkKHRoaXMpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNvdW50TGlzdGVuZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L01lc3NhZ2VDb3VudExpc3RlbmVyLmphdmEKaW5kZXggMTQ3MGU1Yy4uNDBlMzhlNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvTWVzc2FnZUNvdW50TGlzdGVuZXIuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9NZXNzYWdlQ291bnRMaXN0ZW5lci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvU3RvcmVFdmVudC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvU3RvcmVFdmVudC5qYXZhCmluZGV4IDVhY2E0MGUuLjI4ODQ4M2YgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1N0b3JlRXZlbnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9TdG9yZUV2ZW50LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMTYsNiArMTE2LDcgQEAKICAgICAvKioKICAgICAgKiBJbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBTdG9yZUxpc3RlbmVyIG1ldGhvZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChPYmplY3QgbGlzdGVuZXIpIHsKIAkoKFN0b3JlTGlzdGVuZXIpbGlzdGVuZXIpLm5vdGlmaWNhdGlvbih0aGlzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9TdG9yZUxpc3RlbmVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9TdG9yZUxpc3RlbmVyLmphdmEKaW5kZXggNWMzYzgwNy4uNDdjYTg4NCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvU3RvcmVMaXN0ZW5lci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1N0b3JlTGlzdGVuZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1RyYW5zcG9ydEFkYXB0ZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1RyYW5zcG9ydEFkYXB0ZXIuamF2YQppbmRleCAxNTVmYzcxLi40ZjJiYThhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9UcmFuc3BvcnRBZGFwdGVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvVHJhbnNwb3J0QWRhcHRlci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDksNyArNDksMTAgQEAKICAqIEBhdXRob3IgSm9obiBNYW5pCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc3BvcnRBZGFwdGVyIGltcGxlbWVudHMgVHJhbnNwb3J0TGlzdGVuZXIgeworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VEZWxpdmVyZWQoVHJhbnNwb3J0RXZlbnQgZSkge30KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTm90RGVsaXZlcmVkKFRyYW5zcG9ydEV2ZW50IGUpIHt9CisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZVBhcnRpYWxseURlbGl2ZXJlZChUcmFuc3BvcnRFdmVudCBlKSB7fQogfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvVHJhbnNwb3J0RXZlbnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1RyYW5zcG9ydEV2ZW50LmphdmEKaW5kZXggYzMyYmEwMi4uOTZmY2E0OCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvVHJhbnNwb3J0RXZlbnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9UcmFuc3BvcnRFdmVudC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTY2LDYgKzE2Niw3IEBACiAgICAgLyoqCiAgICAgICogSW52b2tlcyB0aGUgYXBwcm9wcmlhdGUgVHJhbnNwb3J0TGlzdGVuZXIgbWV0aG9kLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoKE9iamVjdCBsaXN0ZW5lcikgewogCWlmICh0eXBlID09IE1FU1NBR0VfREVMSVZFUkVEKQkKIAkgICAgKChUcmFuc3BvcnRMaXN0ZW5lcilsaXN0ZW5lcikubWVzc2FnZURlbGl2ZXJlZCh0aGlzKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1RyYW5zcG9ydExpc3RlbmVyLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9UcmFuc3BvcnRMaXN0ZW5lci5qYXZhCmluZGV4IDJiOTBiMDcuLjg2ZTg2MjggMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L1RyYW5zcG9ydExpc3RlbmVyLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvZXZlbnQvVHJhbnNwb3J0TGlzdGVuZXIuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L3BhY2thZ2UuaHRtbCBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2V2ZW50L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZmIwNy4uMDAwMDAwMAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9ldmVudC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKLSAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0KLSAgICBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAgICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICAgIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQotICAgIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLSAgICBNb2RpZmljYXRpb25zOgotICAgIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gICAgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgIENvbnRyaWJ1dG9yKHMpOgotICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgotICAgIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gICAgZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gICAgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQotICAgIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAgICBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAgICBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKLSAgICBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gICAgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAgICBob2xkZXIuCi0KLS0tPgotCi08L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLUxpc3RlbmVycyBhbmQgZXZlbnRzIGZvciB0aGUgSmF2YU1haWwgQVBJLgotVGhpcyBwYWNrYWdlIGRlZmluZXMgbGlzdGVuZXIgY2xhc3NlcyBhbmQgZXZlbnQgY2xhc3NlcyB1c2VkIGJ5IHRoZSBjbGFzc2VzCi1kZWZpbmVkIGluIHRoZSA8Y29kZT5qYXZheC5tYWlsPC9jb2RlPiBwYWNrYWdlLgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9BZGRyZXNzRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9BZGRyZXNzRXhjZXB0aW9uLmphdmEKaW5kZXggOTNhZmEwOC4uOWEyZTBlZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvQWRkcmVzc0V4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0FkZHJlc3NFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEyNSw2ICsxMjUsNyBAQAogCXJldHVybiBwb3M7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgcyA9IHN1cGVyLnRvU3RyaW5nKCk7CiAJaWYgKHJlZiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvQ29udGVudERpc3Bvc2l0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9Db250ZW50RGlzcG9zaXRpb24uamF2YQppbmRleCAxZTUwNDMzLi4zNmM0YWJhIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9Db250ZW50RGlzcG9zaXRpb24uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9Db250ZW50RGlzcG9zaXRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQzLDYgKzQzLDcgQEAKIGltcG9ydCBqYXZheC5tYWlsLio7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlByb3BVdGlsOwogCiAvKioKICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIE1JTUUgQ29udGVudERpc3Bvc2l0aW9uIHZhbHVlLiBJdCBwcm92aWRlcwpAQCAtNTQsNiArNTUsOSBAQAogCiBwdWJsaWMgY2xhc3MgQ29udGVudERpc3Bvc2l0aW9uIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udGVudERpc3Bvc2l0aW9uU3RyaWN0ID0KKyAgICAgICAgUHJvcFV0aWwuZ2V0Qm9vbGVhblN5c3RlbVByb3BlcnR5KCJtYWlsLm1pbWUuY29udGVudGRpc3Bvc2l0aW9uLnN0cmljdCIsIHRydWUpOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcG9zaXRpb247IC8vIGRpc3Bvc2l0aW9uCiAgICAgcHJpdmF0ZSBQYXJhbWV0ZXJMaXN0IGxpc3Q7CS8vIHBhcmFtZXRlciBsaXN0CiAKQEAgLTg5LDE1ICs5MywyNiBAQAogCiAJLy8gRmlyc3QgImRpc3Bvc2l0aW9uIiAuLgogCXRrID0gaC5uZXh0KCk7Ci0JaWYgKHRrLmdldFR5cGUoKSAhPSBIZWFkZXJUb2tlbml6ZXIuVG9rZW4uQVRPTSkKLQkgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBkaXNwb3NpdGlvbiwgZ290ICIgKwotCQkJCQl0ay5nZXRWYWx1ZSgpKTsKLQlkaXNwb3NpdGlvbiA9IHRrLmdldFZhbHVlKCk7CisJaWYgKHRrLmdldFR5cGUoKSAhPSBIZWFkZXJUb2tlbml6ZXIuVG9rZW4uQVRPTSkgeworICAgICAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvblN0cmljdCkgeworCSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBkaXNwb3NpdGlvbiwgZ290ICIgKworCQkJCSAgICB0ay5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgZGlzcG9zaXRpb24gPSB0ay5nZXRWYWx1ZSgpOworICAgICAgICB9CiAKIAkvLyBUaGVuIHBhcmFtZXRlcnMgLi4KIAlTdHJpbmcgcmVtID0gaC5nZXRSZW1haW5kZXIoKTsKLQlpZiAocmVtICE9IG51bGwpCi0JICAgIGxpc3QgPSBuZXcgUGFyYW1ldGVyTGlzdChyZW0pOworCWlmIChyZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IFBhcmFtZXRlckxpc3QocmVtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHB4KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvblN0cmljdCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBweDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAqIEByZXR1cm4JUkZDMjA0NSBzdHlsZSBzdHJpbmcKICAgICAgKiBAc2luY2UJCUphdmFNYWlsIDEuMgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJaWYgKGRpc3Bvc2l0aW9uID09IG51bGwpCiAJICAgIHJldHVybiAiIjsKQEAgLTE4Myw3ICsxOTksNyBAQAogCWlmIChsaXN0ID09IG51bGwpCiAJICAgIHJldHVybiBkaXNwb3NpdGlvbjsKIAotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZGlzcG9zaXRpb24pOworCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihkaXNwb3NpdGlvbik7CiAKICAgICAgICAgLy8gYXBwZW5kIHRoZSBwYXJhbWV0ZXIgbGlzdCAgCiAgICAgICAgIC8vIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYnVmZmVyICsgdGhlIGxlbmd0aCBvZiAKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0NvbnRlbnRUeXBlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9Db250ZW50VHlwZS5qYXZhCmluZGV4IGM3MzY5NDUuLmM1NjE1NzQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0NvbnRlbnRUeXBlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvQ29udGVudFR5cGUuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTQgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTIxNSwxMSArMjE1LDEyIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCVJGQzIwNDUgc3R5bGUgc3RyaW5nCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlpZiAocHJpbWFyeVR5cGUgPT0gbnVsbCB8fCBzdWJUeXBlID09IG51bGwpIC8vIG5lZWQgYm90aAogCSAgICByZXR1cm4gIiI7CiAKLQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJc2IuYXBwZW5kKHByaW1hcnlUeXBlKS5hcHBlbmQoJy8nKS5hcHBlbmQoc3ViVHlwZSk7CiAJaWYgKGxpc3QgIT0gbnVsbCkKICAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgcGFyYW1ldGVyIGxpc3QgCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9IZWFkZXJUb2tlbml6ZXIuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0hlYWRlclRva2VuaXplci5qYXZhCmluZGV4IGEzMjUxYzAuLmM2OTQ2NDQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0hlYWRlclRva2VuaXplci5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0hlYWRlclRva2VuaXplci5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDU0LDcgKzQ1NCw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbHRlclRva2VuKFN0cmluZyBzLCBpbnQgc3RhcnQsIGludCBlbmQsCiAJCQkJYm9vbGVhbiBrZWVwRXNjYXBlcykgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAljaGFyIGM7CiAJYm9vbGVhbiBnb3RFc2NhcGUgPSBmYWxzZTsKIAlib29sZWFuIGdvdENSID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9JbnRlcm5ldEFkZHJlc3MuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0ludGVybmV0QWRkcmVzcy5qYXZhCmluZGV4IGIxNjZhMDAuLjBkMmY4MWMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0ludGVybmV0QWRkcmVzcy5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L0ludGVybmV0QWRkcmVzcy5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNDcsNiArNDcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZheC5tYWlsLio7CiBpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUHJvcFV0aWw7CiAKQEAgLTg5LDYgKzkwLDkgQEAKIAlQcm9wVXRpbC5nZXRCb29sZWFuU3lzdGVtUHJvcGVydHkoCiAJCQkgICAgIm1haWwubWltZS5hZGRyZXNzLnVzZWNhbm9uaWNhbGhvc3RuYW1lIiwgdHJ1ZSk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93VXRmOCA9CisJUHJvcFV0aWwuZ2V0Qm9vbGVhblN5c3RlbVByb3BlcnR5KCJtYWlsLm1pbWUuYWxsb3d1dGY4IiwgZmFsc2UpOworCiAgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgKi8KQEAgLTE4Myw2ICsxODcsNyBAQAogICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhpcyBJbnRlcm5ldEFkZHJlc3Mgb2JqZWN0LgogICAgICAqIEBzaW5jZQkJSmF2YU1haWwgMS4yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKIAlJbnRlcm5ldEFkZHJlc3MgYSA9IG51bGw7CiAJdHJ5IHsKQEAgLTE5NSw2ICsyMDAsNyBAQAogICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGFkZHJlc3MuIFRoZSB0eXBlIG9mIGFuIEludGVybmV0QWRkcmVzcwogICAgICAqIGlzICJyZmM4MjIiLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKIAlyZXR1cm4gInJmYzgyMiI7CiAgICAgfQpAQCAtMjkxLDYgKzI5Nyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCQlwb3NzaWJseSBlbmNvZGVkIGFkZHJlc3Mgc3RyaW5nCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlTdHJpbmcgYSA9IGFkZHJlc3MgPT0gbnVsbCA/ICIiIDogYWRkcmVzczsKIAlpZiAoZW5jb2RlZFBlcnNvbmFsID09IG51bGwgJiYgcGVyc29uYWwgIT0gbnVsbCkKQEAgLTM1MCw3ICszNTcsNyBAQAogICAgICAgICAgICAgY2hhciBjID0gcGhyYXNlLmNoYXJBdChpKTsKICAgICAgICAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdcXCcpIHsgCiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBlc2NhcGUgdGhlbSBhbmQgdGhlbiBxdW90ZSB0aGUgd2hvbGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAzKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgMyk7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCciJyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICBjaGFyIGNjID0gcGhyYXNlLmNoYXJBdChqKTsKQEAgLTM2MiwxMyArMzY5LDEzIEBACiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCciJyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChjIDwgMDQwICYmIGMgIT0gJ1xyJyAmJiBjICE9ICdcbicgJiYgYyAhPSAnXHQnKSB8fCAKLQkJCWMgPj0gMDE3NyB8fCByZmM4MjJwaHJhc2UuaW5kZXhPZihjKSA+PSAwKQotICAgICAgICAgICAgICAgLy8gVGhlc2UgY2hhcmFjdGVycyBjYXVzZSB0aGUgc3RyaW5nIHRvIGJlIHF1b3RlZAorCQkgICAgKGMgPj0gMDE3NyAmJiAhYWxsb3dVdGY4KSB8fCByZmM4MjJwaHJhc2UuaW5kZXhPZihjKSA+PSAwKQorCQkvLyBUaGVzZSBjaGFyYWN0ZXJzIGNhdXNlIHRoZSBzdHJpbmcgdG8gYmUgcXVvdGVkCiAgICAgICAgICAgICAgICAgbmVlZFF1b3RpbmcgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5lZWRRdW90aW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiArIDIpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDIpOwogICAgICAgICAgICAgc2IuYXBwZW5kKCciJykuYXBwZW5kKHBocmFzZSkuYXBwZW5kKCciJyk7CiAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICAgICAgfSBlbHNlCkBAIC0zODAsNyArMzg3LDcgQEAKIAkgICAgcyA9IHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKIAkgICAgLy8gY2hlY2sgZm9yIGFueSBlc2NhcGVkIGNoYXJhY3RlcnMKIAkgICAgaWYgKHMuaW5kZXhPZignXFwnKSA+PSAwKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7CS8vIGFwcHJveAorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7CS8vIGFwcHJveAogCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewogCQkgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CiAJCSAgICBpZiAoYyA9PSAnXFwnICYmIGkgPCBzLmxlbmd0aCgpIC0gMSkKQEAgLTM5Niw2ICs0MDMsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBlcXVhbGl0eSBvcGVyYXRvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGEpIHsKIAlpZiAoIShhIGluc3RhbmNlb2YgSW50ZXJuZXRBZGRyZXNzKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDEyLDYgKzQyMCw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2ggY29kZSBmb3IgdGhlIGFkZHJlc3MuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlpZiAoYWRkcmVzcyA9PSBudWxsKQogCSAgICByZXR1cm4gMDsKQEAgLTQzOCw2ICs0NDcsMjIgQEAKICAgICAvKioKICAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBhcnJheSBvZiBJbnRlcm5ldEFkZHJlc3Mgb2JqZWN0cyBpbnRvCiAgICAgICogYSBjb21tYSBzZXBhcmF0ZWQgc2VxdWVuY2Ugb2YgYWRkcmVzcyBzdHJpbmdzLiBUaGUKKyAgICAgKiByZXN1bHRpbmcgc3RyaW5nIGNvbnRhaW5zIFVuaWNvZGUgY2hhcmFjdGVycy4gPHA+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzc2VzCWFycmF5IG9mIEludGVybmV0QWRkcmVzcyBvYmplY3RzCisgICAgICogQGV4Y2VwdGlvbiAJQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIGFueSBhZGRyZXNzIG9iamVjdCBpbiB0aGUgCisgICAgICoJCQlnaXZlbiBhcnJheSBpcyBub3QgYW4gSW50ZXJuZXRBZGRyZXNzIG9iamVjdC4gTm90ZQorICAgICAqCQkJdGhhdCB0aGlzIGlzIGEgUnVudGltZUV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuCQljb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGFkZHJlc3NlcworICAgICAqIEBzaW5jZQkJSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Vbmljb2RlU3RyaW5nKEFkZHJlc3NbXSBhZGRyZXNzZXMpIHsKKwlyZXR1cm4gdG9Vbmljb2RlU3RyaW5nKGFkZHJlc3NlcywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2l2ZW4gYXJyYXkgb2YgSW50ZXJuZXRBZGRyZXNzIG9iamVjdHMgaW50bworICAgICAqIGEgY29tbWEgc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGFkZHJlc3Mgc3RyaW5ncy4gVGhlCiAgICAgICogcmVzdWx0aW5nIHN0cmluZyBjb250YWlucyBvbmx5IFVTLUFTQ0lJIGNoYXJhY3RlcnMsIGFuZAogICAgICAqIGhlbmNlIGlzIG1haWwtc2FmZS4gPHA+CiAgICAgICoKQEAgLTQ4NSw2ICs1MTAsNzggQEAKIAlyZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnaXZlbiBhcnJheSBvZiBJbnRlcm5ldEFkZHJlc3Mgb2JqZWN0cyBpbnRvCisgICAgICogYSBjb21tYSBzZXBhcmF0ZWQgc2VxdWVuY2Ugb2YgYWRkcmVzcyBzdHJpbmdzLiBUaGUKKyAgICAgKiByZXN1bHRpbmcgc3RyaW5nIGNvbnRhaW5zIFVuaWNvZGUgY2hhcmFjdGVycy4gPHA+CisgICAgICoKKyAgICAgKiBUaGUgJ3VzZWQnIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgcG9zaXRpb25zCisgICAgICogYWxyZWFkeSB0YWtlbiB1cCBpbiB0aGUgZmllbGQgaW50byB3aGljaCB0aGUgcmVzdWx0aW5nIGFkZHJlc3MgCisgICAgICogc2VxdWVuY2Ugc3RyaW5nIGlzIHRvIGJlIGluc2VydGVkLiBJdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgCisgICAgICogbGluZS1icmVhayBwb3NpdGlvbnMgaW4gdGhlIHJlc3VsdGluZyBhZGRyZXNzIHNlcXVlbmNlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzZXMJYXJyYXkgb2YgSW50ZXJuZXRBZGRyZXNzIG9iamVjdHMKKyAgICAgKiBAcGFyYW0gdXNlZAludW1iZXIgb2YgY2hhcmFjdGVyIHBvc2l0aW9ucyBhbHJlYWR5IHVzZWQsIGluCisgICAgICoJCQl0aGUgZmllbGQgaW50byB3aGljaCB0aGUgYWRkcmVzcyBzdHJpbmcgaXMgdG8KKyAgICAgKgkJCWJlIGluc2VydGVkLgorICAgICAqIEBleGNlcHRpb24gCUNsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBhbnkgYWRkcmVzcyBvYmplY3QgaW4gdGhlIAorICAgICAqCQkJZ2l2ZW4gYXJyYXkgaXMgbm90IGFuIEludGVybmV0QWRkcmVzcyBvYmplY3QuIE5vdGUKKyAgICAgKgkJCXRoYXQgdGhpcyBpcyBhIFJ1bnRpbWVFeGNlcHRpb24uCisgICAgICogQHJldHVybgkJY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBhZGRyZXNzZXMKKyAgICAgKiBAc2luY2UJCUphdmFNYWlsIDEuNgorICAgICAqLworICAgIC8qCisgICAgICogWFhYIC0gVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBhYm92ZSwgZXhjZXB0IGl0IHVzZXMKKyAgICAgKgkgICAgIHRvVW5pY29kZVN0cmluZyBpbnN0ZWFkIG9mIHRvU3RyaW5nLgorICAgICAqIFhYWCAtIFNpbmNlIHRoZSBsaW5lIGxlbmd0aCByZXN0cmljdGlvbnMgYXJlIGluIGJ5dGVzLCBub3QgY2hhcmFjdGVycywKKyAgICAgKgkgICAgIHdlIGNvbnZlcnQgYWxsIG5vbi1BU0NJSSBhZGRyZXNzZXMgdG8gVVRGLTggYnl0ZSBzdHJpbmdzLAorICAgICAqCSAgICAgd2hpY2ggd2UgdGhlbiBjb252ZXJ0IHRvIElTTy04ODU5LTEgU3RyaW5ncyB3aGVyZSBldmVyeQorICAgICAqCSAgICAgY2hhcmFjdGVyIHJlc3ByZXNlbnRzIG9uZSBVVEYtOCBieXRlLiAgQXQgdGhlIGVuZCB3ZSByZXZlcnNlCisgICAgICoJICAgICB0aGUgY29udmVyc2lvbiB0byBnZXQgYmFjayB0byBhIGNvcnJlY3QgVW5pY29kZSBzdHJpbmcuCisgICAgICoJICAgICBUaGlzIGlzIGEgaGFjayB0byBhbGxvdyBhbGwgdGhlIG90aGVyIGNoYXJhY3Rlci1iYXNlZCBtZXRob2RzCisgICAgICoJICAgICB0byB3b3JrIHByb3Blcmx5IHdpdGggVVRGLTggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Vbmljb2RlU3RyaW5nKEFkZHJlc3NbXSBhZGRyZXNzZXMsIGludCB1c2VkKSB7CisJaWYgKGFkZHJlc3NlcyA9PSBudWxsIHx8IGFkZHJlc3Nlcy5sZW5ndGggPT0gMCkKKwkgICAgcmV0dXJuIG51bGw7CisKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCWJvb2xlYW4gc2F3Tm9uQXNjaWkgPSBmYWxzZTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgeworCSAgICBpZiAoaSAhPSAwKSB7IC8vIG5lZWQgdG8gYXBwZW5kIGNvbW1hCisJCXNiLmFwcGVuZCgiLCAiKTsKKwkJdXNlZCArPSAyOworCSAgICB9CisKKwkgICAgLy8gcHJlZmVyIG5vdCB0byBzcGxpdCBhIHNpbmdsZSBhZGRyZXNzIGFjcm9zcyBsaW5lcyBzbyB1c2VkPTAgYmVsb3cKKwkgICAgU3RyaW5nIGFzID0gKChJbnRlcm5ldEFkZHJlc3MpYWRkcmVzc2VzW2ldKS50b1VuaWNvZGVTdHJpbmcoKTsKKwkgICAgaWYgKE1pbWVVdGlsaXR5LmNoZWNrQXNjaWkoYXMpICE9IE1pbWVVdGlsaXR5LkFMTF9BU0NJSSkgeworCQlzYXdOb25Bc2NpaSA9IHRydWU7CisJCWFzID0gbmV3IFN0cmluZyhhcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSwKKwkgICAgCQkJU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xKTsKKwkgICAgfQorCSAgICBTdHJpbmcgcyA9IE1pbWVVdGlsaXR5LmZvbGQoMCwgYXMpOworCSAgICBpbnQgbGVuID0gbGVuZ3RoT2ZGaXJzdFNlZ21lbnQocyk7IC8vIGxlbmd0aCB0aWxsIENSTEYKKwkgICAgaWYgKHVzZWQgKyBsZW4gPiA3NikgeyAvLyBvdmVyZmxvd3MgLi4uCisJCS8vIHNtYXNoIHRyYWlsaW5nIHNwYWNlIGZyb20gIiwgIiBhYm92ZQorCQlpbnQgY3VybGVuID0gc2IubGVuZ3RoKCk7CisJCWlmIChjdXJsZW4gPiAwICYmIHNiLmNoYXJBdChjdXJsZW4gLSAxKSA9PSAnICcpCisJCSAgICBzYi5zZXRMZW5ndGgoY3VybGVuIC0gMSk7CisJCXNiLmFwcGVuZCgiXHJcblx0Iik7IC8vIC4uIHN0YXJ0IG5ldyBjb250aW51YXRpb24gbGluZQorCQl1c2VkID0gODsgLy8gYWNjb3VudCBmb3IgdGhlIHN0YXJ0aW5nIDx0YWI+IGNoYXIKKwkgICAgfQorCSAgICBzYi5hcHBlbmQocyk7CisJICAgIHVzZWQgPSBsZW5ndGhPZkxhc3RTZWdtZW50KHMsIHVzZWQpOworCX0KKworCVN0cmluZyByZXQgPSBzYi50b1N0cmluZygpOworCWlmIChzYXdOb25Bc2NpaSkKKwkgICAgcmV0ID0gbmV3IFN0cmluZyhyZXQuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xKSwKKwkJCQlTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAJcmV0dXJuIHJldDsKKyAgICB9CisKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBzZWdtZW50IHdpdGhpbiB0aGlzIHN0cmluZy4KICAgICAgKiBJZiBubyBzZWdtZW50cyBleGlzdCwgdGhlIGxlbmd0aCBvZiB0aGUgd2hvbGUgbGluZSBpcyByZXR1cm5lZC4KQEAgLTY5OSw3ICs3OTYsNyBAQAogCWJvb2xlYW4gcm91dGVfYWRkciA9IGZhbHNlOwkvLyBhZGRyZXNzIGNhbWUgZnJvbSByb3V0ZS1hZGRyIHRlcm0KIAlib29sZWFuIHJmYzgyMiA9IGZhbHNlOwkJLy8gbG9va3MgbGlrZSBhbiBSRkM4MjIgYWRkcmVzcwogCWNoYXIgYzsKLQlMaXN0PEludGVybmV0QWRkcmVzcz4gdiA9IG5ldyBBcnJheUxpc3Q8SW50ZXJuZXRBZGRyZXNzPigpOworCUxpc3Q8SW50ZXJuZXRBZGRyZXNzPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJSW50ZXJuZXRBZGRyZXNzIG1hOwogCiAJZm9yIChzdGFydCA9IGVuZCA9IC0xLCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CkBAIC04ODksOCArOTg2LDEwIEBACiAJCWJyZWFrOwogCiAJICAgIGNhc2UgJ1snOgkvLyBhIGRvbWFpbi1saXRlcmFsLCBwcm9iYWJseQotCQlyZmM4MjIgPSB0cnVlOwogCQlpbnQgbGluZGV4ID0gaW5kZXg7CisJCXJmYzgyMiA9IHRydWU7CisJCWlmIChzdGFydCA9PSAtMSkKKwkJICAgIHN0YXJ0ID0gaW5kZXg7CiAJICAgICAgb3V0YjoKIAkJZm9yIChpbmRleCsrOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewogCQkgICAgYyA9IHMuY2hhckF0KGluZGV4KTsKQEAgLTEyNDQsMTIgKzEzNDMsMjIgQEAKIAkJICAgIHRocm93IG5ldyBBZGRyZXNzRXhjZXB0aW9uKAogCQkgICAgICJRdW90ZWQgbG9jYWwgYWRkcmVzcyBjb250YWlucyBuZXdsaW5lIHdpdGhvdXQgd2hpdGVzcGFjZSIsCiAJCQlhZGRyKTsKKwkgICAgfSBlbHNlIGlmIChjID09ICcuJykgeworCQlpZiAoaSA9PSBzdGFydCkKKwkJICAgIHRocm93IG5ldyBBZGRyZXNzRXhjZXB0aW9uKAorCQkJIkxvY2FsIGFkZHJlc3Mgc3RhcnRzIHdpdGggZG90IiwgYWRkcik7CisJCWlmIChsYXN0YyA9PSAnLicpCisJCSAgICB0aHJvdyBuZXcgQWRkcmVzc0V4Y2VwdGlvbigKKwkJCSJMb2NhbCBhZGRyZXNzIGNvbnRhaW5zIGRvdC1kb3QiLCBhZGRyKTsKIAkgICAgfQogCSAgICBpZiAoaW5xdW90ZSkKIAkJY29udGludWU7CiAJICAgIGlmIChjID09ICdAJykgewogCQlpZiAoaSA9PSAwKQogCQkgICAgdGhyb3cgbmV3IEFkZHJlc3NFeGNlcHRpb24oIk1pc3NpbmcgbG9jYWwgbmFtZSIsIGFkZHIpOworCQlpZiAobGFzdGMgPT0gJy4nKQorCQkgICAgdGhyb3cgbmV3IEFkZHJlc3NFeGNlcHRpb24oCisJCQkiTG9jYWwgYWRkcmVzcyBlbmRzIHdpdGggZG90IiwgYWRkcik7CiAJCWJyZWFrOwkJLy8gZG9uZSB3aXRoIGxvY2FsIHBhcnQKIAkgICAgfQogCSAgICBpZiAoYyA8PSAwNDAgfHwgYyA+PSAwMTc3KQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvSW50ZXJuZXRIZWFkZXJzLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQppbmRleCAyNzcyNTIzLi4yMjE2MjIyIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9JbnRlcm5ldEhlYWRlcnMuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE0NSw2ICsxNDUsNyBAQAogCS8qKgogCSAqIFJldHVybiB0aGUgInZhbHVlIiBwYXJ0IG9mIHRoZSBoZWFkZXIgbGluZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewogCSAgICBpbnQgaSA9IGxpbmUuaW5kZXhPZignOicpOwogCSAgICBpZiAoaSA8IDApCkBAIC0yOTcsMTYgKzI5OCwxNCBAQAogICAgICAqCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNAogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHJvdGVjdGVkIExpc3QgaGVhZGVyczsKKyAgICBwcm90ZWN0ZWQgTGlzdDxJbnRlcm5ldEhlYWRlcj4gaGVhZGVyczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBlbXB0eSBJbnRlcm5ldEhlYWRlcnMgb2JqZWN0LiAgUGxhY2Vob2xkZXIgZW50cmllcwogICAgICAqIGFyZSBpbnNlcnRlZCB0byBpbmRpY2F0ZSB0aGUgcHJlZmVycmVkIG9yZGVyIG9mIGhlYWRlcnMuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEludGVybmV0SGVhZGVycygpIHsgCi0gICAJaGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZXJuZXRIZWFkZXI+KDQwKTsgCisgICAJaGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8Pig0MCk7IAogCWhlYWRlcnMuYWRkKG5ldyBJbnRlcm5ldEhlYWRlcigiUmV0dXJuLVBhdGgiLCBudWxsKSk7CiAJaGVhZGVycy5hZGQobmV3IEludGVybmV0SGVhZGVyKCJSZWNlaXZlZCIsIG51bGwpKTsKIAloZWFkZXJzLmFkZChuZXcgSW50ZXJuZXRIZWFkZXIoIlJlc2VudC1EYXRlIiwgbnVsbCkpOwpAQCAtMzU1LDggKzM1NCwzMCBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBhbnkgSS9PIGVycm9yIHJlYWRpbmcgdGhlIHN0cmVhbQogICAgICAqLwogICAgIHB1YmxpYyBJbnRlcm5ldEhlYWRlcnMoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotICAgCWhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVybmV0SGVhZGVyPig0MCk7IAotCWxvYWQoaXMpOworCXRoaXMoaXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gUkZDODIyIG1lc3NhZ2Ugc3RyZWFtIHRpbGwgdGhlIAorICAgICAqIGJsYW5rIGxpbmUgc2VwYXJhdGluZyB0aGUgaGVhZGVyIGZyb20gdGhlIGJvZHkuIFRoZSBpbnB1dCAKKyAgICAgKiBzdHJlYW0gaXMgbGVmdCBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgYm9keS4gVGhlIAorICAgICAqIGhlYWRlciBsaW5lcyBhcmUgc3RvcmVkIGludGVybmFsbHkuIDxwPgorICAgICAqCisgICAgICogRm9yIGVmZmljaWVuY3ksIHdyYXAgYSBCdWZmZXJlZElucHV0U3RyZWFtIGFyb3VuZCB0aGUgYWN0dWFsCisgICAgICogaW5wdXQgc3RyZWFtIGFuZCBwYXNzIGl0IGFzIHRoZSBwYXJhbWV0ZXIuIDxwPgorICAgICAqCisgICAgICogTm8gcGxhY2Vob2xkZXIgZW50cmllcyBhcmUgaW5zZXJ0ZWQ7IHRoZSBvcmlnaW5hbCBvcmRlciBvZgorICAgICAqIHRoZSBoZWFkZXJzIGlzIHByZXNlcnZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbQlpcyAJUkZDODIyIGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbQlhbGxvd3V0ZjggCWlmIFVURi04IGVuY29kZWQgaGVhZGVycyBhcmUgYWxsb3dlZAorICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBhbnkgSS9PIGVycm9yIHJlYWRpbmcgdGhlIHN0cmVhbQorICAgICAqIEBzaW5jZQkJSmF2YU1haWwgMS42CisgICAgICovCisgICAgcHVibGljIEludGVybmV0SGVhZGVycyhJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBhbGxvd3V0ZjgpCisJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CisgICAJaGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8Pig0MCk7IAorCWxvYWQoaXMsIGFsbG93dXRmOCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzQsMTMgKzM5NSwzNCBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBhbnkgSS9PIGVycm9yIHJlYWRpbmcgdGhlIHN0cmVhbQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworCWxvYWQoaXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuZCBwYXJzZSB0aGUgZ2l2ZW4gUkZDODIyIG1lc3NhZ2Ugc3RyZWFtIHRpbGwgdGhlCisgICAgICogYmxhbmsgbGluZSBzZXBhcmF0aW5nIHRoZSBoZWFkZXIgZnJvbSB0aGUgYm9keS4gU3RvcmUgdGhlCisgICAgICogaGVhZGVyIGxpbmVzIGluc2lkZSB0aGlzIEludGVybmV0SGVhZGVycyBvYmplY3QuIFRoZSBvcmRlcgorICAgICAqIG9mIGhlYWRlciBsaW5lcyBpcyBwcmVzZXJ2ZWQuIDxwPgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBoZWFkZXIgbGluZXMgYXJlIGFkZGVkIGludG8gdGhpcyBJbnRlcm5ldEhlYWRlcnMKKyAgICAgKiBvYmplY3QsIHNvIGFueSBleGlzdGluZyBoZWFkZXJzIGluIHRoaXMgb2JqZWN0IHdpbGwgbm90IGJlCisgICAgICogYWZmZWN0ZWQuICBIZWFkZXJzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBleGlzdGluZyBsaXN0CisgICAgICogb2YgaGVhZGVycywgaW4gb3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0JaXMgCVJGQzgyMiBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0JYWxsb3d1dGY4IAlpZiBVVEYtOCBlbmNvZGVkIGhlYWRlcnMgYXJlIGFsbG93ZWQKKyAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgYW55IEkvTyBlcnJvciByZWFkaW5nIHRoZSBzdHJlYW0KKyAgICAgKiBAc2luY2UJCUphdmFNYWlsIDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaXMsIGJvb2xlYW4gYWxsb3d1dGY4KQorCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCS8vIFJlYWQgaGVhZGVyIGxpbmVzIHVudGlsIGEgYmxhbmsgbGluZS4gSXQgaXMgdmFsaWQKIAkvLyB0byBoYXZlIEJvZHlQYXJ0cyB3aXRoIG5vIGhlYWRlciBsaW5lcy4KIAlTdHJpbmcgbGluZTsKLQlMaW5lSW5wdXRTdHJlYW0gbGlzID0gbmV3IExpbmVJbnB1dFN0cmVhbShpcyk7CisJTGluZUlucHV0U3RyZWFtIGxpcyA9IG5ldyBMaW5lSW5wdXRTdHJlYW0oaXMsIGFsbG93dXRmOCk7CiAJU3RyaW5nIHByZXZsaW5lID0gbnVsbDsJLy8gdGhlIHByZXZpb3VzIGhlYWRlciBsaW5lLCBhcyBhIHN0cmluZwogCS8vIGEgYnVmZmVyIHRvIGFjY3VtdWxhdGUgdGhlIGhlYWRlciBpbiwgd2hlbiB3ZSBrbm93IGl0J3MgbmVlZGVkCi0JU3RyaW5nQnVmZmVyIGxpbmVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBsaW5lQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogCXRyeSB7CiAJICAgIC8vIGlmIHRoZSBmaXJzdCBsaW5lIGJlaW5nIHJlYWQgaXMgYSBjb250aW51YXRpb24gbGluZSwKQEAgLTQ0MCwxMCArNDgyLDkgQEAKICAgICAgKiBAcmV0dXJuCQlhcnJheSBvZiBoZWFkZXIgdmFsdWVzLCBvciBudWxsIGlmIG5vbmUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJSXRlcmF0b3I8SW50ZXJuZXRIZWFkZXI+IGUgPSBoZWFkZXJzLml0ZXJhdG9yKCk7CiAJLy8gWFhYIC0gc2hvdWxkIHdlIGp1c3Qgc3RlcCB0aHJvdWdoIGluIGluZGV4IG9yZGVyPwotCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IC8vIGFjY3VtdWxhdGUgcmV0dXJuIHZhbHVlcworCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7IC8vIGFjY3VtdWxhdGUgcmV0dXJuIHZhbHVlcwogCiAJd2hpbGUgKGUuaGFzTmV4dCgpKSB7CiAJICAgIEludGVybmV0SGVhZGVyIGggPSBlLm5leHQoKTsKQEAgLTQ4MCw3ICs1MjEsNyBAQAogCWlmICgocy5sZW5ndGggPT0gMSkgfHwgZGVsaW1pdGVyID09IG51bGwpCiAJICAgIHJldHVybiBzWzBdOwogCQotCVN0cmluZ0J1ZmZlciByID0gbmV3IFN0cmluZ0J1ZmZlcihzWzBdKTsKKwlTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcihzWzBdKTsKIAlmb3IgKGludCBpID0gMTsgaSA8IHMubGVuZ3RoOyBpKyspIHsKIAkgICAgci5hcHBlbmQoZGVsaW1pdGVyKTsKIAkgICAgci5hcHBlbmQoc1tpXSk7CkBAIC01MDIsNyArNTQzLDcgQEAKIAlib29sZWFuIGZvdW5kID0gZmFsc2U7CiAKIAlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IChJbnRlcm5ldEhlYWRlciloZWFkZXJzLmdldChpKTsKKwkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IGhlYWRlcnMuZ2V0KGkpOwogCSAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKGguZ2V0TmFtZSgpKSkgewogCQlpZiAoIWZvdW5kKSB7CiAJCSAgICBpbnQgajsKQEAgLTU0MCw3ICs1ODEsNiBAQAogICAgICAqIEBwYXJhbQluYW1lCWhlYWRlciBuYW1lCiAgICAgICogQHBhcmFtCXZhbHVlCWhlYWRlciB2YWx1ZQogICAgICAqLyAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogCWludCBwb3MgPSBoZWFkZXJzLnNpemUoKTsKIAlib29sZWFuIGFkZFJldmVyc2UgPQpAQCAtNTQ5LDcgKzU4OSw3IEBACiAJaWYgKGFkZFJldmVyc2UpCiAJICAgIHBvcyA9IDA7CiAJZm9yIChpbnQgaSA9IGhlYWRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IChJbnRlcm5ldEhlYWRlciloZWFkZXJzLmdldChpKTsKKwkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IGhlYWRlcnMuZ2V0KGkpOwogCSAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKGguZ2V0TmFtZSgpKSkgewogCQlpZiAoYWRkUmV2ZXJzZSkgewogCQkgICAgcG9zID0gaTsKQEAgLTU3MSw3ICs2MTEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcihTdHJpbmcgbmFtZSkgeyAKIAlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKLQkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IChJbnRlcm5ldEhlYWRlciloZWFkZXJzLmdldChpKTsKKwkgICAgSW50ZXJuZXRIZWFkZXIgaCA9IGhlYWRlcnMuZ2V0KGkpOwogCSAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKGguZ2V0TmFtZSgpKSkgewogCQloLmxpbmUgPSBudWxsOwogCQkvL2hlYWRlcnMucmVtb3ZlKGkpOwpAQCAtNTg2LDggKzYyNiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIEhlYWRlciBvYmplY3RzCQogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEhlYWRlcnMoKSB7CisgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0QWxsSGVhZGVycygpIHsKIAlyZXR1cm4gKG5ldyBNYXRjaEhlYWRlckVudW0oaGVhZGVycywgbnVsbCwgZmFsc2UpKTsKICAgICB9CiAKQEAgLTU5Nyw4ICs2MzYsNyBAQAogICAgICAqIEBwYXJhbQluYW1lcwl0aGUgaGVhZGVycyB0byByZXR1cm4KICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIG1hdGNoaW5nIEhlYWRlciBvYmplY3RzCQogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykgeworICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxIZWFkZXI+IGdldE1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykgewogCXJldHVybiAobmV3IE1hdGNoSGVhZGVyRW51bShoZWFkZXJzLCBuYW1lcywgdHJ1ZSkpOwogICAgIH0KIApAQCAtNjA4LDggKzY0Niw3IEBACiAgICAgICogQHBhcmFtCW5hbWVzCXRoZSBoZWFkZXJzIHRvIG5vdCByZXR1cm4KICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIG5vbi1tYXRjaGluZyBIZWFkZXIgb2JqZWN0cwkKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXROb25NYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpIHsKKyAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXROb25NYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpIHsKIAlyZXR1cm4gKG5ldyBNYXRjaEhlYWRlckVudW0oaGVhZGVycywgbmFtZXMsIGZhbHNlKSk7CiAgICAgfQogCkBAIC02MjMsMTMgKzY2MCwxMSBAQAogICAgICAqCiAgICAgICogQHBhcmFtCWxpbmUJcmF3IFJGQzgyMiBoZWFkZXIgbGluZQogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlckxpbmUoU3RyaW5nIGxpbmUpIHsKIAl0cnkgewogCSAgICBjaGFyIGMgPSBsaW5lLmNoYXJBdCgwKTsKIAkgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykgewotCQlJbnRlcm5ldEhlYWRlciBoID0KLQkJICAgIChJbnRlcm5ldEhlYWRlciloZWFkZXJzLmdldChoZWFkZXJzLnNpemUoKSAtIDEpOworCQlJbnRlcm5ldEhlYWRlciBoID0gaGVhZGVycy5nZXQoaGVhZGVycy5zaXplKCkgLSAxKTsKIAkJaC5saW5lICs9ICJcclxuIiArIGxpbmU7CiAJICAgIH0gZWxzZQogCQloZWFkZXJzLmFkZChuZXcgSW50ZXJuZXRIZWFkZXIobGluZSkpOwpAQCAtNjQ2LDggKzY4MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIFN0cmluZ3Mgb2YgYWxsIGhlYWRlciBsaW5lcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEhlYWRlckxpbmVzKCkgeyAKKyAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBbGxIZWFkZXJMaW5lcygpIHsgCiAJcmV0dXJuIChnZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKG51bGwpKTsKICAgICB9CiAKQEAgLTY1Nyw4ICs2OTEsNyBAQAogICAgICAqIEBwYXJhbQluYW1lcwl0aGUgaGVhZGVycyB0byByZXR1cm4KICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIFN0cmluZ3Mgb2YgYWxsIG1hdGNoaW5nIGhlYWRlciBsaW5lcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpIHsKKyAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRNYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKSB7CiAJcmV0dXJuIChuZXcgTWF0Y2hTdHJpbmdFbnVtKGhlYWRlcnMsIG5hbWVzLCB0cnVlKSk7CQogICAgIH0KIApAQCAtNjY4LDggKzcwMSw3IEBACiAgICAgICogQHBhcmFtCW5hbWVzCXRoZSBoZWFkZXJzIHRvIG5vdCByZXR1cm4KICAgICAgKiBAcmV0dXJuCUVudW1lcmF0aW9uIG9mIFN0cmluZ3Mgb2YgYWxsIG5vbi1tYXRjaGluZyBoZWFkZXIgbGluZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKSB7CisgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykgewogCXJldHVybiAobmV3IE1hdGNoU3RyaW5nRW51bShoZWFkZXJzLCBuYW1lcywgZmFsc2UpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NYWlsRGF0ZUZvcm1hdC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWFpbERhdGVGb3JtYXQuamF2YQppbmRleCBlM2NjNDE0Li5kMjc3MWFiIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NYWlsRGF0ZUZvcm1hdC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01haWxEYXRlRm9ybWF0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247CkBAIC0xOTcsMTEgKzE5OCwxMiBAQAogICAgICAqIE92ZXJyaWRlcyBDbG9uZWFibGUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZQorICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjYKICAgICAgKi8KLS8vICAgIEBPdmVycmlkZQotLy8gICAgcHVibGljIE1haWxEYXRlRm9ybWF0IGNsb25lKCkgewotLy8gICAgICAgIHJldHVybiAoTWFpbERhdGVGb3JtYXQpIHN1cGVyLmNsb25lKCk7Ci0vLyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1haWxEYXRlRm9ybWF0IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE1haWxEYXRlRm9ybWF0KSBzdXBlci5jbG9uZSgpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZvcm1hdHMgdGhlIGdpdmVuIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgCkBAIC0yNzksMjQgKzI4MSwyNiBAQAogICAgICAqIGJlIHVzZWQgYmVjYXVzZSBSRkMgMjgyMiBtYW5kYXRlcyBhIHNwZWNpZmljIHBhdHRlcm4uCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42CiAgICAgICovCi0vLyAgICBAT3ZlcnJpZGUKLS8vICAgIHB1YmxpYyB2b2lkIGFwcGx5TG9jYWxpemVkUGF0dGVybihTdHJpbmcgcGF0dGVybikgewotLy8gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICIKLS8vICAgICAgICAgICAgICAgICsgImFwcGx5TG9jYWxpemVkUGF0dGVybigpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKLS8vICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcHBseUxvY2FsaXplZFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2QgIgorICAgICAgICAgICAgICAgICsgImFwcGx5TG9jYWxpemVkUGF0dGVybigpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFuZCBzaG91bGQgbm90CiAgICAgICogYmUgdXNlZCBiZWNhdXNlIFJGQyAyODIyIG1hbmRhdGVzIGEgc3BlY2lmaWMgcGF0dGVybi4KICAgICAgKgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAorICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjYKICAgICAgKi8KLS8vICAgIEBPdmVycmlkZQotLy8gICAgcHVibGljIHZvaWQgYXBwbHlQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0vLyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2QgIgotLy8gICAgICAgICAgICAgICAgKyAiYXBwbHlQYXR0ZXJuKCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOwotLy8gICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFwcGx5UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiCisgICAgICAgICAgICAgICAgKyAiYXBwbHlQYXR0ZXJuKCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyBzZXJpYWxpemF0aW9uIHRvIGNoYW5nZSB0aGUgcGF0dGVybi4KQEAgLTMxMywxMiArMzE3LDEzIEBACiAgICAgICogQHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIDEwMC15ZWFyIHBlcmlvZCBpbnRvIHdoaWNoIHR3byBkaWdpdCB5ZWFycyBhcmUKICAgICAgKiBwYXJzZWQKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42CiAgICAgICovCi0vLyAgICBAT3ZlcnJpZGUKLS8vICAgIHB1YmxpYyBEYXRlIGdldDJEaWdpdFllYXJTdGFydCgpIHsKLS8vICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiCi0vLyAgICAgICAgICAgICAgICArICJnZXQyRGlnaXRZZWFyU3RhcnQoKSBzaG91bGRuJ3QgYmUgY2FsbGVkIik7Ci0vLyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGUgZ2V0MkRpZ2l0WWVhclN0YXJ0KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiCisgICAgICAgICAgICAgICAgKyAiZ2V0MkRpZ2l0WWVhclN0YXJ0KCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYW5kIHNob3VsZCBub3QKQEAgLTMyNiwyNCArMzMxLDI2IEBACiAgICAgICogMi1kaWdpdHMgeWVhcnMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42CiAgICAgICovCi0vLyAgICBAT3ZlcnJpZGUKLS8vICAgIHB1YmxpYyB2b2lkIHNldDJEaWdpdFllYXJTdGFydChEYXRlIHN0YXJ0RGF0ZSkgewotLy8gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICIKLS8vICAgICAgICAgICAgICAgICsgInNldDJEaWdpdFllYXJTdGFydCgpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKLS8vICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXQyRGlnaXRZZWFyU3RhcnQoRGF0ZSBzdGFydERhdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2QgIgorICAgICAgICAgICAgICAgICsgInNldDJEaWdpdFllYXJTdGFydCgpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFuZCBzaG91bGQgbm90CiAgICAgICogYmUgdXNlZCBiZWNhdXNlIFJGQyAyODIyIG1hbmRhdGVzIHNwZWNpZmljIGRhdGUgZm9ybWF0IHN5bWJvbHMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS42CiAgICAgICovCi0vLyAgICBAT3ZlcnJpZGUKLS8vICAgIHB1YmxpYyB2b2lkIHNldERhdGVGb3JtYXRTeW1ib2xzKERhdGVGb3JtYXRTeW1ib2xzIG5ld0Zvcm1hdFN5bWJvbHMpIHsKLS8vICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiCi0vLyAgICAgICAgICAgICAgICArICJzZXREYXRlRm9ybWF0U3ltYm9scygpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKLS8vICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlRm9ybWF0U3ltYm9scyhEYXRlRm9ybWF0U3ltYm9scyBuZXdGb3JtYXRTeW1ib2xzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kICIKKyAgICAgICAgICAgICAgICArICJzZXREYXRlRm9ybWF0U3ltYm9scygpIHNob3VsZG4ndCBiZSBjYWxsZWQiKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkYXRlLCBhcyBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlcnMuCkBAIC00MjAsOCArNDI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiQmFkIGRhdGU6ICciICsgdGV4dCArICInIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcy5zZXRFcnJvckluZGV4KHBvcy5nZXRJbmRleCgpKTsKLSAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IERhdGVGb3JtYXQ6OnBhcnNlIGZyb20gdGhyb3dpbmcgUGFyc2VFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgcG9zLnNldEluZGV4KHN0YXJ0UG9zaXRpb24gKyAxKTsKKyAgICAgICAgICAgICAgICBwb3Muc2V0SW5kZXgoc3RhcnRQb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVCb2R5UGFydC5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZUJvZHlQYXJ0LmphdmEKaW5kZXggY2NmNDkyYS4uZTA0Y2JlOSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZUJvZHlQYXJ0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZUJvZHlQYXJ0LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00NCw3ICs0NCwxMiBAQAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uKjsKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Qcm9wVXRpbDsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5BU0NJSVV0aWxpdHk7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWltZVV0aWw7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTWVzc2FnZVJlbW92ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Gb2xkZXJDbG9zZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5MaW5lT3V0cHV0U3RyZWFtOwogCiAvKioKICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIE1JTUUgYm9keSBwYXJ0LiBJdCBpbXBsZW1lbnRzIHRoZSAKQEAgLTk3LDYgKzEwMiw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpZ25vcmVNdWx0aXBhcnRFbmNvZGluZyA9CiAJUHJvcFV0aWwuZ2V0Qm9vbGVhblN5c3RlbVByb3BlcnR5KAogCSAgICAibWFpbC5taW1lLmlnbm9yZW11bHRpcGFydGVuY29kaW5nIiwgdHJ1ZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBhbGxvd3V0ZjggPQorCVByb3BVdGlsLmdldEJvb2xlYW5TeXN0ZW1Qcm9wZXJ0eSgibWFpbC5taW1lLmFsbG93dXRmOCIsIHRydWUpOwogCiAgICAgLy8gUGFyYW5vaWE6CiAgICAgLy8gYWxsb3cgdGhpcyBsYXN0IG1pbnV0ZSBjaGFuZ2UgdG8gYmUgZGlzYWJsZWQgaWYgaXQgY2F1c2VzIHByb2JsZW1zCkBAIC0yMjUsNiArMjMyLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gc2l6ZSBpbiBieXRlcywgb3IgLTEgaWYgbm90IGtub3duCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGNvbnRlbnQgIT0gbnVsbCkKIAkgICAgcmV0dXJuIGNvbnRlbnQubGVuZ3RoOwpAQCAtMjU0LDYgKzI2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBsaW5lcywgb3IgLTEgaWYgbm90IGtub3duCiAgICAgICovICAKKyAgICBAT3ZlcnJpZGUKICAgICAgcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gLTE7CiAgICAgIH0KQEAgLTI2OSw2ICsyNzgsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybglDb250ZW50LVR5cGUgb2YgdGhpcyBib2R5IHBhcnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJU3RyaW5nIHMgPSBnZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIG51bGwpOwogCXMgPSBNaW1lVXRpbC5jbGVhbkNvbnRlbnRUeXBlKHRoaXMsIHMpOwpAQCAtMjkzLDYgKzMwMyw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGlzTWltZVR5cGUodGhpcywgbWltZVR5cGUpOwogICAgIH0KQEAgLTMxMSw2ICszMjIsNyBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqIEBzZWUgI2hlYWRlcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3Bvc2l0aW9uKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGdldERpc3Bvc2l0aW9uKHRoaXMpOwogICAgIH0KQEAgLTMyNiw2ICszMzgsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlzZXREaXNwb3NpdGlvbih0aGlzLCBkaXNwb3NpdGlvbik7CiAgICAgfQpAQCAtMzQxLDYgKzM1NCw3IEBACiAgICAgICoKICAgICAgKiBAc2VlICNoZWFkZXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBnZXRFbmNvZGluZyh0aGlzKTsKICAgICB9CkBAIC0zNTMsNiArMzY3LDcgQEAKICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPGNvZGU+Z2V0SGVhZGVyKG5hbWUpPC9jb2RlPgogICAgICAqIHRvIG9idGFpbiB0aGUgcmVxdWlzaXRlIGhlYWRlciBmaWVsZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRJRCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBnZXRIZWFkZXIoIkNvbnRlbnQtSWQiLCBudWxsKTsKICAgICB9CkBAIC0zODUsNiArNDAwLDcgQEAKICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPGNvZGU+Z2V0SGVhZGVyKG5hbWUpPC9jb2RlPgogICAgICAqIHRvIG9idGFpbiB0aGUgcmVxdWlzaXRlIGhlYWRlciBmaWVsZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRNRDUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LU1ENSIsIG51bGwpOwogICAgIH0KQEAgLTM5Nyw2ICs0MTMsNyBAQAogICAgICAqIEBleGNlcHRpb24JSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgYm9keSBwYXJ0IGlzCiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TUQ1KFN0cmluZyBtZDUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldEhlYWRlcigiQ29udGVudC1NRDUiLCBtZDUpOwogICAgIH0KQEAgLTQxMCw2ICs0MjcsNyBAQAogICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyA8Y29kZT5nZXRIZWFkZXIobmFtZSk8L2NvZGU+CiAgICAgICogdG8gb2J0YWluIHRoZSByZXF1aXNpdGUgaGVhZGVyIGZpZWxkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50TGFuZ3VhZ2UoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0Q29udGVudExhbmd1YWdlKHRoaXMpOwogICAgIH0KQEAgLTQyMCw2ICs0MzgsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGxhbmd1YWdlcyAJYXJyYXkgb2YgbGFuZ3VhZ2UgdGFncwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMYW5ndWFnZShTdHJpbmdbXSBsYW5ndWFnZXMpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlzZXRDb250ZW50TGFuZ3VhZ2UodGhpcywgbGFuZ3VhZ2VzKTsKQEAgLTQ0MCw2ICs0NTksNyBAQAogICAgICAqIAogICAgICAqIEByZXR1cm4JY29udGVudCBkZXNjcmlwdGlvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0RGVzY3JpcHRpb24odGhpcyk7CiAgICAgfQpAQCAtNDY5LDYgKzQ4OSw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICBpbiB0aGUgZXhjZXB0aW9uIGNoYWluIGlmIHRoZSBjaGFyc2V0CiAgICAgICogICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIGZhaWxzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwogICAgIH0KQEAgLTUyMyw2ICs1NDQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybglmaWxlbmFtZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0RmlsZU5hbWUodGhpcyk7CiAgICAgfQpAQCAtNTUwLDYgKzU3Miw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldEZpbGVOYW1lKHRoaXMsIGZpbGVuYW1lKTsKICAgICB9CkBAIC01NjksNiArNTkyLDcgQEAKICAgICAgKiBAc2VlCSNnZXRDb250ZW50U3RyZWFtCiAgICAgICogQHNlZSAJamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciNnZXRJbnB1dFN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIAogCQl0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGdldERhdGFIYW5kbGVyKCkuZ2V0SW5wdXRTdHJlYW0oKTsKQEAgLTYyMiw2ICs2NDYsNyBAQAogICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiBNaW1lTWVzc2FnZS4KICAgICAgKiBAc2VlCU1pbWVNZXNzYWdlI2dldERhdGFIYW5kbGVyCiAgICAgICovICAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0RGF0YUhhbmRsZXIoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoZGggPT0gbnVsbCkKIAkgICAgZGggPSBuZXcgTWltZVBhcnREYXRhSGFuZGxlcih0aGlzKTsKQEAgLTY0OSw2ICs2NzQsNyBAQAogICAgICAqCQkJamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqIEBleGNlcHRpb24gICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLyAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmIChjYWNoZWRDb250ZW50ICE9IG51bGwpCiAJICAgIHJldHVybiBjYWNoZWRDb250ZW50OwpAQCAtNjg0LDYgKzcxMCw3IEBACiAgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBib2R5IHBhcnQgaXMKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqLyAgICAgICAgICAgICAgICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGgpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAl0aGlzLmRoID0gZGg7CkBAIC03MDksNiArNzM2LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGJvZHkgcGFydCBpcwogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChPYmplY3QgbywgU3RyaW5nIHR5cGUpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAobyBpbnN0YW5jZW9mIE11bHRpcGFydCkgewpAQCAtNzM3LDYgKzc2NSw3IEBACiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24JaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICogQHNlZQkjc2V0VGV4dChTdHJpbmcgdGV4dCwgU3RyaW5nIGNoYXJzZXQpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc2V0VGV4dCh0ZXh0LCBudWxsKTsKICAgICB9CkBAIC03NTIsNiArNzgxLDcgQEAKICAgICAgKiBAcGFyYW0JY2hhcnNldAl0aGUgY2hhcnNldCB0byB1c2UgZm9yIHRoZSB0ZXh0CiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24JaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCwgU3RyaW5nIGNoYXJzZXQpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlzZXRUZXh0KHRoaXMsIHRleHQsIGNoYXJzZXQsICJwbGFpbiIpOwpAQCAtNzcwLDYgKzgwMCw3IEBACiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24JaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICogQHNpbmNlCUphdmFNYWlsIDEuNAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQsIFN0cmluZyBjaGFyc2V0LCBTdHJpbmcgc3VidHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldFRleHQodGhpcywgdGV4dCwgY2hhcnNldCwgc3VidHlwZSk7CkBAIC03ODUsNiArODE2LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGJvZHkgcGFydCBpcwogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChNdWx0aXBhcnQgbXApIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldERhdGFIYW5kbGVyKG5ldyBEYXRhSGFuZGxlcihtcCwgbXAuZ2V0Q29udGVudFR5cGUoKSkpOwogCW1wLnNldFBhcmVudCh0aGlzKTsKQEAgLTg5MSwxMSArOTIzLDEzIEBACiAJfQogCiAJLy8gb3ZlcnJpZGVzIERhdGFTb3VyY2UuZ2V0Q29udGVudFR5cGUoKQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CiAJICAgIHJldHVybiBjb250ZW50VHlwZSAhPSBudWxsID8gY29udGVudFR5cGUgOiBzdXBlci5nZXRDb250ZW50VHlwZSgpOwogCX0KIAogCS8vIGltcGxlbWVudHMgRW5jb2RpbmdBd2FyZS5nZXRFbmNvZGluZygpCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKIAkgICAgcmV0dXJuIGVuY29kaW5nOwogCX0KQEAgLTk1Niw2ICs5OTAsNyBAQAogICAgICAqIEBleGNlcHRpb24gTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciN3cml0ZVRvCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCXdyaXRlVG8odGhpcywgb3MsIG51bGwpOwpAQCAtOTcwLDYgKzEwMDUsNyBAQAogICAgICAqIEByZXR1cm4gIGFycmF5IG9mIGhlYWRlcnMKICAgICAgKiBAc2VlICAgICBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVVdGlsaXR5CiAgICAgICovICAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRIZWFkZXIobmFtZSk7CiAgICAgfQpAQCAtOTg2LDYgKzEwMjIsNyBAQAogICAgICAqCQkJCXRoaXMgbmFtZQogICAgICAqIEBleGNlcHRpb24gICAgICAgCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlbGltaXRlcikKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRIZWFkZXIobmFtZSwgZGVsaW1pdGVyKTsKQEAgLTEwMDIsNiArMTAzOSw3IEBACiAgICAgICogQHBhcmFtICAgdmFsdWUgICBoZWFkZXIgdmFsdWUKICAgICAgKiBAc2VlICAgICBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVVdGlsaXR5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWhlYWRlcnMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKQEAgLTEwMTcsNiArMTA1NSw3IEBACiAgICAgICogQHBhcmFtICAgdmFsdWUgICBoZWFkZXIgdmFsdWUKICAgICAgKiBAc2VlICAgICBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVVdGlsaXR5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWhlYWRlcnMuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsgICAgCkBAIC0xMDI1LDYgKzEwNjQsNyBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZSBhbGwgaGVhZGVycyB3aXRoIHRoaXMgbmFtZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXIoU3RyaW5nIG5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWhlYWRlcnMucmVtb3ZlSGVhZGVyKG5hbWUpOwogICAgIH0KQEAgLTEwMzMsOCArMTA3Myw4IEBACiAgICAgICogUmV0dXJuIGFsbCB0aGUgaGVhZGVycyBmcm9tIHRoaXMgTWVzc2FnZSBhcyBhbiBFbnVtZXJhdGlvbiBvZgogICAgICAqIEhlYWRlciBvYmplY3RzLgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEhlYWRlcnMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRBbGxIZWFkZXJzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwogICAgIH0KICAgIApAQCAtMTA0Miw4ICsxMDgyLDggQEAKICAgICAgKiBSZXR1cm4gbWF0Y2hpbmcgaGVhZGVycyBmcm9tIHRoaXMgTWVzc2FnZSBhcyBhbiBFbnVtZXJhdGlvbiBvZgogICAgICAqIEhlYWRlciBvYmplY3RzLgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXRNYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlcnMobmFtZXMpOwogICAgIH0KQEAgLTEwNTIsOCArMTA5Miw4IEBACiAgICAgICogUmV0dXJuIG5vbi1tYXRjaGluZyBoZWFkZXJzIGZyb20gdGhpcyBNZXNzYWdlIGFzIGFuCiAgICAgICogRW51bWVyYXRpb24gb2YgSGVhZGVyIG9iamVjdHMuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxIZWFkZXI+IGdldE5vbk1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBoZWFkZXJzLmdldE5vbk1hdGNoaW5nSGVhZGVycyhuYW1lcyk7CiAgICAgfQpAQCAtMTA2MSw2ICsxMTAxLDcgQEAKICAgICAvKioKICAgICAgKiBBZGQgYSBoZWFkZXIgbGluZSB0byB0aGlzIGJvZHkgcGFydAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlckxpbmUoU3RyaW5nIGxpbmUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWhlYWRlcnMuYWRkSGVhZGVyTGluZShsaW5lKTsKICAgICB9CkBAIC0xMDcwLDggKzExMTEsOCBAQAogICAgICAqIGxpbmUgaXMgYSByYXcgUkZDIDgyMiBoZWFkZXIgbGluZSwgY29udGFpbmluZyBib3RoIHRoZSAibmFtZSIKICAgICAgKiBhbmQgInZhbHVlIiBmaWVsZC4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxIZWFkZXJMaW5lcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEFsbEhlYWRlckxpbmVzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAgIAlyZXR1cm4gaGVhZGVycy5nZXRBbGxIZWFkZXJMaW5lcygpOyAKICAgICB9CiAgCkBAIC0xMDgwLDggKzExMjEsOCBAQAogICAgICAqIEEgSGVhZGVyIGxpbmUgaXMgYSByYXcgUkZDIDgyMiBoZWFkZXIgbGluZSwgY29udGFpbmluZyBib3RoCiAgICAgICogdGhlICJuYW1lIiBhbmQgInZhbHVlIiBmaWVsZC4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlckxpbmVzKG5hbWVzKTsKICAgICB9CkBAIC0xMDkxLDggKzExMzIsOCBAQAogICAgICAqIEEgSGVhZGVyIGxpbmUgaXMgYSByYXcgUkZDIDgyMiBoZWFkZXIgbGluZSwgY29udGFpbmluZyBib3RoCiAgICAgICogdGhlICJuYW1lIiAgYW5kICJ2YWx1ZSIgZmllbGQuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE5vbk1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKG5hbWVzKTsKICAgICB9CkBAIC0xMzM2LDcgKzEzNzcsNyBAQAogCiAJLy8gVG9rZW5pemUgdGhlIGhlYWRlciB0byBvYnRhaW4gdGhlIExhbmd1YWdlLXRhZ3MgKHNraXAgY29tbWVudHMpCiAJSGVhZGVyVG9rZW5pemVyIGggPSBuZXcgSGVhZGVyVG9rZW5pemVyKHMsIEhlYWRlclRva2VuaXplci5NSU1FKTsKLQlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAlIZWFkZXJUb2tlbml6ZXIuVG9rZW4gdGs7CiAJaW50IHRrVHlwZTsKQEAgLTEzNjIsNyArMTQwMyw3IEBACiAKICAgICBzdGF0aWMgdm9pZCBzZXRDb250ZW50TGFuZ3VhZ2UoTWltZVBhcnQgcGFydCwgU3RyaW5nW10gbGFuZ3VhZ2VzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsYW5ndWFnZXNbMF0pOworCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsYW5ndWFnZXNbMF0pOwogCWludCBsZW4gPSAiQ29udGVudC1MYW5ndWFnZSIubGVuZ3RoKCkgKyAyICsgbGFuZ3VhZ2VzWzBdLmxlbmd0aCgpOwogCWZvciAoaW50IGkgPSAxOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7CiAJICAgIHNiLmFwcGVuZCgnLCcpOwpAQCAtMTM4NCw2ICsxNDI1LDggQEAKIAkgICAgcmV0dXJuIG51bGw7CiAKIAlzID0gcy50cmltKCk7CS8vIGdldCByaWQgb2YgdHJhaWxpbmcgc3BhY2VzCisJaWYgKHMubGVuZ3RoKCkgPT0gMCkKKwkgICAgcmV0dXJuIG51bGw7CiAJLy8gcXVpY2sgY2hlY2sgZm9yIGtub3duIHZhbHVlcyB0byBhdm9pZCB1bm5lY2Vzc2FyeSB1c2UKIAkvLyBvZiB0b2tlbml6ZXIuCiAJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZSgiN2JpdCIpIHx8IHMuZXF1YWxzSWdub3JlQ2FzZSgiOGJpdCIpIHx8CkBAIC0xNjA5LDExICsxNjUyLDEwIEBACiAJaWYgKG9zIGluc3RhbmNlb2YgTGluZU91dHB1dFN0cmVhbSkgewogCSAgICBsb3MgPSAoTGluZU91dHB1dFN0cmVhbSkgb3M7CiAJfSBlbHNlIHsKLQkgICAgbG9zID0gbmV3IExpbmVPdXRwdXRTdHJlYW0ob3MpOworCSAgICBsb3MgPSBuZXcgTGluZU91dHB1dFN0cmVhbShvcywgYWxsb3d1dGY4KTsKIAl9CiAKIAkvLyBGaXJzdCwgd3JpdGUgb3V0IHRoZSBoZWFkZXIKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlFbnVtZXJhdGlvbjxTdHJpbmc+IGhkckxpbmVzCiAJCT0gcGFydC5nZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKGlnbm9yZUxpc3QpOwogCXdoaWxlIChoZHJMaW5lcy5oYXNNb3JlRWxlbWVudHMoKSkKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVNZXNzYWdlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lTWVzc2FnZS5qYXZhCmluZGV4IDcwZmZhZTYuLjQ2Yzk1MjggMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVNZXNzYWdlLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZU1lc3NhZ2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTQ2LDcgKzQ2LDEyIEBACiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLm1haWwudXRpbC4qOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlByb3BVdGlsOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkFTQ0lJVXRpbGl0eTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NaW1lVXRpbDsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5NZXNzYWdlUmVtb3ZlZElPRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkZvbGRlckNsb3NlZElPRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkxpbmVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YXgubWFpbC51dGlsLlNoYXJlZEJ5dGVBcnJheUlucHV0U3RyZWFtOwogCiAvKioKQEAgLTE3OCw2ICsxODMsOCBAQAogCiAgICAgLy8gU2hvdWxkIGFkZHJlc3NlcyBpbiBoZWFkZXJzIGJlIHBhcnNlZCBpbiAic3RyaWN0IiBtb2RlPwogICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3QgPSB0cnVlOworICAgIC8vIElzIFVURi04IGFsbG93ZWQgaW4gaGVhZGVycz8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3d1dGY4ID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiBBbiBlbXB0eSBtZXNzYWdlIG9iamVjdCBpcyBjcmVhdGVkLgpAQCAtMzE2LDkgKzMyMywxMyBAQAogICAgICAqIFNldCB0aGUgc3RyaWN0IGZsYWcgYmFzZWQgb24gcHJvcGVydHkuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTdHJpY3QoKSB7Ci0JaWYgKHNlc3Npb24gIT0gbnVsbCkKLQkgICAgc3RyaWN0ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblNlc3Npb25Qcm9wZXJ0eShzZXNzaW9uLAorCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkgICAgUHJvcGVydGllcyBwcm9wcyA9IHNlc3Npb24uZ2V0UHJvcGVydGllcygpOworCSAgICBzdHJpY3QgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcHMsCiAJCQkJICAgICJtYWlsLm1pbWUuYWRkcmVzcy5zdHJpY3QiLCB0cnVlKTsKKwkgICAgYWxsb3d1dGY4ID0gUHJvcFV0aWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BzLAorCQkJCSAgICAibWFpbC5taW1lLmFsbG93dXRmOCIsIGZhbHNlKTsKKwl9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNjgsNiArMzc5LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKiBAc2VlCSNoZWFkZXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFkZHJlc3NbXSBnZXRGcm9tKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJQWRkcmVzc1tdIGEgPSBnZXRBZGRyZXNzSGVhZGVyKCJGcm9tIik7CiAJaWYgKGEgPT0gbnVsbCkKQEAgLTM4OSw2ICs0MDEsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RnJvbShBZGRyZXNzIGFkZHJlc3MpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmIChhZGRyZXNzID09IG51bGwpCiAJICAgIHJlbW92ZUhlYWRlcigiRnJvbSIpOwpAQCAtNDI4LDYgKzQ0MSw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJSW50ZXJuZXRBZGRyZXNzIG1lID0gbnVsbDsKIAl0cnkgewpAQCAtNDU1LDYgKzQ2OSw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRGcm9tKEFkZHJlc3NbXSBhZGRyZXNzZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWFkZEFkZHJlc3NIZWFkZXIoIkZyb20iLCBhZGRyZXNzZXMpOwogICAgIH0KQEAgLTUyMCw2ICs1MzUsNyBAQAogCSAgICBzdXBlcih0eXBlKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAJICAgIGlmICh0eXBlLmVxdWFscygiTmV3c2dyb3VwcyIpKQogCQlyZXR1cm4gTkVXU0dST1VQUzsKQEAgLTU1Niw2ICs1NzIsNyBAQAogICAgICAqIEBzZWUJCWphdmF4Lm1haWwuTWVzc2FnZS5SZWNpcGllbnRUeXBlI0JDQwogICAgICAqIEBzZWUJCWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2UuUmVjaXBpZW50VHlwZSNORVdTR1JPVVBTCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFkZHJlc3NbXSBnZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZSB0eXBlKQogCQkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmICh0eXBlID09IFJlY2lwaWVudFR5cGUuTkVXU0dST1VQUykgewpAQCAtNTc2LDYgKzU5Myw3IEBACiAgICAgICogQHNlZQkJamF2YXgubWFpbC5NZXNzYWdlLlJlY2lwaWVudFR5cGUjQkNDCiAgICAgICogQHNlZQkJamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZS5SZWNpcGllbnRUeXBlI05FV1NHUk9VUFMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWRkcmVzc1tdIGdldEFsbFJlY2lwaWVudHMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlBZGRyZXNzW10gYWxsID0gc3VwZXIuZ2V0QWxsUmVjaXBpZW50cygpOwogCUFkZHJlc3NbXSBuZyA9IGdldFJlY2lwaWVudHMoUmVjaXBpZW50VHlwZS5ORVdTR1JPVVBTKTsKQEAgLTYwNiw2ICs2MjQsNyBAQAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqIEBzZWUJCSNnZXRSZWNpcGllbnRzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUgdHlwZSwgQWRkcmVzc1tdIGFkZHJlc3NlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKHR5cGUgPT0gUmVjaXBpZW50VHlwZS5ORVdTR1JPVVBTKSB7CkBAIC02NTksNiArNjc4LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlIHR5cGUsIEFkZHJlc3NbXSBhZGRyZXNzZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmICh0eXBlID09IFJlY2lwaWVudFR5cGUuTkVXU0dST1VQUykgewpAQCAtNzA1LDYgKzcyNSw3IEBACiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICogQHNlZQkJI2hlYWRlcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWRkcmVzc1tdIGdldFJlcGx5VG8oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlBZGRyZXNzW10gYSA9IGdldEFkZHJlc3NIZWFkZXIoIlJlcGx5LVRvIik7CiAJaWYgKGEgPT0gbnVsbCB8fCBhLmxlbmd0aCA9PSAwKQpAQCAtNzIzLDYgKzc0NCw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKEFkZHJlc3NbXSBhZGRyZXNzZXMpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldEFkZHJlc3NIZWFkZXIoIlJlcGx5LVRvIiwgYWRkcmVzc2VzKTsKICAgICB9CkBAIC03MzcsNyArNzU5LDExIEBACiAgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhZGRyZXNzZXMKICAgICBwcml2YXRlIHZvaWQgc2V0QWRkcmVzc0hlYWRlcihTdHJpbmcgbmFtZSwgQWRkcmVzc1tdIGFkZHJlc3NlcykKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewotCVN0cmluZyBzID0gSW50ZXJuZXRBZGRyZXNzLnRvU3RyaW5nKGFkZHJlc3NlcywgbmFtZS5sZW5ndGgoKSArIDIpOworCVN0cmluZyBzOworCWlmIChhbGxvd3V0ZjgpCisJICAgIHMgPSBJbnRlcm5ldEFkZHJlc3MudG9Vbmljb2RlU3RyaW5nKGFkZHJlc3NlcywgbmFtZS5sZW5ndGgoKSArIDIpOworCWVsc2UKKwkgICAgcyA9IEludGVybmV0QWRkcmVzcy50b1N0cmluZyhhZGRyZXNzZXMsIG5hbWUubGVuZ3RoKCkgKyAyKTsKIAlpZiAocyA9PSBudWxsKQogCSAgICByZW1vdmVIZWFkZXIobmFtZSk7CiAJZWxzZQpAQCAtNzU3LDcgKzc4MywxMSBAQAogCSAgICBTeXN0ZW0uYXJyYXljb3B5KGEsIDAsIGFuZXcsIDAsIGEubGVuZ3RoKTsKIAkgICAgU3lzdGVtLmFycmF5Y29weShhZGRyZXNzZXMsIDAsIGFuZXcsIGEubGVuZ3RoLCBhZGRyZXNzZXMubGVuZ3RoKTsKIAl9Ci0JU3RyaW5nIHMgPSBJbnRlcm5ldEFkZHJlc3MudG9TdHJpbmcoYW5ldywgbmFtZS5sZW5ndGgoKSArIDIpOworCVN0cmluZyBzOworCWlmIChhbGxvd3V0ZjgpCisJICAgIHMgPSBJbnRlcm5ldEFkZHJlc3MudG9Vbmljb2RlU3RyaW5nKGFuZXcsIG5hbWUubGVuZ3RoKCkgKyAyKTsKKwllbHNlCisJICAgIHMgPSBJbnRlcm5ldEFkZHJlc3MudG9TdHJpbmcoYW5ldywgbmFtZS5sZW5ndGgoKSArIDIpOwogCWlmIChzID09IG51bGwpCiAJICAgIHJldHVybjsKIAlzZXRIZWFkZXIobmFtZSwgcyk7CkBAIC03NzgsNiArODA4LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKiBAc2VlCQkjaGVhZGVycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCVN0cmluZyByYXd2YWx1ZSA9IGdldEhlYWRlcigiU3ViamVjdCIsIG51bGwpOwogCkBAIC04MTUsNiArODQ2LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmplY3QpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldFN1YmplY3Qoc3ViamVjdCwgbnVsbCk7CiAgICAgfQpAQCAtODY4LDYgKzkwMCw3IEBACiAgICAgICogQHJldHVybiAgICAgICAgICBUaGUgc2VudCBEYXRlCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERhdGUgZ2V0U2VudERhdGUoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlTdHJpbmcgcyA9IGdldEhlYWRlcigiRGF0ZSIsIG51bGwpOwogCWlmIChzICE9IG51bGwpIHsKQEAgLTg5NSw2ICs5MjgsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U2VudERhdGUoRGF0ZSBkKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoZCA9PSBudWxsKQogCSAgICByZW1vdmVIZWFkZXIoIkRhdGUiKTsKQEAgLTkxOCw2ICs5NTIsNyBAQAogICAgICAqIEByZXR1cm4gICAgICAgICAgdGhlIGRhdGUgdGhpcyBtZXNzYWdlIHdhcyByZWNlaXZlZAogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEYXRlIGdldFJlY2VpdmVkRGF0ZSgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBudWxsOwkKICAgICB9CkBAIC05MzksNiArOTc0LDcgQEAKICAgICAgKiBAcmV0dXJuICAgICAgICAgIHNpemUgb2YgY29udGVudCBpbiBieXRlcwogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLyAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaWYgKGNvbnRlbnQgIT0gbnVsbCkKIAkgICAgcmV0dXJuIGNvbnRlbnQubGVuZ3RoOwpAQCAtOTY5LDkgKzEwMDUsMTAgQEAKICAgICAgKiBAcmV0dXJuICAgICAgICAgIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgY29udGVudC4KICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8gIAotICAgICBwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIC0xOwotICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIFJGQyA4MjIgIkNvbnRlbnQtVHlwZSIgaGVhZGVyIGZpZWxkLiAKQEAgLTk4Niw2ICsxMDIzLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKiBAc2VlICAgICAgICAgICAgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJU3RyaW5nIHMgPSBnZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIG51bGwpOwogCXMgPSBNaW1lVXRpbC5jbGVhbkNvbnRlbnRUeXBlKHRoaXMsIHMpOwpAQCAtMTAxMiw2ICsxMDUwLDcgQEAKICAgICAgKiBAcmV0dXJuCQkJdHJ1ZSBpZiBpdCBtYXRjaGVzIHRoZSBNSU1FIHR5cGUKICAgICAgKiBAZXhjZXB0aW9uCQlNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBNaW1lQm9keVBhcnQuaXNNaW1lVHlwZSh0aGlzLCBtaW1lVHlwZSk7CiAgICAgfQpAQCAtMTAzMCw2ICsxMDY5LDcgQEAKICAgICAgKiBAcmV0dXJuICAgICAgICAgIGRpc3Bvc2l0aW9uIG9mIHRoaXMgcGFydCwgb3IgbnVsbCBpZiB1bmtub3duCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXREaXNwb3NpdGlvbigpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBNaW1lQm9keVBhcnQuZ2V0RGlzcG9zaXRpb24odGhpcyk7CiAgICAgfQpAQCAtMTA0NSw2ICsxMDg1LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERpc3Bvc2l0aW9uKFN0cmluZyBkaXNwb3NpdGlvbikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJTWltZUJvZHlQYXJ0LnNldERpc3Bvc2l0aW9uKHRoaXMsIGRpc3Bvc2l0aW9uKTsKICAgICB9CkBAIC0xMDYxLDYgKzExMDIsNyBAQAogICAgICAqIEByZXR1cm4gICAgICAgICAgY29udGVudC10cmFuc2Zlci1lbmNvZGluZwogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gTWltZUJvZHlQYXJ0LmdldEVuY29kaW5nKHRoaXMpOwogICAgIH0KQEAgLTEwNzYsNiArMTExOCw3IEBACiAgICAgICogQHJldHVybiAgICAgICAgICBjb250ZW50LUlECiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SUQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LUlkIiwgbnVsbCk7CiAgICAgfQpAQCAtMTExMCw2ICsxMTUzLDcgQEAKICAgICAgKiBAcmV0dXJuICAgICAgICAgIGNvbnRlbnQtTUQ1CiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50TUQ1KCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGdldEhlYWRlcigiQ29udGVudC1NRDUiLCBudWxsKTsKICAgICB9CkBAIC0xMTIzLDYgKzExNjcsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudE1ENShTdHJpbmcgbWQ1KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlzZXRIZWFkZXIoIkNvbnRlbnQtTUQ1IiwgbWQ1KTsKICAgICB9CkBAIC0xMTQzLDYgKzExODgsNyBAQAogICAgICAqIEByZXR1cm4JY29udGVudC1kZXNjcmlwdGlvbgogICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gTWltZUJvZHlQYXJ0LmdldERlc2NyaXB0aW9uKHRoaXMpOwogICAgIH0KQEAgLTExNzIsNiArMTIxOCw3IEBACiAgICAgICoJCQlpbiB0aGUgZXhjZXB0aW9uIGNoYWluIGlmIHRoZSBjaGFyc2V0CiAgICAgICoJCQljb252ZXJzaW9uIGZhaWxzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwogICAgIH0KQEAgLTEyMTksNiArMTI2Niw3IEBACiAgICAgICogQHJldHVybgkJCXZhbHVlIG9mIGNvbnRlbnQtbGFuZ3VhZ2UgaGVhZGVyLgogICAgICAqIEBleGNlcHRpb24JCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudExhbmd1YWdlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIE1pbWVCb2R5UGFydC5nZXRDb250ZW50TGFuZ3VhZ2UodGhpcyk7CiAgICAgfQpAQCAtMTIzNCw2ICsxMjgyLDcgQEAKICAgICAgKgkJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uCQlNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExhbmd1YWdlKFN0cmluZ1tdIGxhbmd1YWdlcykKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU1pbWVCb2R5UGFydC5zZXRDb250ZW50TGFuZ3VhZ2UodGhpcywgbGFuZ3VhZ2VzKTsKQEAgLTEyNzcsNiArMTMyNiw3IEBACiAgICAgICogQHJldHVybglmaWxlbmFtZQogICAgICAqIEBleGNlcHRpb24JCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIE1pbWVCb2R5UGFydC5nZXRGaWxlTmFtZSh0aGlzKTsKICAgICB9CkBAIC0xMzAxLDYgKzEzNTEsNyBAQAogICAgICAqCQkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24JCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU1pbWVCb2R5UGFydC5zZXRGaWxlTmFtZSh0aGlzLCBmaWxlbmFtZSk7CQogICAgIH0KQEAgLTEzMzgsNiArMTM4OSw3IEBACiAgICAgICogQHNlZQkjZ2V0Q29udGVudFN0cmVhbQogICAgICAqIEBzZWUgCWphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIjZ2V0SW5wdXRTdHJlYW0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSAKIAkJdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiBnZXREYXRhSGFuZGxlcigpLmdldElucHV0U3RyZWFtKCk7CkBAIC0xNDE2LDYgKzE0NjgsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcigpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoZGggPT0gbnVsbCkKQEAgLTE0NDYsNiArMTQ5OSw3IEBACiAgICAgICoJCQlqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCWlmIChjYWNoZWRDb250ZW50ICE9IG51bGwpCiAJICAgIHJldHVybiBjYWNoZWRDb250ZW50OwpAQCAtMTQ4Miw2ICsxNTM2LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24gICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkaCkgCiAJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXRoaXMuZGggPSBkaDsKQEAgLTE1MDgsNiArMTU2Myw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KE9iamVjdCBvLCBTdHJpbmcgdHlwZSkgCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAobyBpbnN0YW5jZW9mIE11bHRpcGFydCkKQEAgLTE1MzUsNiArMTU5MSw3IEBACiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24JaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICogQHNlZQkjc2V0VGV4dChTdHJpbmcgdGV4dCwgU3RyaW5nIGNoYXJzZXQpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc2V0VGV4dCh0ZXh0LCBudWxsKTsKICAgICB9CkBAIC0xNTUwLDYgKzE2MDcsNyBAQAogICAgICAqIEBwYXJhbQljaGFyc2V0CXRoZSBjaGFyc2V0IHRvIHVzZSBmb3IgdGhlIHRleHQKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbglpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0LCBTdHJpbmcgY2hhcnNldCkKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU1pbWVCb2R5UGFydC5zZXRUZXh0KHRoaXMsIHRleHQsIGNoYXJzZXQsICJwbGFpbiIpOwpAQCAtMTU2OCw2ICsxNjI2LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbglpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS40CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCwgU3RyaW5nIGNoYXJzZXQsIFN0cmluZyBzdWJ0eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJTWltZUJvZHlQYXJ0LnNldFRleHQodGhpcywgdGV4dCwgY2hhcnNldCwgc3VidHlwZSk7CkBAIC0xNTg0LDYgKzE2NDMsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChNdWx0aXBhcnQgbXApIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXNldERhdGFIYW5kbGVyKG5ldyBEYXRhSGFuZGxlcihtcCwgbXAuZ2V0Q29udGVudFR5cGUoKSkpOwogCW1wLnNldFBhcmVudCh0aGlzKTsKQEAgLTE2MTgsNiArMTY3OCw3IEBACiAgICAgICogQHJldHVybgkJdGhlIHJlcGx5IE1lc3NhZ2UKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZSByZXBseShib29sZWFuIHJlcGx5VG9BbGwpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiByZXBseShyZXBseVRvQWxsLCB0cnVlKTsKICAgICB9CkBAIC0xNjc1LDcgKzE3MzYsNyBAQAogCUFkZHJlc3MgYVtdID0gZ2V0UmVwbHlUbygpOwogCXJlcGx5LnNldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlLlRPLCBhKTsKIAlpZiAocmVwbHlUb0FsbCkgewotCSAgICBMaXN0PEFkZHJlc3M+IHYgPSBuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KCk7CisJICAgIExpc3Q8QWRkcmVzcz4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogCSAgICAvLyBhZGQgbXkgb3duIGFkZHJlc3MgdG8gbGlzdAogCSAgICBJbnRlcm5ldEFkZHJlc3MgbWUgPSBJbnRlcm5ldEFkZHJlc3MuZ2V0TG9jYWxBZGRyZXNzKHNlc3Npb24pOwogCSAgICBpZiAobWUgIT0gbnVsbCkKQEAgLTE2OTEsNyArMTc1Miw4IEBACiAJICAgIFN0cmluZyByZXBseWFsbGNjU3RyID0gbnVsbDsKIAkgICAgYm9vbGVhbiByZXBseWFsbGNjID0gZmFsc2U7CiAJICAgIGlmIChzZXNzaW9uICE9IG51bGwpCi0JCXJlcGx5YWxsY2MgPSBQcm9wVXRpbC5nZXRCb29sZWFuU2Vzc2lvblByb3BlcnR5KHNlc3Npb24sCisJCXJlcGx5YWxsY2MgPSBQcm9wVXRpbC5nZXRCb29sZWFuUHJvcGVydHkoCisJCQkJCQlzZXNzaW9uLmdldFByb3BlcnRpZXMoKSwKIAkJCQkJCSJtYWlsLnJlcGx5YWxsY2MiLCBmYWxzZSk7CiAJICAgIC8vIGFkZCB0aGUgcmVjaXBpZW50cyBmcm9tIHRoZSBUbyBmaWVsZCBzbyBmYXIKIAkgICAgZWxpbWluYXRlRHVwbGljYXRlcyh2LCBhKTsKQEAgLTE4MTksNiArMTg4MSw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyI3dyaXRlVG8KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJd3JpdGVUbyhvcywgbnVsbCk7CkBAIC0xODUzLDkgKzE5MTYsOCBAQAogCiAJLy8gRWxzZSwgdGhlIGNvbnRlbnQgaXMgdW50b3VjaGVkLCBzbyB3ZSBjYW4ganVzdCBvdXRwdXQgaXQKIAkvLyBGaXJzdCwgd3JpdGUgb3V0IHRoZSBoZWFkZXIKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlFbnVtZXJhdGlvbjxTdHJpbmc+IGhkckxpbmVzID0gZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhpZ25vcmVMaXN0KTsKLQlMaW5lT3V0cHV0U3RyZWFtIGxvcyA9IG5ldyBMaW5lT3V0cHV0U3RyZWFtKG9zKTsKKwlMaW5lT3V0cHV0U3RyZWFtIGxvcyA9IG5ldyBMaW5lT3V0cHV0U3RyZWFtKG9zLCBhbGxvd3V0ZjgpOwogCXdoaWxlIChoZHJMaW5lcy5oYXNNb3JlRWxlbWVudHMoKSkKIAkgICAgbG9zLndyaXRlbG4oaGRyTGluZXMubmV4dEVsZW1lbnQoKSk7CiAKQEAgLTE4OTgsNiArMTk2MCw3IEBACiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICogQHNlZSAJamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lVXRpbGl0eQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRIZWFkZXIobmFtZSk7CkBAIC0xOTE1LDYgKzE5NzgsNyBAQAogICAgICAqCQkJCXRoaXMgbmFtZQogICAgICAqIEBleGNlcHRpb24gICAgICAgCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlbGltaXRlcikKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRIZWFkZXIobmFtZSwgZGVsaW1pdGVyKTsKQEAgLTE5MzYsNiArMjAwMCw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaGVhZGVycy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOwkKQEAgLTE5NTYsNiArMjAyMSw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaGVhZGVycy5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOwpAQCAtMTk2OSw2ICsyMDM1LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24gICAgICAgTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcihTdHJpbmcgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJaGVhZGVycy5yZW1vdmVIZWFkZXIobmFtZSk7CkBAIC0xOTg5LDggKzIwNTYsOCBAQAogICAgICAqIEBleGNlcHRpb24gIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKiBAc2VlIAlqYXZheC5tYWlsLmludGVybmV0Lk1pbWVVdGlsaXR5CiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsSGVhZGVycygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxIZWFkZXI+IGdldEFsbEhlYWRlcnMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7CQogICAgIH0KIApAQCAtMjAwMSw4ICsyMDY4LDggQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudW1lcmF0aW9uPEhlYWRlcj4gZ2V0TWF0Y2hpbmdIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKQogCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGhlYWRlcnMuZ2V0TWF0Y2hpbmdIZWFkZXJzKG5hbWVzKTsKICAgICB9CkBAIC0yMDE0LDggKzIwODEsOCBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiAgTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5vbk1hdGNoaW5nSGVhZGVycyhTdHJpbmdbXSBuYW1lcykKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bWVyYXRpb248SGVhZGVyPiBnZXROb25NYXRjaGluZ0hlYWRlcnMoU3RyaW5nW10gbmFtZXMpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXROb25NYXRjaGluZ0hlYWRlcnMobmFtZXMpOwogICAgIH0KQEAgLTIwMjksNiArMjA5Niw3IEBACiAgICAgICoJCQlvYnRhaW5lZCBmcm9tIGEgUkVBRF9PTkxZIGZvbGRlci4KICAgICAgKiBAZXhjZXB0aW9uICAJTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBvdGhlciBmYWlsdXJlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlckxpbmUoU3RyaW5nIGxpbmUpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCWhlYWRlcnMuYWRkSGVhZGVyTGluZShsaW5lKTsKICAgICB9CkBAIC0yMDQwLDggKzIxMDgsOCBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiAgCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxIZWFkZXJMaW5lcygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEFsbEhlYWRlckxpbmVzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGhlYWRlcnMuZ2V0QWxsSGVhZGVyTGluZXMoKTsKICAgICB9CiAKQEAgLTIwNTIsOCArMjEyMCw4IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uICAJTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0TWF0Y2hpbmdIZWFkZXJMaW5lcyhTdHJpbmdbXSBuYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlyZXR1cm4gaGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlckxpbmVzKG5hbWVzKTsKICAgICB9CkBAIC0yMDY1LDggKzIxMzMsOCBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiAgCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE5vbk1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGhlYWRlcnMuZ2V0Tm9uTWF0Y2hpbmdIZWFkZXJMaW5lcyhuYW1lcyk7CiAgICAgfQpAQCAtMjA4Myw2ICsyMTUxLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uICAJTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcwogICAgICAqIEBzZWUgCQlqYXZheC5tYWlsLkZsYWdzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBGbGFncyBnZXRGbGFncygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXJldHVybiAoRmxhZ3MpZmxhZ3MuY2xvbmUoKTsKICAgICB9CkBAIC0yMTA1LDYgKzIxNzQsNyBAQAogICAgICAqIEBzZWUJCWphdmF4Lm1haWwuRmxhZ3MuRmxhZyNSRUNFTlQKICAgICAgKiBAc2VlCQlqYXZheC5tYWlsLkZsYWdzLkZsYWcjU0VFTgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NldChGbGFncy5GbGFnIGZsYWcpCiAJCQkJdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIChmbGFncy5jb250YWlucyhmbGFnKSk7CkBAIC0yMTIxLDYgKzIxOTEsNyBAQAogICAgICAqCQkJb2J0YWluZWQgZnJvbSBhIFJFQURfT05MWSBmb2xkZXIuCiAgICAgICogQGV4Y2VwdGlvbiAgCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RmxhZ3MoRmxhZ3MgZmxhZywgYm9vbGVhbiBzZXQpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlpZiAoc2V0KQpAQCAtMjE1Myw2ICsyMjI0LDcgQEAKICAgICAgKgkJCW9idGFpbmVkIGZyb20gYSBSRUFEX09OTFkgZm9sZGVyLgogICAgICAqIEBleGNlcHRpb24gIAlNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2F2ZUNoYW5nZXMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAltb2RpZmllZCA9IHRydWU7CiAJc2F2ZWQgPSB0cnVlOwpAQCAtMjE3Nyw3ICsyMjQ5LDggQEAKICAgICAgKiBDYWxsZWQgYnkgdGhlIDxjb2RlPnNhdmVDaGFuZ2VzPC9jb2RlPiBtZXRob2QgdG8gYWN0dWFsbHkKICAgICAgKiB1cGRhdGUgdGhlIE1JTUUgaGVhZGVycy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIHNldHMgdGhlCiAgICAgICogPGNvZGU+Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZzwvY29kZT4gaGVhZGVyIChpZiBuZWVkZWQKLSAgICAgKiBhbmQgbm90IGFscmVhZHkgc2V0KSwgdGhlIDxjb2RlPk1JTUUtVmVyc2lvbjwvY29kZT4gaGVhZGVyCisgICAgICogYW5kIG5vdCBhbHJlYWR5IHNldCksIHRoZSA8Y29kZT5EYXRlPC9jb2RlPiBoZWFkZXIgKGlmCisgICAgICogbm90IGFscmVhZHkgc2V0KSwgdGhlIDxjb2RlPk1JTUUtVmVyc2lvbjwvY29kZT4gaGVhZGVyCiAgICAgICogYW5kIHRoZSA8Y29kZT5NZXNzYWdlLUlEPC9jb2RlPiBoZWFkZXIuIEFsc28sIGlmIHRoZSBjb250ZW50CiAgICAgICogb2YgdGhpcyBtZXNzYWdlIGlzIGEgPGNvZGU+TWltZU11bHRpcGFydDwvY29kZT4sIGl0cwogICAgICAqIDxjb2RlPnVwZGF0ZUhlYWRlcnM8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIDxwPgpAQCAtMjE5Nyw2ICsyMjcwLDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlSGVhZGVycygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCU1pbWVCb2R5UGFydC51cGRhdGVIZWFkZXJzKHRoaXMpOwkKIAlzZXRIZWFkZXIoIk1JTUUtVmVyc2lvbiIsICIxLjAiKTsKKwlpZiAoZ2V0SGVhZGVyKCJEYXRlIikgPT0gbnVsbCkKKwkgICAgc2V0U2VudERhdGUobmV3IERhdGUoKSk7CiAgICAgICAgIHVwZGF0ZU1lc3NhZ2VJRCgpOwogCiAJaWYgKGNhY2hlZENvbnRlbnQgIT0gbnVsbCkgewpAQCAtMjIyNiw3ICsyMzAxLDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW50ZXJuZXRIZWFkZXJzIGNyZWF0ZUludGVybmV0SGVhZGVycyhJbnB1dFN0cmVhbSBpcykKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKLQlyZXR1cm4gbmV3IEludGVybmV0SGVhZGVycyhpcyk7CisJcmV0dXJuIG5ldyBJbnRlcm5ldEhlYWRlcnMoaXMsIGFsbG93dXRmOCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lTXVsdGlwYXJ0LmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lTXVsdGlwYXJ0LmphdmEKaW5kZXggODUzMzgwOS4uMGZjODYzMCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZU11bHRpcGFydC5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVNdWx0aXBhcnQuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTI2Myw3ICsyNjMsOCBAQAogICAgICAqIGJvdW5kYXJ5IGFuZCBjcmVhdGVzIE1pbWVCb2R5UGFydHMgZm9yIGVhY2ggcGFydCBvZiB0aGUgc3RyZWFtLgogICAgICAqCiAgICAgICogQHBhcmFtCWRzCURhdGFTb3VyY2UsIGNhbiBiZSBhIE11bHRpcGFydERhdGFTb3VyY2UKLSAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKKyAgICAgKiBAZXhjZXB0aW9uCVBhcnNlRXhjZXB0aW9uIGZvciBmYWlsdXJlcyBwYXJzaW5nIHRoZSBtZXNzYWdlCisgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCiAgICAgcHVibGljIE1pbWVNdWx0aXBhcnQoRGF0YVNvdXJjZSBkcykgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJc3VwZXIoKTsKQEAgLTMzMCw2ICszMzEsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybgkJbnVtYmVyIG9mIHBhcnRzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q291bnQoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwogCXJldHVybiBzdXBlci5nZXRDb3VudCgpOwpAQCAtMzQyLDYgKzM0NCw3IEBACiAgICAgICogQHJldHVybgkJdGhlIFBhcnQKICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBpZiBubyBzdWNoIEJvZHlQYXJ0IGV4aXN0cwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQm9keVBhcnQgZ2V0Qm9keVBhcnQoaW50IGluZGV4KSAKIAkJCXRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXBhcnNlKCk7CkBAIC0zODEsNiArMzg0LDcgQEAKICAgICAgKgkJCWltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgbW9kaWZpY2F0aW9uCiAgICAgICoJCQlvZiBleGlzdGluZyB2YWx1ZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVCb2R5UGFydChCb2R5UGFydCBwYXJ0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwogCXJldHVybiBzdXBlci5yZW1vdmVCb2R5UGFydChwYXJ0KTsKQEAgLTM5OCw2ICs0MDIsNyBAQAogICAgICAqCQkJb2YgZXhpc3RpbmcgdmFsdWVzCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQm9keVBhcnQoaW50IGluZGV4KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwogCXN1cGVyLnJlbW92ZUJvZHlQYXJ0KGluZGV4KTsKQEAgLTQxMyw2ICs0MTgsNyBAQAogICAgICAqCQkJb2YgZXhpc3RpbmcgdmFsdWVzCiAgICAgICogQGV4Y2VwdGlvbiAgICAgICBNZXNzYWdpbmdFeGNlcHRpb24gZm9yIG90aGVyIGZhaWx1cmVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEJvZHlQYXJ0KEJvZHlQYXJ0IHBhcnQpIAogCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwpAQCAtNDMzLDYgKzQzOSw3IEBACiAgICAgICoJCQlvZiBleGlzdGluZyB2YWx1ZXMKICAgICAgKiBAZXhjZXB0aW9uICAgICAgIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQm9keVBhcnQoQm9keVBhcnQgcGFydCwgaW50IGluZGV4KSAKIAkJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwpAQCAtNTE5LDYgKzUyNiw3IEBACiAgICAgICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIHBhcnRzIGFuZCBvdXRwdXRzIGVhY2ggTUlNRSBwYXJ0CiAgICAgICogc2VwYXJhdGVkIGJ5IGEgYm91bmRhcnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnaW5nRXhjZXB0aW9uIHsKIAlwYXJzZSgpOwpAQCAtNTY4LDcgKzU3Niw4IEBACiAgICAgICogVGhlIHtAbGluayAjaW5pdGlhbGl6ZVByb3BlcnRpZXN9IG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCiAgICAgICogcGFyc2luZyB0aGUgZGF0YS4KICAgICAgKgotICAgICAqIEBleGNlcHRpb24JTWVzc2FnaW5nRXhjZXB0aW9uIGZvciBmYWlsdXJlcworICAgICAqIEBleGNlcHRpb24JUGFyc2VFeGNlcHRpb24gZm9yIGZhaWx1cmVzIHBhcnNpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKiBAc2luY2UJSmF2YU1haWwgMS4yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHBhcnNlKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CkBAIC02MDIsMTQgKzYxMSwxMyBAQAogCX0KIAlpZiAoYm91bmRhcnkgPT0gbnVsbCAmJiAhaWdub3JlTWlzc2luZ0JvdW5kYXJ5UGFyYW1ldGVyICYmCiAJCSFpZ25vcmVFeGlzdGluZ0JvdW5kYXJ5UGFyYW1ldGVyKQotCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKCJNaXNzaW5nIGJvdW5kYXJ5IHBhcmFtZXRlciIpOworCSAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk1pc3NpbmcgYm91bmRhcnkgcGFyYW1ldGVyIik7CiAKIAl0cnkgewogCSAgICAvLyBTa2lwIGFuZCBzYXZlIHRoZSBwcmVhbWJsZQogCSAgICBMaW5lSW5wdXRTdHJlYW0gbGluID0gbmV3IExpbmVJbnB1dFN0cmVhbShpbik7Ci0JICAgIFN0cmluZ0J1ZmZlciBwcmVhbWJsZXNiID0gbnVsbDsKKwkgICAgU3RyaW5nQnVpbGRlciBwcmVhbWJsZXNiID0gbnVsbDsKIAkgICAgU3RyaW5nIGxpbmU7Ci0JICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gbnVsbDsKIAkgICAgd2hpbGUgKChsaW5lID0gbGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJLyoKIAkJICogU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIENhbid0IHVzZSB0cmltIG1ldGhvZApAQCAtNjU1LDIwICs2NjMsMTAgQEAKIAogCQkvLyBzYXZlIHRoZSBwcmVhbWJsZSBhZnRlciBza2lwcGluZyBibGFuayBsaW5lcwogCQlpZiAobGluZS5sZW5ndGgoKSA+IDApIHsKLQkJICAgIC8vIGlmIHdlIGhhdmVuJ3QgZmlndXJlZCBvdXQgd2hhdCB0aGUgbGluZSBzZXBhcmF0b3IKLQkJICAgIC8vIGlzLCBkbyBpdCBub3cKLQkJICAgIGlmIChsaW5lU2VwYXJhdG9yID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkgICAgbGluZVNlcGFyYXRvciA9Ci0JCQkJU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLQkJCSAgICBsaW5lU2VwYXJhdG9yID0gIlxuIjsKLQkJCX0KLQkJICAgIH0KIAkJICAgIC8vIGFjY3VtdWxhdGUgdGhlIHByZWFtYmxlCiAJCSAgICBpZiAocHJlYW1ibGVzYiA9PSBudWxsKQotCQkJcHJlYW1ibGVzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGluZS5sZW5ndGgoKSArIDIpOwotCQkgICAgcHJlYW1ibGVzYi5hcHBlbmQobGluZSkuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOworCQkJcHJlYW1ibGVzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxpbmUubGVuZ3RoKCkgKyAyKTsKKwkJICAgIHByZWFtYmxlc2IuYXBwZW5kKGxpbmUpLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKIAkJfQogCSAgICB9CiAKQEAgLTY3OSw3ICs2NzcsNyBAQAogCQlpZiAoYWxsb3dFbXB0eSkKIAkJICAgIHJldHVybjsKIAkJZWxzZQotCQkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigiTWlzc2luZyBzdGFydCBib3VuZGFyeSIpOworCQkgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJNaXNzaW5nIHN0YXJ0IGJvdW5kYXJ5Iik7CiAJICAgIH0KIAogCSAgICAvLyBzYXZlIGluZGl2aWR1YWwgYm91bmRhcnkgYnl0ZXMgZm9yIGNvbXBhcmlzb24gbGF0ZXIKQEAgLTczMSw3ICs3MjksNyBAQAogCQkJOwogCQkgICAgaWYgKGxpbmUgPT0gbnVsbCkgewogCQkJaWYgKCFpZ25vcmVNaXNzaW5nRW5kQm91bmRhcnkpCi0JCQkgICAgdGhyb3cgbmV3IE1lc3NhZ2luZ0V4Y2VwdGlvbigKKwkJCSAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCiAJCQkJCSJtaXNzaW5nIG11bHRpcGFydCBlbmQgYm91bmRhcnkiKTsKIAkJCS8vIGFzc3VtZSB0aGVyZSdzIGp1c3QgYSBtaXNzaW5nIGVuZCBib3VuZGFyeQogCQkJY29tcGxldGUgPSBmYWxzZTsKQEAgLTc3OSw3ICs3NzcsNyBAQAogCQkgICAgaWYgKGluU2l6ZSA8IGJsKSB7CiAJCQkvLyBoaXQgRU9GCiAJCQlpZiAoIWlnbm9yZU1pc3NpbmdFbmRCb3VuZGFyeSkKLQkJCSAgICB0aHJvdyBuZXcgTWVzc2FnaW5nRXhjZXB0aW9uKAorCQkJICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKIAkJCQkJIm1pc3NpbmcgbXVsdGlwYXJ0IGVuZCBib3VuZGFyeSIpOwogCQkJaWYgKHNpbiAhPSBudWxsKQogCQkJICAgIGVuZCA9IHNpbi5nZXRQb3NpdGlvbigpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZVBhcnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVQYXJ0LmphdmEKaW5kZXggOTliMTE4Ni4uNmYxMDk5ZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZVBhcnQuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lUGFydC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTA4LDggKzEwOCw3IEBACiAgICAgICogQHJldHVybglhbiBFbnVtZXJhdGlvbiBvZiBTdHJpbmdzCiAgICAgICogQGV4Y2VwdGlvbglNZXNzYWdpbmdFeGNlcHRpb24gZm9yIGZhaWx1cmVzCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsSGVhZGVyTGluZXMoKSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOworICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldEFsbEhlYWRlckxpbmVzKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldCBtYXRjaGluZyBoZWFkZXIgbGluZXMgYXMgYW4gRW51bWVyYXRpb24gb2YgU3RyaW5ncy4gCkBAIC0xMjAsOCArMTE5LDcgQEAKICAgICAgKiBAcmV0dXJuCWFuIEVudW1lcmF0aW9uIG9mIFN0cmluZ3MKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC0xMzMsOCArMTMxLDcgQEAKICAgICAgKiBAcmV0dXJuCWFuIEVudW1lcmF0aW9uIG9mIFN0cmluZ3MKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3IgZmFpbHVyZXMKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXROb25NYXRjaGluZ0hlYWRlckxpbmVzKFN0cmluZ1tdIG5hbWVzKQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE5vbk1hdGNoaW5nSGVhZGVyTGluZXMoU3RyaW5nW10gbmFtZXMpCiAJCQl0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC0yMTYsNiArMjEzLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uCU1lc3NhZ2luZ0V4Y2VwdGlvbglpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKiBAc2VlCSNzZXRUZXh0KFN0cmluZyB0ZXh0LCBTdHJpbmcgY2hhcnNldCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgTWVzc2FnaW5nRXhjZXB0aW9uOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lUGFydERhdGFTb3VyY2UuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCmluZGV4IDk2M2ZlZmUuLjkwMjM2ZTAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVQYXJ0RGF0YVNvdXJjZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtOTEsNiArOTEsNyBAQAogICAgICAqIEBzZWUJamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lVXRpbGl0eSNkZWNvZGUKICAgICAgKiBAcmV0dXJuIAlkZWNvZGVkIGlucHV0IHN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJSW5wdXRTdHJlYW0gaXM7CiAKQEAgLTEyMyw2ICsxMjQsNyBAQAogICAgICAqCiAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgdGhlIFVua25vd25TZXJ2aWNlRXhjZXB0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgVW5rbm93blNlcnZpY2VFeGNlcHRpb24oIldyaXRpbmcgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KQEAgLTEzMyw2ICsxMzUsNyBAQAogICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24ganVzdCBpbnZva2VzIHRoZSA8Y29kZT5nZXRDb250ZW50VHlwZTwvY29kZT4KICAgICAgKiBtZXRob2Qgb24gdGhlIE1pbWVQYXJ0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CiAJdHJ5IHsKIAkgICAgcmV0dXJuIHBhcnQuZ2V0Q29udGVudFR5cGUoKTsKQEAgLTE1MCw2ICsxNTMsNyBAQAogICAgICAqCiAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAl0cnkgewogCSAgICBpZiAocGFydCBpbnN0YW5jZW9mIE1pbWVCb2R5UGFydCkKQEAgLTE2NCw2ICsxNjgsNyBAQAogICAgICAqIFJldHVybiB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IGZvciB0aGUgY3VycmVudCBwYXJ0LgogICAgICAqIEBzaW5jZSBKYXZhTWFpbCAxLjEKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgewogCWlmIChjb250ZXh0ID09IG51bGwpCiAJICAgIGNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQocGFydCk7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lVXRpbGl0eS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTWltZVV0aWxpdHkuamF2YQppbmRleCA5OWQ5MWVjLi41MGU4MzljIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9NaW1lVXRpbGl0eS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L01pbWVVdGlsaXR5LmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00NSw3ICs0NSwyMSBAQAogaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUHJvcFV0aWw7CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuQVNDSUlVdGlsaXR5OworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLkJBU0U2NERlY29kZXJTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuQkFTRTY0RW5jb2RlclN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5CRW5jb2RlclN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5MaW5lSW5wdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuTGluZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5Mb2dPdXRwdXRTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUURlY29kZXJTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUUVuY29kZXJTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuUVBEZWNvZGVyU3RyZWFtOworaW1wb3J0IGNvbS5zdW4ubWFpbC51dGlsLlFQRW5jb2RlclN0cmVhbTsKK2ltcG9ydCBjb20uc3VuLm1haWwudXRpbC5VVURlY29kZXJTdHJlYW07CitpbXBvcnQgY29tLnN1bi5tYWlsLnV0aWwuVVVFbmNvZGVyU3RyZWFtOwogCiAvKioKICAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgdmFyaW91cyBNSU1FIHJlbGF0ZWQKQEAgLTE0OSw3ICsxNjMsNyBAQAogICAgIC8vIGNhY2hlZCBtYXAgb2Ygd2hldGhlciBhIGNoYXJzZXQgaXMgY29tcGF0aWJsZSB3aXRoIEFTQ0lJCiAgICAgLy8gTWFwPFN0cmluZyxCb29sZWFuPgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG5vbkFzY2lpQ2hhcnNldE1hcAotCSAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKKwkgICAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlY29kZVN0cmljdCA9CiAJUHJvcFV0aWwuZ2V0Qm9vbGVhblN5c3RlbVByb3BlcnR5KCJtYWlsLm1pbWUuZGVjb2RldGV4dC5zdHJpY3QiLCB0cnVlKTsKQEAgLTE1OCw2ICsxNzIsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaWdub3JlVW5rbm93bkVuY29kaW5nID0KIAlQcm9wVXRpbC5nZXRCb29sZWFuU3lzdGVtUHJvcGVydHkoCiAJICAgICJtYWlsLm1pbWUuaWdub3JldW5rbm93bmVuY29kaW5nIiwgZmFsc2UpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxsb3dVdGY4ID0KKwlQcm9wVXRpbC5nZXRCb29sZWFuU3lzdGVtUHJvcGVydHkoIm1haWwubWltZS5hbGxvd3V0ZjgiLCBmYWxzZSk7CiAgICAgLyoKICAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBwcm9wZXJ0aWVzIGFsbG93IGRpc2FibGluZyB0aGUgZm9sZCgpCiAgICAgICogYW5kIHVuZm9sZCgpIG1ldGhvZHMgYW5kIHJldmVydGluZyB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuCkBAIC01OTMsOCArNjA5LDggQEAKIAkvLyBFbmNvZGVkIHdvcmRzIGZvdW5kLiBTdGFydCBkZWNvZGluZyAuLi4KIAogCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihldGV4dCwgbHdzcCwgdHJ1ZSk7Ci0JU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAgLy8gZGVjb2RlIGJ1ZmZlcgotCVN0cmluZ0J1ZmZlciB3c2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7IC8vIHdoaXRlIHNwYWNlIGJ1ZmZlcgorCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAgLy8gZGVjb2RlIGJ1ZmZlcgorCVN0cmluZ0J1aWxkZXIgd3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsgLy8gd2hpdGUgc3BhY2UgYnVmZmVyCiAJYm9vbGVhbiBwcmV2V2FzRW5jb2RlZCA9IGZhbHNlOwogCiAJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewpAQCAtNzU0LDcgKzc3MCw3IEBACiAJICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKAogCQkJIlVua25vd24gdHJhbnNmZXIgZW5jb2Rpbmc6ICIgKyBlbmNvZGluZyk7CiAKLQlTdHJpbmdCdWZmZXIgb3V0YiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgLy8gdGhlIG91dHB1dCBidWZmZXIKKwlTdHJpbmdCdWlsZGVyIG91dGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAvLyB0aGUgb3V0cHV0IGJ1ZmZlcgogCWRvRW5jb2RlKHN0cmluZywgYjY0LCBqY2hhcnNldCwgCiAJCSAvLyBBcyBwZXIgUkZDIDIwNDcsIHNpemUgb2YgYW4gZW5jb2RlZCBzdHJpbmcgc2hvdWxkIG5vdAogCQkgLy8gZXhjZWVkIDc1IGJ5dGVzLgpAQCAtNzY4LDcgKzc4NCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvRW5jb2RlKFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gYjY0LCAKIAkJU3RyaW5nIGpjaGFyc2V0LCBpbnQgYXZhaWwsIFN0cmluZyBwcmVmaXgsIAotCQlib29sZWFuIGZpcnN0LCBib29sZWFuIGVuY29kaW5nV29yZCwgU3RyaW5nQnVmZmVyIGJ1ZikgCisJCWJvb2xlYW4gZmlyc3QsIGJvb2xlYW4gZW5jb2RpbmdXb3JkLCBTdHJpbmdCdWlsZGVyIGJ1ZikKIAkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKIAogCS8vIEZpcnN0IGZpbmQgb3V0IHdoYXQgdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCB2ZXJzaW9uIG9mCkBAIC04MDksNyArODI1LDcgQEAKIAogCSAgICBieXRlW10gZW5jb2RlZEJ5dGVzID0gb3MudG9CeXRlQXJyYXkoKTsgLy8gdGhlIGVuY29kZWQgc3R1ZmYKIAkgICAgLy8gTm93IHdyaXRlIG91dCB0aGUgZW5jb2RlZCAoYWxsIEFTQ0lJKSBieXRlcyBpbnRvIG91cgotCSAgICAvLyBTdHJpbmdCdWZmZXIKKwkgICAgLy8gU3RyaW5nQnVpbGRlcgogCSAgICBpZiAoIWZpcnN0KSAvLyBub3QgdGhlIGZpcnN0IGxpbmUgb2YgdGhpcyBzZXF1ZW5jZQogCQlpZiAoZm9sZEVuY29kZWRXb3JkcykKIAkJICAgIGJ1Zi5hcHBlbmQoIlxyXG4gIik7IC8vIHN0YXJ0IGEgY29udGludWF0aW9uIGxpbmUKQEAgLTk0Niw3ICs5NjIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGVJbm5lcldvcmRzKFN0cmluZyB3b3JkKQogCQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKIAlpbnQgc3RhcnQgPSAwLCBpOwotCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCXdoaWxlICgoaSA9IHdvcmQuaW5kZXhPZigiPT8iLCBzdGFydCkpID49IDApIHsKIAkgICAgYnVmLmFwcGVuZCh3b3JkLnN1YnN0cmluZyhzdGFydCwgaSkpOwogCSAgICAvLyBmaW5kIGZpcnN0ICc/JyBhZnRlciBvcGVuaW5nICc9PycgLSBlbmQgb2YgY2hhcnNldApAQCAtMTAwNyw3ICsxMDIzLDcgQEAKIAkgICAgY2hhciBjID0gd29yZC5jaGFyQXQoaSk7CiAJICAgIGlmIChjID09ICciJyB8fCBjID09ICdcXCcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgewogCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGVtIGFuZCB0aGVuIHF1b3RlIHRoZSB3aG9sZSBzdHJpbmcKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAzKTsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDMpOwogCQlzYi5hcHBlbmQoJyInKTsKIAkJc2IuYXBwZW5kKHdvcmQuc3Vic3RyaW5nKDAsIGkpKTsKIAkJaW50IGxhc3RjID0gMDsKQEAgLTEwMjQsMTMgKzEwNDAsMTQgQEAKIAkJfQogCQlzYi5hcHBlbmQoJyInKTsKIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JICAgIH0gZWxzZSBpZiAoYyA8IDA0MCB8fCBjID49IDAxNzcgfHwgc3BlY2lhbHMuaW5kZXhPZihjKSA+PSAwKQorCSAgICB9IGVsc2UgaWYgKGMgPCAwNDAgfHwgKGMgPj0gMDE3NyAmJiAhYWxsb3dVdGY4KSB8fAorCQkgICAgc3BlY2lhbHMuaW5kZXhPZihjKSA+PSAwKQogCQkvLyBUaGVzZSBjaGFyYWN0ZXJzIGNhdXNlIHRoZSBzdHJpbmcgdG8gYmUgcXVvdGVkCiAJCW5lZWRRdW90aW5nID0gdHJ1ZTsKIAl9CiAKIAlpZiAobmVlZFF1b3RpbmcpIHsKLQkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAyKTsKKwkgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDIpOwogCSAgICBzYi5hcHBlbmQoJyInKS5hcHBlbmQod29yZCkuYXBwZW5kKCciJyk7CiAJICAgIHJldHVybiBzYi50b1N0cmluZygpOwogCX0gZWxzZSAKQEAgLTExNTYsNDQgKzExNzMsMzkgQEAKIAlpZiAoIWZvbGRUZXh0KQogCSAgICByZXR1cm4gczsKIAotCVN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisJU3RyaW5nQnVpbGRlciBzYiA9IG51bGw7CiAJaW50IGk7CiAJd2hpbGUgKChpID0gaW5kZXhPZkFueShzLCAiXHJcbiIpKSA+PSAwKSB7CiAJICAgIGludCBzdGFydCA9IGk7Ci0JICAgIGludCBsID0gcy5sZW5ndGgoKTsKKwkgICAgaW50IHNsZW4gPSBzLmxlbmd0aCgpOwogCSAgICBpKys7CQkvLyBza2lwIENSIG9yIE5MCi0JICAgIGlmIChpIDwgbCAmJiBzLmNoYXJBdChpIC0gMSkgPT0gJ1xyJyAmJiBzLmNoYXJBdChpKSA9PSAnXG4nKQorCSAgICBpZiAoaSA8IHNsZW4gJiYgcy5jaGFyQXQoaSAtIDEpID09ICdccicgJiYgcy5jaGFyQXQoaSkgPT0gJ1xuJykKIAkJaSsrOwkvLyBza2lwIExGCi0JICAgIGlmIChzdGFydCA9PSAwIHx8IHMuY2hhckF0KHN0YXJ0IC0gMSkgIT0gJ1xcJykgewotCQljaGFyIGM7Ci0JCS8vIGlmIG5leHQgbGluZSBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlLCBza2lwIGFsbCBvZiBpdAotCQkvLyBYWFggLSBhbHdheXMgaGFzIHRvIGJlIHRydWU/Ci0JCWlmIChpIDwgbCAmJiAoKGMgPSBzLmNoYXJBdChpKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykpIHsKLQkJICAgIGkrKzsJLy8gc2tpcCB3aGl0ZXNwYWNlCi0JCSAgICB3aGlsZSAoaSA8IGwgJiYgKChjID0gcy5jaGFyQXQoaSkpID09ICcgJyB8fCBjID09ICdcdCcpKQotCQkJaSsrOwotCQkgICAgaWYgKHNiID09IG51bGwpCi0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCSAgICBpZiAoc3RhcnQgIT0gMCkgewotCQkJc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIHN0YXJ0KSk7Ci0JCQlzYi5hcHBlbmQoJyAnKTsKLQkJICAgIH0KLQkJICAgIHMgPSBzLnN1YnN0cmluZyhpKTsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCS8vIGl0J3Mgbm90IGEgY29udGludWF0aW9uIGxpbmUsIGp1c3QgbGVhdmUgaXQgaW4KLQkJaWYgKHNiID09IG51bGwpCi0JCSAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCXNiLmFwcGVuZChzLnN1YnN0cmluZygwLCBpKSk7Ci0JCXMgPSBzLnN1YnN0cmluZyhpKTsKLQkgICAgfSBlbHNlIHsKLQkJLy8gdGhlcmUncyBhIGJhY2tzbGFzaCBhdCAic3RhcnQgLSAxIgorCSAgICBpZiAoc3RhcnQgPiAwICYmIHMuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xcJykgeworCQkvLyB0aGVyZSdzIGEgYmFja3NsYXNoIGJlZm9yZSB0aGUgbGluZSBicmVhawogCQkvLyBzdHJpcCBpdCBvdXQsIGJ1dCBsZWF2ZSBpbiB0aGUgbGluZSBicmVhawogCQlpZiAoc2IgPT0gbnVsbCkKLQkJICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKKwkJICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7CiAJCXNiLmFwcGVuZChzLnN1YnN0cmluZygwLCBzdGFydCAtIDEpKTsKIAkJc2IuYXBwZW5kKHMuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAJCXMgPSBzLnN1YnN0cmluZyhpKTsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciBjOworCQkvLyBpZiBuZXh0IGxpbmUgc3RhcnRzIHdpdGggd2hpdGVzcGFjZSwKKwkJLy8gb3IgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCByZW1vdmUgdGhlIGxpbmUgYnJlYWsKKwkJLy8gWFhYIC0gbmV4dCBsaW5lIHNob3VsZCBhbHdheXMgc3RhcnQgd2l0aCB3aGl0ZXNwYWNlCisJCWlmIChpID49IHNsZW4gfHwgKGMgPSBzLmNoYXJBdChpKSkgPT0gJyAnIHx8IGMgPT0gJ1x0JykgeworCQkgICAgaWYgKHNiID09IG51bGwpCisJCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHMubGVuZ3RoKCkpOworCQkgICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIHN0YXJ0KSk7CisJCSAgICBzID0gcy5zdWJzdHJpbmcoaSk7CisJCX0gZWxzZSB7CisJCSAgICAvLyBpdCdzIG5vdCBhIGNvbnRpbnVhdGlvbiBsaW5lLCBqdXN0IGxlYXZlIGluIHRoZSBuZXdsaW5lCisJCSAgICBpZiAoc2IgPT0gbnVsbCkKKwkJCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7CisJCSAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMCwgaSkpOworCQkgICAgcyA9IHMuc3Vic3RyaW5nKGkpOworCQl9CiAJICAgIH0KIAl9CiAJaWYgKHNiICE9IG51bGwpIHsKQEAgLTEyMzksNiArMTI1MSwxNCBAQAogCSAgICByZXR1cm4gY2hhcnNldDsKIAogCVN0cmluZyBhbGlhcyA9IG1pbWUyamF2YS5nZXQoY2hhcnNldC50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOworCWlmIChhbGlhcyAhPSBudWxsKSB7CisJICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBtYXBwZWQgbmFtZSBpcyB2YWxpZCBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdAorCSAgICB0cnkgeworCQlDaGFyc2V0LmZvck5hbWUoYWxpYXMpOworCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJYWxpYXMgPSBudWxsOwkvLyBjaGFyc2V0IGFsaWFzIG5vdCB2YWxpZCwgdXNlIG9yaWdpbmFsIG5hbWUKKwkgICAgfQorCX0KIAlyZXR1cm4gYWxpYXMgPT0gbnVsbCA/IGNoYXJzZXQgOiBhbGlhczsKICAgICB9CiAKQEAgLTEyOTgsNiArMTMxOCw3IEBACiAJICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNleCkgewogCQkKIAkJY2xhc3MgTnVsbElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCQkgICAgQE92ZXJyaWRlCiAJCSAgICBwdWJsaWMgaW50IHJlYWQoKSB7CiAJCQlyZXR1cm4gMDsKIAkJICAgIH0KQEAgLTEzMzMsOCArMTM1NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBqYXZhMm1pbWU7CiAKICAgICBzdGF0aWMgewotCWphdmEybWltZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPig0MCk7Ci0JbWltZTJqYXZhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDEwKTsKKwlqYXZhMm1pbWUgPSBuZXcgSGFzaE1hcDw+KDQwKTsKKwltaW1lMmphdmEgPSBuZXcgSGFzaE1hcDw+KDE0KTsKIAogCXRyeSB7CiAJICAgIC8vIFVzZSB0aGlzIGNsYXNzJ3MgY2xhc3Nsb2FkZXIgdG8gbG9hZCB0aGUgbWFwcGluZyBmaWxlCkBAIC0xNDIyLDYgKzE0NDMsMTAgQEAKIAkgICAgbWltZTJqYXZhLnB1dCgiZXVja3IiLCAiS1NDNTYwMSIpOwogCSAgICBtaW1lMmphdmEucHV0KCJ1cy1hc2NpaSIsICJJU08tODg1OS0xIik7CiAJICAgIG1pbWUyamF2YS5wdXQoIngtdXMtYXNjaWkiLCAiSVNPLTg4NTktMSIpOworCSAgICBtaW1lMmphdmEucHV0KCJnYjIzMTIiLCAiR0IxODAzMCIpOworCSAgICBtaW1lMmphdmEucHV0KCJjcDkzNiIsICJHQjE4MDMwIik7CisJICAgIG1pbWUyamF2YS5wdXQoIm1zOTM2IiwgIkdCMTgwMzAiKTsKKwkgICAgbWltZTJqYXZhLnB1dCgiZ2JrIiwgIkdCMTgwMzAiKTsKIAl9CiAgICAgfQogCkBAIC0xNjQxLDE0ICsxNjY2LDE3IEBACiAJY2hlY2tFT0wgPSBlbmNvZGVFb2xTdHJpY3QgJiYgYnJlYWtPbk5vbkFzY2lpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWNoZWNrKGIpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXdyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlsZW4gKz0gb2ZmOwogCWZvciAoaW50IGkgPSBvZmY7IGkgPCBsZW4gOyBpKyspCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9OZXdzQWRkcmVzcy5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvTmV3c0FkZHJlc3MuamF2YQppbmRleCBiMGJhMDAzLi4zYWY4ODQzIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9OZXdzQWRkcmVzcy5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L05ld3NBZGRyZXNzLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE2IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC05MSw2ICs5MSw3IEBACiAgICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYWRkcmVzcy4gIFRoZSB0eXBlIG9mIGEgTmV3c0FkZHJlc3MKICAgICAgKiBpcyAibmV3cyIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewogCXJldHVybiAibmV3cyI7CiAgICAgfQpAQCAtMTM2LDYgKzEzNyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCQluZXdzZ3JvdXAKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCXJldHVybiBuZXdzZ3JvdXA7CiAgICAgfQpAQCAtMTQzLDYgKzE0NSw3IEBACiAgICAgLyoqCiAgICAgICogVGhlIGVxdWFsaXR5IG9wZXJhdG9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYSkgewogCWlmICghKGEgaW5zdGFuY2VvZiBOZXdzQWRkcmVzcykpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTE1Nyw2ICsxNjAsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoIGNvZGUgZm9yIHRoZSBhZGRyZXNzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJaW50IGhhc2ggPSAwOwogCWlmIChuZXdzZ3JvdXAgIT0gbnVsbCkKQEAgLTE4Miw4ICsxODYsOCBAQAogCWlmIChhZGRyZXNzZXMgPT0gbnVsbCB8fCBhZGRyZXNzZXMubGVuZ3RoID09IDApCiAJICAgIHJldHVybiBudWxsOwogCi0JU3RyaW5nQnVmZmVyIHMgPSAKLQkJbmV3IFN0cmluZ0J1ZmZlcigoKE5ld3NBZGRyZXNzKWFkZHJlc3Nlc1swXSkudG9TdHJpbmcoKSk7CisJU3RyaW5nQnVpbGRlciBzID0KKwkJbmV3IFN0cmluZ0J1aWxkZXIoKChOZXdzQWRkcmVzcylhZGRyZXNzZXNbMF0pLnRvU3RyaW5nKCkpOwogCWludCB1c2VkID0gcy5sZW5ndGgoKTsKIAlmb3IgKGludCBpID0gMTsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewogCSAgICBzLmFwcGVuZCgiLCIpOwpAQCAtMjEyLDcgKzIxNiw3IEBACiAJCQkJdGhyb3dzIEFkZHJlc3NFeGNlcHRpb24gewogCS8vIFhYWCAtIHZlcmlmeSBmb3JtYXQgb2YgbmV3c2dyb3VwIG5hbWU/CiAJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXdzZ3JvdXBzLCAiLCIpOwotCUxpc3Q8TmV3c0FkZHJlc3M+IG5nbGlzdCA9IG5ldyBBcnJheUxpc3Q8TmV3c0FkZHJlc3M+KCk7CisJTGlzdDxOZXdzQWRkcmVzcz4gbmdsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewogCSAgICBTdHJpbmcgbmcgPSBzdC5uZXh0VG9rZW4oKTsKIAkgICAgbmdsaXN0LmFkZChuZXcgTmV3c0FkZHJlc3MobmcpKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1BhcmFtZXRlckxpc3QuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1BhcmFtZXRlckxpc3QuamF2YQppbmRleCA3NDg5MmE0Li5jMWYwN2M3IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9QYXJhbWV0ZXJMaXN0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvUGFyYW1ldGVyTGlzdC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtODksNyArODksNyBAQAogICAgICAqIHdpbGwgYWxsIG1vdmUgdG8gdGhlIGVuZC4KICAgICAgKi8KICAgICAvLyBrZWVwIHBhcmFtZXRlcnMgaW4gb3JkZXIKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gbGlzdCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBsaXN0ID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogQSBzZXQgb2YgbmFtZXMgZm9yIG11bHRpLXNlZ21lbnQgcGFyYW1ldGVycyB0aGF0IHdlCkBAIC0yMDUsMTAgKzIwNSwxMiBAQAogCSAgICB0aGlzLml0ID0gaXQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewogCSAgICByZXR1cm4gaXQuaGFzTmV4dCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgbmV4dEVsZW1lbnQoKSB7CiAJICAgIHJldHVybiBpdC5uZXh0KCk7CiAJfQpAQCAtMjIwLDggKzIyMiw4IEBACiAgICAgcHVibGljIFBhcmFtZXRlckxpc3QoKSB7IAogCS8vIGluaXRpYWxpemUgb3RoZXIgY29sbGVjdGlvbnMgb25seSBpZiB0aGV5J2xsIGJlIG5lZWRlZAogCWlmIChkZWNvZGVQYXJhbWV0ZXJzKSB7Ci0JICAgIG11bHRpc2VnbWVudE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCSAgICBzbGlzdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCSAgICBtdWx0aXNlZ21lbnROYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKwkgICAgc2xpc3QgPSBuZXcgSGFzaE1hcDw+KCk7CiAJfQogICAgIH0KIApAQCAtNjI0LDggKzYyNiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIG9mIGFsbCBwYXJhbWV0ZXIgbmFtZXMgaW4gdGhpcyBsaXN0LgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5hbWVzKCkgeworICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldE5hbWVzKCkgewogCXJldHVybiBuZXcgUGFyYW1FbnVtKGxpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKSk7CiAgICAgfQogCkBAIC02MzUsNiArNjM2LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4JCVN0cmluZwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcmV0dXJuIHRvU3RyaW5nKDApOwogICAgIH0KQEAgLTcyOCw3ICs3MzAsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvU3RyaW5nQnVmZmVyIHsKIAlwcml2YXRlIGludCB1c2VkOwkvLyBrZWVwIHRyYWNrIG9mIGhvdyBtdWNoIHVzZWQgb24gY3VycmVudCBsaW5lCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogCXB1YmxpYyBUb1N0cmluZ0J1ZmZlcihpbnQgdXNlZCkgewogCSAgICB0aGlzLnVzZWQgPSB1c2VkOwpAQCAtNzU5LDYgKzc2MSw3IEBACiAJICAgIH0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvUGFyc2VFeGNlcHRpb24uamF2YQppbmRleCBkN2U0MmJlLi5kM2Q3YmI2IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC00NCw3ICs0NCw3IEBACiAKIC8qKgogICogVGhlIGV4Y2VwdGlvbiB0aHJvd24gZHVlIHRvIGFuIGVycm9yIGluIHBhcnNpbmcgUkZDODIyIAotICogb3IgTUlNRSBoZWFkZXJzCisgKiBvciBNSU1FIGhlYWRlcnMsIGluY2x1ZGluZyBtdWx0aXBhcnQgYm9kaWVzLgogICoKICAqIEBhdXRob3IgSm9obiBNYW5pCiAgKi8KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1ByZWVuY29kZWRNaW1lQm9keVBhcnQuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1ByZWVuY29kZWRNaW1lQm9keVBhcnQuamF2YQppbmRleCBkZWM2NTQ4Li4yZWU2YTZlIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9QcmVlbmNvZGVkTWltZUJvZHlQYXJ0LmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvUHJlZW5jb2RlZE1pbWVCb2R5UGFydC5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzgsNiArNzgsNyBAQAogICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2Rpbmcgc3BlY2lmaWVkIHdoZW4KICAgICAgKiB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIE1lc3NhZ2luZ0V4Y2VwdGlvbiB7CiAJcmV0dXJuIGVuY29kaW5nOwogICAgIH0KQEAgLTkxLDYgKzkyLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uIE1lc3NhZ2luZ0V4Y2VwdGlvbiBmb3Igb3RoZXIgZmFpbHVyZXMKICAgICAgKiBAc2VlIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIjd3JpdGVUbwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdpbmdFeGNlcHRpb24gewogCkBAIC0xMDMsNyArMTA1LDYgQEAKIAl9CiAKIAkvLyBGaXJzdCwgd3JpdGUgb3V0IHRoZSBoZWFkZXIKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlFbnVtZXJhdGlvbjxTdHJpbmc+IGhkckxpbmVzID0gZ2V0QWxsSGVhZGVyTGluZXMoKTsKIAl3aGlsZSAoaGRyTGluZXMuaGFzTW9yZUVsZW1lbnRzKCkpCiAJICAgIGxvcy53cml0ZWxuKGhkckxpbmVzLm5leHRFbGVtZW50KCkpOwpAQCAtMTIwLDYgKzEyMSw3IEBACiAgICAgICogRm9yY2UgdGhlIDxjb2RlPkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L2NvZGU+IGhlYWRlciB0byB1c2UKICAgICAgKiB0aGUgZW5jb2RpbmcgdGhhdCB3YXMgc3BlY2lmaWVkIHdoZW4gdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVhZGVycygpIHRocm93cyBNZXNzYWdpbmdFeGNlcHRpb24gewogCXN1cGVyLnVwZGF0ZUhlYWRlcnMoKTsKIAlNaW1lQm9keVBhcnQuc2V0RW5jb2RpbmcodGhpcywgZW5jb2RpbmcpOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvU2hhcmVkSW5wdXRTdHJlYW0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1NoYXJlZElucHV0U3RyZWFtLmphdmEKaW5kZXggYzlmMjZiOC4uMTE1Yzc3YiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvU2hhcmVkSW5wdXRTdHJlYW0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9TaGFyZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvVW5pcXVlVmFsdWUuamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL2ludGVybmV0L1VuaXF1ZVZhbHVlLmphdmEKaW5kZXggMzk1ZmU4NC4uNmZmNWYxNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvVW5pcXVlVmFsdWUuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9VbmlxdWVWYWx1ZS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzAsNyArNzAsNyBAQAogICAgICAqIGFuZCB0aGUgY3VycmVudCB0aW1lIChpbiBtaWxsaXNlY29uZHMpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUJvdW5kYXJ5VmFsdWUoKSB7Ci0JU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAlsb25nIGhhc2ggPSBzLmhhc2hDb2RlKCk7CiAKIAkvLyBVbmlxdWUgc3RyaW5nIGlzIC0tLS09X1BhcnRfPHBhcnQ+XzxoYXNoY29kZT4uPGN1cnJlbnRUaW1lPgpAQCAtMTA3LDcgKzEwNyw3IEBACiAJaWYgKGF0ID49IDApCiAJICAgIHN1ZmZpeCA9IHN1ZmZpeC5zdWJzdHJpbmcoYXQpOwogCi0JU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogCS8vIFVuaXF1ZSBzdHJpbmcgaXMgPGhhc2hjb2RlPi48aWQ+LjxjdXJyZW50VGltZT48c3VmZml4PgogCXMuYXBwZW5kKHMuaGFzaENvZGUoKSkuYXBwZW5kKCcuJykuCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9wYWNrYWdlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9pbnRlcm5ldC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWFjZTIuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvaW50ZXJuZXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tCi0KLSAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCi0gICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAgICBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQotICAgIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgotICAgIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gICAgb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwotICAgIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICAgIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLQotICAgIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgotICAgIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gICAgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlCi0gICAgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLQotICAgIE1vZGlmaWNhdGlvbnM6Ci0gICAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMKLSAgICBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotCi0gICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yCi0gICAgb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0KLSAgICBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAgICBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhCi0gICAgcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotICAgIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICAgIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQotICAgIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMKLSAgICBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICAgIGhvbGRlci4KLQotLS0+Ci0KLTwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLQotQ2xhc3NlcyBzcGVjaWZpYyB0byBJbnRlcm5ldCBtYWlsIHN5c3RlbXMuCi1UaGlzIHBhY2thZ2Ugc3VwcG9ydHMgZmVhdHVyZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gSW50ZXJuZXQgbWFpbCBzeXN0ZW1zCi1iYXNlZCBvbiB0aGUgTUlNRSBzdGFuZGFyZAotKDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyMDQ1PC9BPiwKLTxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyMDQ2PC9BPiwgYW5kCi08QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMjA0NzwvQT4pLgotVGhlIElNQVAsIFNNVFAsIGFuZCBQT1AzIHByb3RvY29scyB1c2UKLXtAbGluayBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlIE1pbWVNZXNzYWdlc30uCi08UD4KLTxBIE5BTUU9InByb3BlcnRpZXMiPgotPEg0PlByb3BlcnRpZXM8L0g0PgotPC9BPgotVGhlIEphdmFNYWlsIEFQSSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHN0YW5kYXJkIHByb3BlcnRpZXMsCi13aGljaCBtYXkgYmUgc2V0IGluIHRoZSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBvYmplY3QsIG9yIGluIHRoZQotPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBvYmplY3QuCi1UaGUgcHJvcGVydGllcyBhcmUgYWx3YXlzIHNldCBhcyBzdHJpbmdzOyB0aGUgVHlwZSBjb2x1bW4gZGVzY3JpYmVzCi1ob3cgdGhlIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gIEZvciBleGFtcGxlLCB1c2UKLTxQUkU+Ci0Jc2Vzc2lvbi5zZXRQcm9wZXJ0eSgibWFpbC5taW1lLmFkZHJlc3Muc3RyaWN0IiwgImZhbHNlIik7Ci08L1BSRT4KLXRvIHNldCB0aGUgPENPREU+bWFpbC5taW1lLmFkZHJlc3Muc3RyaWN0PC9DT0RFPiBwcm9wZXJ0eSwKLXdoaWNoIGlzIG9mIHR5cGUgYm9vbGVhbi4KLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5OYW1lPC9USD4KLTxUSD5UeXBlPC9USD4KLTxUSD5EZXNjcmlwdGlvbjwvVEg+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuYWRkcmVzcy5zdHJpY3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmFkZHJlc3Muc3RyaWN0Ij4KLTxURD5tYWlsLm1pbWUuYWRkcmVzcy5zdHJpY3Q8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotVGhlIDxjb2RlPm1haWwubWltZS5hZGRyZXNzLnN0cmljdDwvY29kZT4gc2Vzc2lvbiBwcm9wZXJ0eSBjb250cm9scwotdGhlIHBhcnNpbmcgb2YgYWRkcmVzcyBoZWFkZXJzLiAgQnkgZGVmYXVsdCwgc3RyaWN0IHBhcnNpbmcgb2YgYWRkcmVzcwotaGVhZGVycyBpcyBkb25lLiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+ImZhbHNlIjwvY29kZT4sCi1zdHJpY3QgcGFyc2luZyBpcyBub3QgZG9uZSBhbmQgbWFueSBpbGxlZ2FsIGFkZHJlc3NlcyB0aGF0IHNvbWV0aW1lcwotb2NjdXIgaW4gcmVhbCBtZXNzYWdlcyBhcmUgYWxsb3dlZC4gIFNlZSB0aGUgPGNvZGU+SW50ZXJuZXRBZGRyZXNzPC9jb2RlPgotY2xhc3MgZm9yIGRldGFpbHMuCi08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08UD4KLVRoZSBKYXZhTWFpbCBBUEkgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMsCi13aGljaCBtdXN0IGJlIHNldCBpbiB0aGUgPGNvZGU+U3lzdGVtPC9jb2RlPiBwcm9wZXJ0aWVzLgotVGhlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBzZXQgYXMgc3RyaW5nczsgdGhlIFR5cGUgY29sdW1uIGRlc2NyaWJlcwotaG93IHRoZSBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuICBGb3IgZXhhbXBsZSwgdXNlCi08UFJFPgotCVN5c3RlbS5zZXRQcm9wZXJ0eSgibWFpbC5taW1lLmRlY29kZXRleHQuc3RyaWN0IiwgImZhbHNlIik7Ci08L1BSRT4KLXRvIHNldCB0aGUgPENPREU+bWFpbC5taW1lLmRlY29kZXRleHQuc3RyaWN0PC9DT0RFPiBwcm9wZXJ0eSwKLXdoaWNoIGlzIG9mIHR5cGUgYm9vbGVhbi4KLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5OYW1lPC9USD4KLTxUSD5UeXBlPC9USD4KLTxUSD5EZXNjcmlwdGlvbjwvVEg+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuY2hhcnNldCI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuY2hhcnNldCI+Ci08VEQ+bWFpbC5taW1lLmNoYXJzZXQ8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgPGNvZGU+bWFpbC5taW1lLmNoYXJzZXQ8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSBjYW4KLWJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBNSU1FIGNoYXJzZXQgdG8gdXNlIGZvciBlbmNvZGVkIHdvcmRzCi1hbmQgdGV4dCBwYXJ0cyB0aGF0IGRvbid0IG90aGVyd2lzZSBzcGVjaWZ5IGEgY2hhcnNldC4gIE5vcm1hbGx5LCB0aGUKLWRlZmF1bHQgTUlNRSBjaGFyc2V0IGlzIGRlcml2ZWQgZnJvbSB0aGUgZGVmYXVsdCBKYXZhIGNoYXJzZXQsIGFzCi1zcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZpbGUuZW5jb2Rpbmc8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eS4gIE1vc3QKLWFwcGxpY2F0aW9ucyB3aWxsIGhhdmUgbm8gbmVlZCB0byBleHBsaWNpdGx5IHNldCB0aGUgZGVmYXVsdCBNSU1FCi1jaGFyc2V0LiAgSW4gY2FzZXMgd2hlcmUgdGhlIGRlZmF1bHQgTUlNRSBjaGFyc2V0IHRvIGJlIHVzZWQgZm9yCi1tYWlsIG1lc3NhZ2VzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjaGFyc2V0IHVzZWQgZm9yIGZpbGVzIHN0b3JlZCBvbgotdGhlIHN5c3RlbSwgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5kZWNvZGV0ZXh0LnN0cmljdCI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuZGVjb2RldGV4dC5zdHJpY3QiPgotPFREPm1haWwubWltZS5kZWNvZGV0ZXh0LnN0cmljdDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1UaGUgPGNvZGU+bWFpbC5taW1lLmRlY29kZXRleHQuc3RyaWN0PC9jb2RlPiBwcm9wZXJ0eSBjb250cm9scwotZGVjb2Rpbmcgb2YgTUlNRSBlbmNvZGVkIHdvcmRzLiAgVGhlIE1JTUUgc3BlYyByZXF1aXJlcyB0aGF0IGVuY29kZWQKLXdvcmRzIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCB3b3JkLiAgU29tZQotbWFpbGVycyBpbmNvcnJlY3RseSBpbmNsdWRlIGVuY29kZWQgd29yZHMgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuCi1JZiB0aGUgPGNvZGU+bWFpbC5taW1lLmRlY29kZXRleHQuc3RyaWN0PC9jb2RlPiBTeXN0ZW0gcHJvcGVydHkgaXMKLXNldCB0byA8Y29kZT4iZmFsc2UiPC9jb2RlPiwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZGVjb2RlIHRoZXNlCi1pbGxlZ2FsIGVuY29kZWQgd29yZHMuIFRoZSBkZWZhdWx0IGlzIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmVuY29kZWVvbC5zdHJpY3QiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmVuY29kZWVvbC5zdHJpY3QiPgotPFREPm1haWwubWltZS5lbmNvZGVlb2wuc3RyaWN0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVRoZSA8Y29kZT5tYWlsLm1pbWUuZW5jb2RlZW9sLnN0cmljdDwvY29kZT4gcHJvcGVydHkgY29udHJvbHMgdGhlCi1jaG9pY2Ugb2YgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBmb3IgTUlNRSBwYXJ0cyB0aGF0IGFyZSBub3Qgb2YKLXR5cGUgInRleHQiLiAgT2Z0ZW4gc3VjaCBwYXJ0cyB3aWxsIGNvbnRhaW4gdGV4dHVhbCBkYXRhIGZvciB3aGljaAotYW4gZW5jb2RpbmcgdGhhdCBhbGxvd3Mgbm9ybWFsIGVuZCBvZiBsaW5lIGNvbnZlbnRpb25zIGlzIGFwcHJvcHJpYXRlLgotSW4gcmFyZSBjYXNlcywgc3VjaCBhIHBhcnQgd2lsbCBhcHBlYXIgdG8gY29udGFpbiBlbnRpcmVseSB0ZXh0dWFsCi1kYXRhLCBidXQgd2lsbCByZXF1aXJlIGFuIGVuY29kaW5nIHRoYXQgcHJlc2VydmVzIENSIGFuZCBMRiBjaGFyYWN0ZXJzCi13aXRob3V0IGNoYW5nZS4gIElmIHRoZSA8Y29kZT5tYWlsLm1pbWUuZW5jb2RlZW9sLnN0cmljdDwvY29kZT4KLVN5c3RlbSBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgc3VjaCBhbiBlbmNvZGluZyB3aWxsCi1iZSB1c2VkIHdoZW4gbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmRlY29kZWZpbGVuYW1lIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5kZWNvZGVmaWxlbmFtZSI+Ci08VEQ+bWFpbC5taW1lLmRlY29kZWZpbGVuYW1lPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+LCB0aGUgPGNvZGU+Z2V0RmlsZU5hbWU8L2NvZGU+IG1ldGhvZAotdXNlcyB0aGUgPGNvZGU+TWltZVV0aWxpdHk8L2NvZGU+Ci1tZXRob2QgPGNvZGU+ZGVjb2RlVGV4dDwvY29kZT4gdG8gZGVjb2RlIGFueQotbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGVuYW1lLiAgTm90ZSB0aGF0IHRoaXMgZGVjb2RpbmcKLXZpb2xhdGVzIHRoZSBNSU1FIHNwZWNpZmljYXRpb24sIGJ1dCBpcyB1c2VmdWwgZm9yIGludGVyb3BlcmF0aW5nCi13aXRoIHNvbWUgbWFpbCBjbGllbnRzIHRoYXQgdXNlIHRoaXMgY29udmVudGlvbi4KLVRoZSBkZWZhdWx0IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5lbmNvZGVmaWxlbmFtZSI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuZW5jb2RlZmlsZW5hbWUiPgotPFREPm1haWwubWltZS5lbmNvZGVmaWxlbmFtZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgdGhlIDxjb2RlPnNldEZpbGVOYW1lPC9jb2RlPiBtZXRob2QKLXVzZXMgdGhlIDxjb2RlPk1pbWVVdGlsaXR5PC9jb2RlPgotbWV0aG9kIDxjb2RlPmVuY29kZVRleHQ8L2NvZGU+IHRvIGVuY29kZSBhbnkKLW5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlbmFtZS4gIE5vdGUgdGhhdCB0aGlzIGVuY29kaW5nCi12aW9sYXRlcyB0aGUgTUlNRSBzcGVjaWZpY2F0aW9uLCBidXQgaXMgdXNlZnVsIGZvciBpbnRlcm9wZXJhdGluZwotd2l0aCBzb21lIG1haWwgY2xpZW50cyB0aGF0IHVzZSB0aGlzIGNvbnZlbnRpb24uCi1UaGUgZGVmYXVsdCBpcyBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuZGVjb2RlcGFyYW1ldGVycyI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuZGVjb2RlcGFyYW1ldGVycyI+Ci08VEQ+bWFpbC5taW1lLmRlY29kZXBhcmFtZXRlcnM8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIDxjb2RlPiJmYWxzZSI8L2NvZGU+LCBub24tQVNDSUkgcGFyYW1ldGVycyBpbiBhCi08Y29kZT5QYXJhbWV0ZXJMaXN0PC9jb2RlPiwgZS5nLiwgaW4gYSBDb250ZW50LVR5cGUgaGVhZGVyLAotd2lsbCA8Yj5ub3Q8L2I+IGJlIGRlY29kZWQgYXMgc3BlY2lmaWVkIGJ5Ci08QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMjMxLnR4dCIgVEFSR0VUPSJfdG9wIj5SRkMgMjIzMTwvQT4uCi1UaGUgZGVmYXVsdCBpcyB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5lbmNvZGVwYXJhbWV0ZXJzIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5lbmNvZGVwYXJhbWV0ZXJzIj4KLTxURD5tYWlsLm1pbWUuZW5jb2RlcGFyYW1ldGVyczwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gPGNvZGU+ImZhbHNlIjwvY29kZT4sIG5vbi1BU0NJSSBwYXJhbWV0ZXJzIGluIGEKLTxjb2RlPlBhcmFtZXRlckxpc3Q8L2NvZGU+LCBlLmcuLCBpbiBhIENvbnRlbnQtVHlwZSBoZWFkZXIsCi13aWxsIDxiPm5vdDwvYj4gYmUgZW5jb2RlZCBhcyBzcGVjaWZpZWQgYnkKLTxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIyMzEudHh0IiBUQVJHRVQ9Il90b3AiPlJGQyAyMjMxPC9BPi4KLVRoZSBkZWZhdWx0IGlzIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLm11bHRpcGFydC5pZ25vcmVtaXNzaW5nZW5kYm91bmRhcnkiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLm11bHRpcGFydC5pZ25vcmVtaXNzaW5nZW5kYm91bmRhcnkiPgotPFREPm1haWwubWltZS5tdWx0aXBhcnQuIGlnbm9yZW1pc3NpbmdlbmRib3VuZGFyeTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1Ob3JtYWxseSwgd2hlbiBwYXJzaW5nIGEgbXVsdGlwYXJ0IE1JTUUgbWVzc2FnZSwgYSBtZXNzYWdlIHRoYXQgaXMKLW1pc3NpbmcgdGhlIGZpbmFsIGVuZCBib3VuZGFyeSBsaW5lIGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yLgotVGhlIGRhdGEgc2ltcGx5IGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBOb3RlIHRoYXQgbWVzc2FnZXMKLW9mIHRoaXMgZm9ybSB2aW9sYXRlIHRoZSBNSU1FIHNwZWNpZmljYXRpb24uICBJZiB0aGUgcHJvcGVydHkKLTxjb2RlPm1haWwubWltZS5tdWx0aXBhcnQuaWdub3JlbWlzc2luZ2VuZGJvdW5kYXJ5PC9jb2RlPiBpcyBzZXQKLXRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgc3VjaCBtZXNzYWdlcyBhcmUgY29uc2lkZXJlZCBhbiBlcnJvciBhbmQgYQotPGNvZGU+TWVzYWdpbmdFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIHdoZW4gcGFyc2luZyBzdWNoIGEKLW1lc3NhZ2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLm11bHRpcGFydC5pZ25vcmVtaXNzaW5nYm91bmRhcnlwYXJhbWV0ZXIiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLm11bHRpcGFydC5pZ25vcmVtaXNzaW5nYm91bmRhcnlwYXJhbWV0ZXIiPgotPFREPm1haWwubWltZS5tdWx0aXBhcnQuIGlnbm9yZW1pc3Npbmdib3VuZGFyeXBhcmFtZXRlcjwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBmb3IgYSBtdWx0aXBhcnQgY29udGVudCBkb2VzIG5vdCBoYXZlCi1hIDxjb2RlPmJvdW5kYXJ5PC9jb2RlPiBwYXJhbWV0ZXIsIHRoZSBtdWx0aXBhcnQgcGFyc2luZyBjb2RlCi13aWxsIGxvb2sgZm9yIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBjb250ZW50IHRoYXQgbG9va3MgbGlrZSBhCi1ib3VuZGFyeSBsaW5lIGFuZCBleHRyYWN0IHRoZSBib3VuZGFyeSBwYXJhbWV0ZXIgZnJvbSB0aGUgbGluZS4KLUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPiJmYWxzZSI8L2NvZGU+LCBhCi08Y29kZT5NZXNzYWdpbmdFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duIGlmIHRoZSBDb250ZW50LVR5cGUKLWhlYWRlciBkb2Vzbid0IHNwZWNpZnkgYSBib3VuZGFyeSBwYXJhbWV0ZXIuCi1UaGUgZGVmYXVsdCBpcyB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5tdWx0aXBhcnQuaWdub3JlZXhpc3Rpbmdib3VuZGFyeXBhcmFtZXRlciI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUubXVsdGlwYXJ0Lmlnbm9yZWV4aXN0aW5nYm91bmRhcnlwYXJhbWV0ZXIiPgotPFREPm1haWwubWltZS5tdWx0aXBhcnQuIGlnbm9yZWV4aXN0aW5nYm91bmRhcnlwYXJhbWV0ZXI8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotTm9ybWFsbHkgdGhlIGJvdW5kYXJ5IHBhcmFtZXRlciBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBvZiBhIG11bHRpcGFydAotYm9keSBwYXJ0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gcGFydHMgb2YgdGhlIG11bHRpcGFydAotYm9keS4gIFRoaXMgU3lzdGVtIHByb3BlcnR5IG1heSBiZSBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiB0byBjYXVzZQotdGhlIHBhcnNlciB0byBsb29rIGZvciBhIGxpbmUgaW4gdGhlIG11bHRpcGFydCBib2R5IHRoYXQgbG9va3MgbGlrZSBhCi1ib3VuZGFyeSBsaW5lIGFuZCB1c2UgdGhhdCB2YWx1ZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gc3Vic2VxdWVudCBwYXJ0cy4KLVRoaXMgbWF5IGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBhIGJyb2tlbiBhbnRpLXZpcnVzIHByb2R1Y3QgaGFzIHJld3JpdHRlbgotdGhlIG1lc3NhZ2UgaW5jb3JyZWN0bHkgc3VjaCB0aGF0IHRoZSBib3VuZGFyeSBwYXJhbWV0ZXIgYW5kIHRoZSBhY3R1YWwKLWJvdW5kYXJ5IHZhbHVlIG5vIGxvbmdlciBtYXRjaC4KLVRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLm11bHRpcGFydC5hbGxvd2VtcHR5Ij48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5tdWx0aXBhcnQuYWxsb3dlbXB0eSI+Ci08VEQ+bWFpbC5taW1lLm11bHRpcGFydC4gYWxsb3dlbXB0eTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1Ob3JtYWxseSwgd2hlbiB3cml0aW5nIG91dCBhIE1pbWVNdWx0aXBhcnQgdGhhdCBjb250YWlucyBubyBib2R5Ci1wYXJ0cywgb3Igd2hlbiB0cnlpbmcgdG8gcGFyc2UgYSBtdWx0aXBhcnQgbWVzc2FnZSB3aXRoIG5vIGJvZHkgcGFydHMsCi1hIDxjb2RlPk1lc3NhZ2luZ0V4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLiAgVGhlIE1JTUUgc3BlYyBkb2VzIG5vdCBhbGxvdwotbXVsdGlwYXJ0IGNvbnRlbnQgd2l0aCBubyBib2R5IHBhcnRzLiAgVGhpcwotU3lzdGVtIHByb3BlcnR5IG1heSBiZSBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLgotV2hlbiB3cml0aW5nIG91dCBzdWNoIGEgTWltZU11bHRpcGFydCwgYSBzaW5nbGUgZW1wdHkgcGFydCB3aWxsIGJlCi1pbmNsdWRlZC4gIFdoZW4gcmVhZGluZyBzdWNoIGEgbXVsdGlwYXJ0LCBhIE1pbWVNdWx0aXBhcnQgd2lsbCBiZSBjcmVhdGVkCi13aXRoIG5vIGJvZHkgcGFydHMuCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci0KLQotPFA+Ci1UaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIChSSSkgb2YKLUphdmFNYWlsLCBidXQgYXJlIG5vdCBjdXJyZW50bHkgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLgotVGhlc2UgbXVzdCBiZSBzZXQgYXMgPENPREU+U2Vzc2lvbjwvQ09ERT4gcHJvcGVydGllcy4KLVRoZSBuYW1lcywgdHlwZXMsIGRlZmF1bHRzLCBhbmQgc2VtYW50aWNzIG9mIHRoZXNlIHByb3BlcnRpZXMgbWF5Ci1jaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPk5hbWU8L1RIPgotPFRIPlR5cGU8L1RIPgotPFRIPkRlc2NyaXB0aW9uPC9USD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuYWx0ZXJuYXRlcyI+PC9BPgotPFRSIGlkPSJtYWlsLmFsdGVybmF0ZXMiPgotPFREPm1haWwuYWx0ZXJuYXRlczwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUEgc3RyaW5nIGNvbnRhaW5pbmcgb3RoZXIgZW1haWwgYWRkcmVzc2VzIHRoYXQgdGhlIGN1cnJlbnQgdXNlciBpcyBrbm93biBieS4KLVRoZSA8Y29kZT5NaW1lTWVzc2FnZTwvY29kZT4gPGNvZGU+cmVwbHk8L2NvZGU+IG1ldGhvZCB3aWxsIGVsaW1pbmF0ZSBhbnkKLW9mIHRoZXNlIGFkZHJlc3NlcyBmcm9tIHRoZSByZWNpcGllbnQgbGlzdCBpbiB0aGUgbWVzc2FnZSBpdCBjb25zdHJ1Y3RzLAotdG8gYXZvaWQgc2VuZGluZyB0aGUgcmVwbHkgYmFjayB0byB0aGUgc2VuZGVyLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucmVwbHlhbGxjYyI+PC9BPgotPFRSIGlkPSJtYWlsLnJlcGx5YWxsY2MiPgotPFREPm1haWwucmVwbHlhbGxjYzwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgdGhlIDxjb2RlPk1pbWVNZXNzYWdlPC9jb2RlPgotPGNvZGU+cmVwbHk8L2NvZGU+IG1ldGhvZCB3aWxsIHB1dCBhbGwgcmVjaXBpZW50cyBleGNlcHQgdGhlIG9yaWdpbmFsCi1zZW5kZXIgaW4gdGhlIDxjb2RlPkNjPC9jb2RlPiBsaXN0IG9mIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBtZXNzYWdlLgotTm9ybWFsbHksIHJlY2lwaWVudHMgaW4gdGhlIDxjb2RlPlRvPC9jb2RlPiBoZWFkZXIgb2YgdGhlIG9yaWdpbmFsCi1tZXNzYWdlIHdpbGwgYWxzbyBhcHBlYXIgaW4gdGhlIDxjb2RlPlRvPC9jb2RlPiBsaXN0IG9mIHRoZSBuZXdseQotY29uc3RydWN0ZWQgbWVzc2FnZS4KLTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci1UaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIChSSSkgb2YKLUphdmFNYWlsLCBidXQgYXJlIG5vdCBjdXJyZW50bHkgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLgotVGhlc2UgbXVzdCBiZSBzZXQgYXMgPENPREU+U3lzdGVtPC9DT0RFPiBwcm9wZXJ0aWVzLgotVGhlIG5hbWVzLCB0eXBlcywgZGVmYXVsdHMsIGFuZCBzZW1hbnRpY3Mgb2YgdGhlc2UgcHJvcGVydGllcyBtYXkKLWNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi08UD4KLTxUQUJMRSBCT1JERVI+Ci08VFI+Ci08VEg+TmFtZTwvVEg+Ci08VEg+VHlwZTwvVEg+Ci08VEg+RGVzY3JpcHRpb248L1RIPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmJhc2U2NC5pZ25vcmVlcnJvcnMiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmJhc2U2NC5pZ25vcmVlcnJvcnMiPgotPFREPm1haWwubWltZS5iYXNlNjQuaWdub3JlZXJyb3JzPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+LCB0aGUgQkFTRTY0IGRlY29kZXIgd2lsbCBpZ25vcmUgZXJyb3JzCi1pbiB0aGUgZW5jb2RlZCBkYXRhLCByZXR1cm5pbmcgRU9GLiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gZGVhbGluZwotd2l0aCBpbXByb3Blcmx5IGVuY29kZWQgbWVzc2FnZXMgdGhhdCBjb250YWluIGV4dHJhbmVvdXMgZGF0YSBhdCB0aGUKLWVuZCBvZiB0aGUgZW5jb2RlZCBzdHJlYW0uICBOb3RlIGhvd2V2ZXIgdGhhdCBlcnJvcnMgYW55d2hlcmUgaW4gdGhlCi1zdHJlYW0gd2lsbCBjYXVzZSB0aGUgZGVjb2RlciB0byBzdG9wIGRlY29kaW5nIHNvIHRoaXMgc2hvdWxkIGJlIHVzZWQKLXdpdGggZXh0cmVtZSBjYXV0aW9uLiAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmZvbGR0ZXh0Ij48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5mb2xkdGV4dCI+Ci08VEQ+bWFpbC5taW1lLmZvbGR0ZXh0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+LCBoZWFkZXIgZmllbGRzIGNvbnRhaW5pbmcganVzdCB0ZXh0Ci1zdWNoIGFzIHRoZSA8Y29kZT5TdWJqZWN0PC9jb2RlPiBhbmQgPGNvZGU+Q29udGVudC1EZXNjcmlwdGlvbjwvY29kZT4KLWhlYWRlciBmaWVsZHMsIGFuZCBsb25nIHBhcmFtZXRlciB2YWx1ZXMgaW4gc3RydWN0dXJlZCBoZWFkZXJzIHN1Y2gKLWFzIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gd2lsbCBiZSBmb2xkZWQgKGJyb2tlbiBpbnRvIDc2IGNoYXJhY3RlciBsaW5lcykKLXdoZW4gc2V0IGFuZCB1bmZvbGRlZCB3aGVuIHJlYWQuICBUaGUgZGVmYXVsdCBpcyB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5zZXRjb250ZW50dHlwZWZpbGVuYW1lIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5zZXRjb250ZW50dHlwZWZpbGVuYW1lIj4KLTxURD5tYWlsLm1pbWUuc2V0Y29udGVudHR5cGVmaWxlbmFtZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JZiBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgdGhlIDxjb2RlPnNldEZpbGVOYW1lPC9jb2RlPiBtZXRob2QKLXdpbGwgYWxzbyBzZXQgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IHBhcmFtZXRlciBvbiB0aGUgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPgotaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUuICBUaGlzIHN1cHBvcnRzIGludGVyb3BlcmFiaWxpdHkgd2l0aAotc29tZSBvbGQgbWFpbCBjbGllbnRzLiAgVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuc2V0ZGVmYXVsdHRleHRjaGFyc2V0Ij48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5zZXRkZWZhdWx0dGV4dGNoYXJzZXQiPgotPFREPm1haWwubWltZS5zZXRkZWZhdWx0dGV4dGNoYXJzZXQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotV2hlbiB1cGRhdGluZyB0aGUgaGVhZGVycyBvZiBhIG1lc3NhZ2UsIGEgYm9keQotcGFydCB3aXRoIGEgPGNvZGU+dGV4dDwvY29kZT4gY29udGVudCB0eXBlIGJ1dCBubyA8Y29kZT5jaGFyc2V0PC9jb2RlPgotcGFyYW1ldGVyIHdpbGwgaGF2ZSBhIDxjb2RlPmNoYXJzZXQ8L2NvZGU+IHBhcmFtZXRlciBhZGRlZCB0byBpdAotaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPi4KLVRoZSBkZWZhdWx0IGlzIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLnBhcmFtZXRlcnMuc3RyaWN0Ij48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5wYXJhbWV0ZXJzLnN0cmljdCI+Ci08VEQ+bWFpbC5taW1lLnBhcmFtZXRlcnMuc3RyaWN0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUlmIHNldCB0byBmYWxzZSwgd2hlbiByZWFkaW5nIGEgbWVzc2FnZSwgcGFyYW1ldGVyIHZhbHVlcyBpbiBoZWFkZXIgZmllbGRzCi1zdWNoIGFzIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gYW5kIDxjb2RlPkNvbnRlbnQtRGlzcG9zaXRpb248L2NvZGU+Ci1hcmUgYWxsb3dlZCB0byBjb250YWluIHdoaXRlc3BhY2UgYW5kIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyB3aXRob3V0Ci1iZWluZyBxdW90ZWQ7IHRoZSBwYXJhbWV0ZXIgdmFsdWUgZW5kcyBhdCB0aGUgbmV4dCBzZW1pY29sb24uCi1JZiBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSByZXF1aXJlZCB0byBjb25mb3JtCi10byB0aGUgTUlNRSBzcGVjaWZpY2F0aW9uIGFuZCBtdXN0IGJlIHF1b3RlZCBpZiB0aGV5IGNvbnRhaW4gd2hpdGVzcGFjZQotb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5hcHBsZWZpbGVuYW1lcyI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuYXBwbGVmaWxlbmFtZXMiPgotPFREPm1haWwubWltZS5hcHBsZWZpbGVuYW1lczwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1BcHBsZSBNYWlsIGluY29ycmVjdGx5IGVuY29kZXMgZmlsZW5hbWVzIHRoYXQgY29udGFpbiBzcGFjZXMsCi1mb3JnZXR0aW5nIHRvIHF1b3RlIHRoZSBwYXJhbWV0ZXIgdmFsdWUuICBJZiB0aGlzIHByb3BlcnR5IGlzCi1zZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgSmF2YU1haWwgd2lsbCB0cnkgdG8gZGV0ZWN0IHRoaXMKLXNpdHVhdGlvbiB3aGVuIHBhcnNpbmcgcGFyYW1ldGVycyBhbmQgd29yayBhcm91bmQgaXQuCi1UaGUgZGVmYXVsdCBpcyBmYWxzZS4KLU5vdGUgdGhhdCB0aGlzIHByb3BlcnR5IGhhbmRsZXMgYSBzdWJzZXQgb2YgdGhlIGNhc2VzIGhhbmRsZWQKLWJ5IHNldHRpbmcgdGhlIG1haWwubWltZS5wYXJhbWV0ZXJzLnN0cmljdCBwcm9wZXJ0eSB0byBmYWxzZS4KLVRoaXMgcHJvcGVydHkgd2lsbCBsaWtlbHkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS53aW5kb3dzZmlsZW5hbWVzIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS53aW5kb3dzZmlsZW5hbWVzIj4KLTxURD5tYWlsLm1pbWUud2luZG93c2ZpbGVuYW1lczwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JbnRlcm5ldCBFeHBsb3JlciA2IGluY29ycmVjdGx5IGluY2x1ZGVzIGEgY29tcGxldGUgcGF0aG5hbWUKLWluIHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgb2YgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyCi1mb3IgdXBsb2FkZWQgZmlsZXMsIGFuZCBmYWlscyB0byBwcm9wZXJseSBlc2NhcGUgdGhlIGJhY2tzbGFzaGVzCi1pbiB0aGUgcGF0aG5hbWUuICBJZiB0aGlzIHByb3BlcnR5IGlzCi1zZXQgdG8gPGNvZGU+InRydWUiPC9jb2RlPiwgSmF2YU1haWwgd2lsbCBwcmVzZXJ2ZSBhbGwgYmFja3NsYXNoZXMKLWluIHRoZSAiZmlsZW5hbWUiIGFuZCAibmFtZSIgcGFyYW1ldGVycyBvZiBhbnkgTUlNRSBoZWFkZXIuCi1UaGUgZGVmYXVsdCBpcyBmYWxzZS4KLU5vdGUgdGhhdCB0aGlzIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBNSU1FIHNwZWNpZmljYXRpb24gYnV0IG1heQotYmUgdXNlZnVsIHdoZW4gdXNpbmcgSmF2YU1haWwgdG8gcGFyc2UgSFRUUCBtZXNzYWdlcyBmb3IgdXBsb2FkZWQKLWZpbGVzIHNlbnQgYnkgSUU2LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5pZ25vcmV1bmtub3duZW5jb2RpbmciPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmlnbm9yZXVua25vd25lbmNvZGluZyI+Ci08VEQ+bWFpbC5taW1lLiBpZ25vcmV1bmtub3duZW5jb2Rpbmc8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIDxjb2RlPiJ0cnVlIjwvY29kZT4sIGFuIHVua25vd24gdmFsdWUgaW4gdGhlCi08Y29kZT5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nPC9jb2RlPiBoZWFkZXIgd2lsbCBiZSBpZ25vcmVkCi13aGVuIHJlYWRpbmcgYSBtZXNzYWdlIGFuZCBhbiBlbmNvZGluZyBvZiAiOGJpdCIgd2lsbCBiZSBhc3N1bWVkLgotSWYgc2V0IHRvIDxjb2RlPiJmYWxzZSI8L2NvZGU+LCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZvciBhbgotdW5rbm93biBlbmNvZGluZyB2YWx1ZS4gIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS51dWRlY29kZS5pZ25vcmVlcnJvcnMiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLnV1ZGVjb2RlLmlnbm9yZWVycm9ycyI+Ci08VEQ+bWFpbC5taW1lLnV1ZGVjb2RlLiBpZ25vcmVlcnJvcnM8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIDxjb2RlPiJ0cnVlIjwvY29kZT4sIGVycm9ycyBpbiB0aGUgZW5jb2RlZCBmb3JtYXQgb2YgYQotdXVlbmNvZGVkIGRvY3VtZW50IHdpbGwgYmUgaWdub3JlZCB3aGVuIHJlYWRpbmcgYSBtZXNzYWdlIHBhcnQuCi1JZiBzZXQgdG8gPGNvZGU+ImZhbHNlIjwvY29kZT4sIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZm9yIGFuCi1pbmNvcnJlY3RseSBlbmNvZGVkIG1lc3NhZ2UgcGFydC4gIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS51dWRlY29kZS5pZ25vcmVtaXNzaW5nYmVnaW5lbmQiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLnV1ZGVjb2RlLmlnbm9yZW1pc3NpbmdiZWdpbmVuZCI+Ci08VEQ+bWFpbC5taW1lLnV1ZGVjb2RlLiBpZ25vcmVtaXNzaW5nYmVnaW5lbmQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSWYgc2V0IHRvIDxjb2RlPiJ0cnVlIjwvY29kZT4sIGEgbWlzc2luZyAiYmVpbmciIG9yICJlbmQiIGxpbmUgaW4gYQotdXVlbmNvZGVkIGRvY3VtZW50IHdpbGwgYmUgaWdub3JlZCB3aGVuIHJlYWRpbmcgYSBtZXNzYWdlIHBhcnQuCi1JZiBzZXQgdG8gPGNvZGU+ImZhbHNlIjwvY29kZT4sIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZm9yIGEKLXV1ZW5jb2RlZCBtZXNzYWdlIHBhcnQgd2l0aG91dCB0aGUgcmVxdWlyZWQgImJlZ2luIiBhbmQgImVuZCIgbGluZXMuCi1UaGUgZGVmYXVsdCBpcyBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuaWdub3Jld2hpdGVzcGFjZWxpbmVzIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5pZ25vcmV3aGl0ZXNwYWNlbGluZXMiPgotPFREPm1haWwubWltZS4gaWdub3Jld2hpdGVzcGFjZWxpbmVzPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLU5vcm1hbGx5IHRoZSBoZWFkZXIgb2YgYSBNSU1FIHBhcnQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGJvZHkgYnkgYW4gZW1wdHkKLWxpbmUuICBUaGlzIFN5c3RlbSBwcm9wZXJ0eSBtYXkgYmUgc2V0IHRvIDxjb2RlPiJ0cnVlIjwvY29kZT4gdG8gY2F1c2UKLXRoZSBwYXJzZXIgdG8gY29uc2lkZXIgYSBsaW5lIGNvbnRhaW5pbmcgb25seSB3aGl0ZXNwYWNlIHRvIGJlIGFuIGVtcHR5Ci1saW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLm1pbWUuaWdub3JlbXVsdGlwYXJ0ZW5jb2RpbmciPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmlnbm9yZW11bHRpcGFydGVuY29kaW5nIj4KLTxURD5tYWlsLm1pbWUuIGlnbm9yZW11bHRpcGFydGVuY29kaW5nPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVRoZSBNSU1FIHNwZWMgZG9lcyBub3QgYWxsb3cgYm9keSBwYXJ0cyBvZiB0eXBlIG11bHRpcGFydC8qIHRvIGJlIGVuY29kZWQuCi1UaGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIgaXMgaWdub3JlZCBpbiB0aGlzIGNhc2UuCi1TZXR0aW5nIHRoaXMgU3lzdGVtIHByb3BlcnR5IHRvIDxjb2RlPiJmYWxzZSI8L2NvZGU+IHdpbGwKLWNhdXNlIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlciB0byBiZSBob25vcmVkIGZvciBtdWx0aXBhcnQKLWNvbnRlbnQuCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmFsbG93ZW5jb2RlZG1lc3NhZ2VzIj48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5hbGxvd2VuY29kZWRtZXNzYWdlcyI+Ci08VEQ+bWFpbC5taW1lLmFsbG93ZW5jb2RlZG1lc3NhZ2VzPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVRoZSBNSU1FIHNwZWMgZG9lcyBub3QgYWxsb3cgYm9keSBwYXJ0cyBvZiB0eXBlIG1lc3NhZ2UvKiB0byBiZSBlbmNvZGVkLgotVGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgotU29tZSB2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgT3V0bG9vayB3aWxsIGluY29ycmVjdGx5IGVuY29kZSBtZXNzYWdlCi1hdHRhY2htZW50cy4gIFNldHRpbmcgdGhpcyBTeXN0ZW0gcHJvcGVydHkgdG8gPGNvZGU+InRydWUiPC9jb2RlPiB3aWxsCi1jYXVzZSB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIgdG8gYmUgaG9ub3JlZCBmb3IgbWVzc2FnZQotYXR0YWNobWVudHMuCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5jb250ZW50dHlwZWhhbmRsZXIiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmNvbnRlbnR0eXBlaGFuZGxlciI+Ci08VEQ+bWFpbC5taW1lLmNvbnRlbnR0eXBlaGFuZGxlcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUluIHNvbWUgY2FzZXMgSmF2YU1haWwgaXMgdW5hYmxlIHRvIHByb2Nlc3MgbWVzc2FnZXMgd2l0aCBhbiBpbnZhbGlkCi1Db250ZW50LVR5cGUgaGVhZGVyLiAgVGhlIGhlYWRlciBtYXkgaGF2ZSBpbmNvcnJlY3Qgc3ludGF4IG9yIG90aGVyCi1wcm9ibGVtcy4gIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCB3aWxsIGJlCi11c2VkIHRvIGNsZWFuIHVwIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHZhbHVlIGJlZm9yZSBKYXZhTWFpbCB1c2VzIGl0LgotVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgc2lnbmF0dXJlOgotPENPREU+cHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW5Db250ZW50VHlwZShNaW1lUGFydCBtcCwgU3RyaW5nIGNvbnRlbnRUeXBlKTwvQ09ERT4KLVdoZW5ldmVyIEphdmFNYWlsIGFjY2Vzc2VzIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIG9mIGEgbWVzc2FnZSwgaXQKLXdpbGwgcGFzcyB0aGUgdmFsdWUgdG8gdGhpcyBtZXRob2QgYW5kIHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgaW5zdGVhZC4KLVRoZSB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBpc24ndCBwcmVzZW50LgotUmV0dXJuaW5nIG51bGwgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBDb250ZW50LVR5cGUgdG8gYmUgdXNlZC4KLVRoZSBNaW1lUGFydCBtYXkgYmUgdXNlZCB0byBhY2Nlc3Mgb3RoZXIgaGVhZGVycyBvZiB0aGUgbWVzc2FnZSBwYXJ0Ci10byBkZXRlcm1pbmUgaG93IHRvIGNvcnJlY3QgdGhlIENvbnRlbnQtVHlwZS4KLU5vdGUgdGhhdCB0aGUgQ29udGVudC1UeXBlIGhhbmRsZXIgZG9lc24ndCBhZmZlY3QgdGhlCi08Q09ERT5nZXRIZWFkZXI8L0NPREU+IG1ldGhvZCwgd2hpY2ggc3RpbGwgcmV0dXJucyB0aGUgcmF3IGhlYWRlciB2YWx1ZS4KLU5vdGUgYWxzbyB0aGF0IHRoZSBoYW5kbGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSBJTUFQIHByb3ZpZGVyOyB0aGUgSU1BUAotc2VydmVyIGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgcHJlLXBhcnNlZCwgc3ludGFjdGljYWxseSBjb3JyZWN0Ci1Db250ZW50LVR5cGUgaW5mb3JtYXRpb24uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmFkZHJlc3MudXNlY2Fub25pY2FsaG9zdG5hbWUiPjwvQT4KLTxUUiBpZD0ibWFpbC5taW1lLmFkZHJlc3MudXNlY2Fub25pY2FsaG9zdG5hbWUiPgotPFREPm1haWwubWltZS5hZGRyZXNzLnVzZWNhbm9uaWNhbGhvc3RuYW1lPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVVzZSB0aGUKLXtAbGluayBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRDYW5vbmljYWxIb3N0TmFtZSBJbmV0QWRkcmVzcy5nZXRDYW5vbmljYWxIb3N0TmFtZX0KLW1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGhvc3QgbmFtZSBpbiB0aGUKLXtAbGluayBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0QWRkcmVzcyNnZXRMb2NhbEFkZHJlc3MgSW50ZXJuZXRBZGRyZXNzLmdldExvY2FsQWRkcmVzc30KLW1ldGhvZC4KLVdpdGggc29tZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25zLCBJbmV0QWRkcmVzcy5nZXRDYW5vbmljYWxIb3N0TmFtZSBtYXkgYmUKLXNsb3cgb3IgbWF5IHJldHVybiBhbiBhZGRyZXNzIGluc3RlYWQgb2YgYSBob3N0IG5hbWUuCi1JbiB0aGF0IGNhc2UsIHNldHRpbmcgdGhpcyBTeXN0ZW0gcHJvcGVydHkgdG8gZmFsc2Ugd2lsbCBjYXVzZSB0aGUKLXtAbGluayBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRIb3N0TmFtZSBJbmV0QWRkcmVzcy5nZXRIb3N0TmFtZX0KLW1ldGhvZCB0byBiZSB1c2VkIGluc3RlYWQuCi1UaGUgZGVmYXVsdCBpcyB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci08UD4KLVRoZSBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbiBvZiBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBsb2cgZGVidWdnaW5nIGluZm9ybWF0aW9uIHVzaW5nCi17QGxpbmsgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyfSBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5Mb2dnZXIgTmFtZTwvVEg+Ci08VEg+TG9nZ2luZyBMZXZlbDwvVEg+Ci08VEg+UHVycG9zZTwvVEg+Ci08L1RSPgotCi08VFI+Ci08VEQ+amF2YXgubWFpbC5pbnRlcm5ldDwvVEQ+Ci08VEQ+RklORTwvVEQ+Ci08VEQ+R2VuZXJhbCBkZWJ1Z2dpbmcgb3V0cHV0PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9wYWNrYWdlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTdkY2UuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tCi0KLSAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCi0gICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKLSAgICBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQotICAgIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgotICAgIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gICAgb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwotICAgIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAgICBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICAgIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KLQotICAgIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgotICAgIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCi0gICAgZXhjZXB0aW9uIGFzIHByb3ZpZGVkIGJ5IE9yYWNsZSBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlCi0gICAgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLQotICAgIE1vZGlmaWNhdGlvbnM6Ci0gICAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcgYmVsb3cgdGhlIExpY2Vuc2UgSGVhZGVyLCB3aXRoIHRoZSBmaWVsZHMKLSAgICBlbmNsb3NlZCBieSBicmFja2V0cyBbXSByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAiUG9ydGlvbnMgQ29weXJpZ2h0IFt5ZWFyXSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdIgotCi0gICAgQ29udHJpYnV0b3Iocyk6Ci0gICAgSWYgeW91IHdpc2ggeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB0byBiZSBnb3Zlcm5lZCBieSBvbmx5IHRoZSBDRERMIG9yCi0gICAgb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcgIltDb250cmlidXRvcl0KLSAgICBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwKLSAgICBWZXJzaW9uIDJdIGxpY2Vuc2UuIiAgSWYgeW91IGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhCi0gICAgcmVjaXBpZW50IGhhcyB0aGUgb3B0aW9uIHRvIGRpc3RyaWJ1dGUgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotICAgIGVpdGhlciB0aGUgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0bwotICAgIGl0cyBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIgY29kZQotICAgIGFuZCB0aGVyZWZvcmUsIGVsZWN0ZWQgdGhlIEdQTCBWZXJzaW9uIDIgbGljZW5zZSwgdGhlbiB0aGUgb3B0aW9uIGFwcGxpZXMKLSAgICBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaCBvcHRpb24gYnkgdGhlIGNvcHlyaWdodAotICAgIGhvbGRlci4KLQotLS0+Ci0KLTwvSEVBRD4KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLQotVGhlIEphdmFNYWlsPHN1cD48Zm9udCBzaXplPSItMiI+VE08L2ZvbnQ+PC9zdXA+IEFQSQotcHJvdmlkZXMgY2xhc3NlcyB0aGF0IG1vZGVsIGEgbWFpbCBzeXN0ZW0uCi1UaGUgPGNvZGU+amF2YXgubWFpbDwvY29kZT4gcGFja2FnZSBkZWZpbmVzIGNsYXNzZXMgdGhhdCBhcmUgY29tbW9uIHRvCi1hbGwgbWFpbCBzeXN0ZW1zLgotVGhlIDxjb2RlPmphdmF4Lm1haWwuaW50ZXJuZXQ8L2NvZGU+IHBhY2thZ2UgZGVmaW5lcyBjbGFzc2VzIHRoYXQgYXJlIHNwZWNpZmljCi10byBtYWlsIHN5c3RlbXMgYmFzZWQgb24gaW50ZXJuZXQgc3RhbmRhcmRzIHN1Y2ggYXMgTUlNRSwgU01UUCwgUE9QMywgYW5kIElNQVAuCi1UaGUgSmF2YU1haWwgQVBJIGluY2x1ZGVzIHRoZSA8Y29kZT5qYXZheC5tYWlsPC9jb2RlPiBwYWNrYWdlIGFuZCBzdWJwYWNrYWdlcy4KLTxQPgotRm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBKYXZhTWFpbCBBUEksIHJlYWQgdGhlCi08QSBIUkVGPSJodHRwOi8vamF2YW1haWwuamF2YS5uZXQvbm9uYXYvZG9jcy9KYXZhTWFpbC0xLjUucGRmIiBUQVJHRVQ9Il90b3AiPgotSmF2YU1haWwgc3BlY2lmaWNhdGlvbjwvQT4uCi08UD4KLVRoZSBjb2RlIHRvIHNlbmQgYSBwbGFpbiB0ZXh0IG1lc3NhZ2UgY2FuIGJlIGFzIHNpbXBsZSBhcyB0aGUgZm9sbG93aW5nOgotPFBSRT4KLSAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICBwcm9wcy5wdXQoIm1haWwuc210cC5ob3N0IiwgIm15LW1haWwtc2VydmVyIik7Ci0gICAgU2Vzc2lvbiBzZXNzaW9uID0gU2Vzc2lvbi5nZXRJbnN0YW5jZShwcm9wcywgbnVsbCk7Ci0KLSAgICB0cnkgewotCU1pbWVNZXNzYWdlIG1zZyA9IG5ldyBNaW1lTWVzc2FnZShzZXNzaW9uKTsKLQltc2cuc2V0RnJvbSgibWVAZXhhbXBsZS5jb20iKTsKLQltc2cuc2V0UmVjaXBpZW50cyhNZXNzYWdlLlJlY2lwaWVudFR5cGUuVE8sCi0JCQkgICJ5b3VAZXhhbXBsZS5jb20iKTsKLQltc2cuc2V0U3ViamVjdCgiSmF2YU1haWwgaGVsbG8gd29ybGQgZXhhbXBsZSIpOwotCW1zZy5zZXRTZW50RGF0ZShuZXcgRGF0ZSgpKTsKLQltc2cuc2V0VGV4dCgiSGVsbG8sIHdvcmxkIVxuIik7Ci0JVHJhbnNwb3J0LnNlbmQobXNnLCAibWVAZXhhbXBsZS5jb20iLCAibXktcGFzc3dvcmQiKTsKLSAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gbWV4KSB7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJzZW5kIGZhaWxlZCwgZXhjZXB0aW9uOiAiICsgbWV4KTsKLSAgICB9Ci08L1BSRT4KLVRoZSBKYXZhTWFpbCBkb3dubG9hZCBidW5kbGUgY29udGFpbnMgbWFueSBtb3JlIGNvbXBsZXRlIGV4YW1wbGVzCi1pbiB0aGUgImRlbW8iIGRpcmVjdG9yeS4KLTxQPgotRG9uJ3QgZm9yZ2V0IHRvIHNlZSB0aGUKLTxBIEhSRUY9Imh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2phdmFtYWlsL2ZhcS8iIFRBUkdFVD0iX3RvcCI+Ci1KYXZhTWFpbCBBUEkgRkFRPC9BPgotZm9yIGFuc3dlcnMgdG8gdGhlIG1vc3QgY29tbW9uIHF1ZXN0aW9ucy4KLVRoZSA8QSBIUkVGPSJodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhbWFpbC8iIFRBUkdFVD0iX3RvcCI+Ci1KYXZhTWFpbCB3ZWIgc2l0ZTwvQT4KLWNvbnRhaW5zIG1hbnkgYWRkaXRpb25hbCByZXNvdXJjZXMuCi08UD4KLTxBIE5BTUU9InByb3BlcnRpZXMiPgotPEg0PlByb3BlcnRpZXM8L0g0PgotPC9BPgotVGhlIEphdmFNYWlsIEFQSSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHN0YW5kYXJkIHByb3BlcnRpZXMsCi13aGljaCBtYXkgYmUgc2V0IGluIHRoZSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBvYmplY3QsIG9yIGluIHRoZQotPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBvYmplY3QuCi1UaGUgcHJvcGVydGllcyBhcmUgYWx3YXlzIHNldCBhcyBzdHJpbmdzOyB0aGUgVHlwZSBjb2x1bW4gZGVzY3JpYmVzCi1ob3cgdGhlIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gIEZvciBleGFtcGxlLCB1c2UKLTxQUkU+Ci0JcHJvcHMucHV0KCJtYWlsLmRlYnVnIiwgInRydWUiKTsKLTwvUFJFPgotdG8gc2V0IHRoZSA8Y29kZT5tYWlsLmRlYnVnPC9jb2RlPiBwcm9wZXJ0eSwgd2hpY2ggaXMgb2YgdHlwZSBib29sZWFuLgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPk5hbWU8L1RIPgotPFRIPlR5cGU8L1RIPgotPFRIPkRlc2NyaXB0aW9uPC9USD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuZGVidWciPjwvQT4KLTxUUiBpZD0ibWFpbC5kZWJ1ZyI+Ci08VEQ+bWFpbC5kZWJ1ZzwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1UaGUgaW5pdGlhbCBkZWJ1ZyBtb2RlLgotRGVmYXVsdCBpcyBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmZyb20iPjwvQT4KLTxUUiBpZD0ibWFpbC5mcm9tIj4KLTxURD5tYWlsLmZyb208L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgcmV0dXJuIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgdXNlciwgdXNlZCBieSB0aGUKLTxjb2RlPkludGVybmV0QWRkcmVzczwvY29kZT4gbWV0aG9kIDxjb2RlPmdldExvY2FsQWRkcmVzczwvY29kZT4uCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5taW1lLmFkZHJlc3Muc3RyaWN0Ij48L0E+Ci08VFIgaWQ9Im1haWwubWltZS5hZGRyZXNzLnN0cmljdCI+Ci08VEQ+bWFpbC5taW1lLmFkZHJlc3Muc3RyaWN0PC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLVRoZSBNaW1lTWVzc2FnZSBjbGFzcyB1c2VzIHRoZSA8Y29kZT5JbnRlcm5ldEFkZHJlc3M8L2NvZGU+IG1ldGhvZAotPGNvZGU+cGFyc2VIZWFkZXI8L2NvZGU+IHRvIHBhcnNlIGhlYWRlcnMgaW4gbWVzc2FnZXMuICBUaGlzIHByb3BlcnR5Ci1jb250cm9scyB0aGUgc3RyaWN0IGZsYWcgcGFzc2VkIHRvIHRoZSA8Y29kZT5wYXJzZUhlYWRlcjwvY29kZT4KLW1ldGhvZC4gIFRoZSBkZWZhdWx0IGlzIHRydWUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5ob3N0Ij48L0E+Ci08VFIgaWQ9Im1haWwuaG9zdCI+Ci08VEQ+bWFpbC5ob3N0PC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotVGhlIGRlZmF1bHQgaG9zdCBuYW1lIG9mIHRoZSBtYWlsIHNlcnZlciBmb3IgYm90aCBTdG9yZXMgYW5kIFRyYW5zcG9ydHMuCi1Vc2VkIGlmIHRoZSA8Y29kZT5tYWlsLjxpPnByb3RvY29sPC9pPi5ob3N0PC9jb2RlPiBwcm9wZXJ0eSBpc24ndCBzZXQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5zdG9yZS5wcm90b2NvbCI+PC9BPgotPFRSIGlkPSJtYWlsLnN0b3JlLnByb3RvY29sIj4KLTxURD5tYWlsLnN0b3JlLnByb3RvY29sPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBkZWZhdWx0IG1lc3NhZ2UgYWNjZXNzIHByb3RvY29sLiAgVGhlCi08Y29kZT5TZXNzaW9uPC9jb2RlPiBtZXRob2QgPGNvZGU+Z2V0U3RvcmUoKTwvY29kZT4gcmV0dXJucyBhIFN0b3JlCi1vYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wuICBCeSBkZWZhdWx0IHRoZSBmaXJzdCBTdG9yZQotcHJvdmlkZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMgcmV0dXJuZWQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC50cmFuc3BvcnQucHJvdG9jb2wiPjwvQT4KLTxUUiBpZD0ibWFpbC50cmFuc3BvcnQucHJvdG9jb2wiPgotPFREPm1haWwudHJhbnNwb3J0LnByb3RvY29sPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBkZWZhdWx0IG1lc3NhZ2UgdHJhbnNwb3J0IHByb3RvY29sLiAgVGhlCi08Y29kZT5TZXNzaW9uPC9jb2RlPiBtZXRob2QgPGNvZGU+Z2V0VHJhbnNwb3J0KCk8L2NvZGU+IHJldHVybnMgYSBUcmFuc3BvcnQKLW9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhpcyBwcm90b2NvbC4gIEJ5IGRlZmF1bHQgdGhlIGZpcnN0IFRyYW5zcG9ydAotcHJvdmlkZXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMgcmV0dXJuZWQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC51c2VyIj48L0E+Ci08VFIgaWQ9Im1haWwudXNlciI+Ci08VEQ+bWFpbC51c2VyPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotVGhlIGRlZmF1bHQgdXNlciBuYW1lIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIG1haWwgc2VydmVyLgotVXNlZCBpZiB0aGUgPGNvZGU+bWFpbC48aT5wcm90b2NvbDwvaT4udXNlcjwvY29kZT4gcHJvcGVydHkgaXNuJ3Qgc2V0LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucHJvdG9jb2wuY2xhc3MiPjwvQT4KLTxUUiBpZD0ibWFpbC5wcm90b2NvbC5jbGFzcyI+Ci08VEQ+bWFpbC48aT5wcm90b2NvbDwvaT4uY2xhc3M8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBwcm92aWRlciBmb3IgdGhlCi1zcGVjaWZpZWQgcHJvdG9jb2wuICBVc2VkIGluIGNhc2VzIHdoZXJlIG1vcmUgdGhhbiBvbmUgcHJvdmlkZXIKLWZvciBhIGdpdmVuIHByb3RvY29sIGV4aXN0czsgdGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci13aGljaCBwcm92aWRlciB0byB1c2UgYnkgZGVmYXVsdC4gIFRoZSBwcm92aWRlciBtdXN0IHN0aWxsIGJlIGxpc3RlZAotaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wcm90b2NvbC5ob3N0Ij48L0E+Ci08VFIgaWQ9Im1haWwucHJvdG9jb2wuaG9zdCI+Ci08VEQ+bWFpbC48aT5wcm90b2NvbDwvaT4uaG9zdDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVRoZSBob3N0IG5hbWUgb2YgdGhlIG1haWwgc2VydmVyIGZvciB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotT3ZlcnJpZGVzIHRoZSA8Y29kZT5tYWlsLmhvc3Q8L2NvZGU+IHByb3BlcnR5LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucHJvdG9jb2wucG9ydCI+PC9BPgotPFRSIGlkPSJtYWlsLnByb3RvY29sLnBvcnQiPgotPFREPm1haWwuPGk+cHJvdG9jb2w8L2k+LnBvcnQ8L1REPgotPFREPmludDwvVEQ+Ci08VEQ+Ci1UaGUgcG9ydCBudW1iZXIgb2YgdGhlIG1haWwgc2VydmVyIGZvciB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotSWYgbm90IHNwZWNpZmllZCB0aGUgcHJvdG9jb2wncyBkZWZhdWx0IHBvcnQgbnVtYmVyIGlzIHVzZWQuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5wcm90b2NvbC51c2VyIj48L0E+Ci08VFIgaWQ9Im1haWwucHJvdG9jb2wudXNlciI+Ci08VEQ+bWFpbC48aT5wcm90b2NvbDwvaT4udXNlcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVRoZSB1c2VyIG5hbWUgdG8gdXNlIHdoZW4gY29ubmVjdGluZyB0byBtYWlsIHNlcnZlcnMKLXVzaW5nIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi1PdmVycmlkZXMgdGhlIDxjb2RlPm1haWwudXNlcjwvY29kZT4gcHJvcGVydHkuCi08L1REPgotPC9UUj4KLQotPC9UQUJMRT4KLQotPFA+Ci1UaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIChSSSkgb2YKLUphdmFNYWlsLCBidXQgYXJlIG5vdCBjdXJyZW50bHkgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLgotVGhlIG5hbWVzLCB0eXBlcywgZGVmYXVsdHMsIGFuZCBzZW1hbnRpY3Mgb2YgdGhlc2UgcHJvcGVydGllcyBtYXkKLWNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuCi08UD4KLTxUQUJMRSBCT1JERVI+Ci08VFI+Ci08VEg+TmFtZTwvVEg+Ci08VEg+VHlwZTwvVEg+Ci08VEg+RGVzY3JpcHRpb248L1RIPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5kZWJ1Zy5hdXRoIj48L0E+Ci08VFIgaWQ9Im1haWwuZGVidWcuYXV0aCI+Ci08VEQ+bWFpbC5kZWJ1Zy5hdXRoPC9URD4KLTxURD5ib29sZWFuPC9URD4KLTxURD4KLUluY2x1ZGUgcHJvdG9jb2wgYXV0aGVudGljYXRpb24gY29tbWFuZHMgKGluY2x1ZGluZyB1c2VybmFtZXMgYW5kIHBhc3N3b3JkcykKLWluIHRoZSBkZWJ1ZyBvdXRwdXQuCi1EZWZhdWx0IGlzIGZhbHNlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuZGVidWcuYXV0aC51c2VybmFtZSI+PC9BPgotPFRSIGlkPSJtYWlsLmRlYnVnLmF1dGgudXNlcm5hbWUiPgotPFREPm1haWwuZGVidWcuYXV0aC51c2VybmFtZTwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JbmNsdWRlIHRoZSB1c2VyIG5hbWUgaW4gbm9uLXByb3RvY29sIGRlYnVnIG91dHB1dC4KLURlZmF1bHQgaXMgdHJ1ZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmRlYnVnLmF1dGgucGFzc3dvcmQiPjwvQT4KLTxUUiBpZD0ibWFpbC5kZWJ1Zy5hdXRoLnBhc3N3b3JkIj4KLTxURD5tYWlsLmRlYnVnLmF1dGgucGFzc3dvcmQ8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotSW5jbHVkZSB0aGUgcGFzc3dvcmQgaW4gbm9uLXByb3RvY29sIGRlYnVnIG91dHB1dC4KLURlZmF1bHQgaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC50cmFuc3BvcnQucHJvdG9jb2wuYWRkcmVzcy10eXBlIj48L0E+Ci08VFIgaWQ9Im1haWwudHJhbnNwb3J0LnByb3RvY29sLmFkZHJlc3MtdHlwZSI+Ci08VEQ+bWFpbC50cmFuc3BvcnQucHJvdG9jb2wuPGk+YWRkcmVzcy10eXBlPC9pPjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgZGVmYXVsdCBtZXNzYWdlIHRyYW5zcG9ydCBwcm90b2NvbCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHR5cGUuCi1UaGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gbWV0aG9kIDxjb2RlPmdldFRyYW5zcG9ydChBZGRyZXNzKTwvY29kZT4gcmV0dXJucyBhCi1UcmFuc3BvcnQgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGlzIHByb3RvY29sIHdoZW4gdGhlIGFkZHJlc3MgaXMgb2YgdGhlCi1zcGVjaWZpZWQgdHlwZSAoZS5nLiwgInJmYzgyMiIgZm9yIHN0YW5kYXJkIGludGVybmV0IGFkZHJlc3NlcykuCi1CeSBkZWZhdWx0IHRoZSBmaXJzdCBUcmFuc3BvcnQgY29uZmlndXJlZCBmb3IgdGhhdCBhZGRyZXNzIHR5cGUgaXMgdXNlZC4KLVRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIHRoZQote0BsaW5rIGphdmF4Lm1haWwuVHJhbnNwb3J0I3NlbmQgc2VuZH0gbWV0aG9kIG9mIHRoZQote0BsaW5rIGphdmF4Lm1haWwuVHJhbnNwb3J0IFRyYW5zcG9ydH0gY2xhc3Mgc28gdGhhdCAoZm9yIGV4YW1wbGUpIHRoZSAic210cHMiCi1wcm90b2NvbCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlICJzbXRwIiBwcm90b2NvbCBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0eQotPGNvZGU+bWFpbC50cmFuc3BvcnQucHJvdG9jb2wucmZjODIyPC9jb2RlPiB0byA8Y29kZT4ic210cHMiPC9jb2RlPi4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmV2ZW50LnNjb3BlIj48L0E+Ci08VFIgaWQ9Im1haWwuZXZlbnQuc2NvcGUiPgotPFREPm1haWwuZXZlbnQuc2NvcGU8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1Db250cm9scyB0aGUgc2NvcGUgb2YgZXZlbnRzLiAgKFNlZSB0aGUgamF2YXgubWFpbC5ldmVudCBwYWNrYWdlLikKLUJ5IGRlZmF1bHQsIGEgc2VwYXJhdGUgZXZlbnQgcXVldWUgYW5kIHRocmVhZCBpcyB1c2VkIGZvciBldmVudHMgZm9yIGVhY2gKLVN0b3JlLCBUcmFuc3BvcnQsIG9yIEZvbGRlci4KLUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvICJzZXNzaW9uIiwgYWxsIHN1Y2ggZXZlbnRzIGFyZSBwdXQgaW4gYSBzaW5nbGUKLWV2ZW50IHF1ZXVlIHByb2Nlc3NlZCBieSBhIHNpbmdsZSB0aHJlYWQgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uCi1JZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byAiYXBwbGljYXRpb24iLCBhbGwgc3VjaCBldmVudHMgYXJlIHB1dCBpbiBhIHNpbmdsZQotZXZlbnQgcXVldWUgcHJvY2Vzc2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBmb3IgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24uCi0oQXBwbGljYXRpb25zIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIGNvbnRleHQgY2xhc3MgbG9hZGVyLikKLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmV2ZW50LmV4ZWN1dG9yIj48L0E+Ci08VFIgaWQ9Im1haWwuZXZlbnQuZXhlY3V0b3IiPgotPFREPm1haWwuZXZlbnQuZXhlY3V0b3I8L1REPgotPFREPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9URD4KLTxURD4KLUJ5IGRlZmF1bHQsIGEgbmV3IFRocmVhZCBpcyBjcmVhdGVkIGZvciBlYWNoIGV2ZW50IHF1ZXVlLgotVGhpcyB0aHJlYWQgaXMgdXNlZCB0byBjYWxsIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZXNlIGV2ZW50cy4KLUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIGFuIGluc3RhbmNlIG9mIGFuIEV4ZWN1dG9yLCB0aGUKLUV4ZWN1dG9yLmV4ZWN1dGUgbWV0aG9kIGlzIHVzZWQgdG8gcnVuIHRoZSBldmVudCBkaXNwYXRjaGVyCi1mb3IgYW4gZXZlbnQgcXVldWUuICBUaGUgZXZlbnQgZGlzcGF0Y2hlciBydW5zIHVudGlsIHRoZQotZXZlbnQgcXVldWUgaXMgbm8gbG9uZ2VyIGluIHVzZS4KLTwvVEQ+Ci08L1RSPgotCi08L1RBQkxFPgotCi08UD4KLVRoZSBKYXZhTWFpbCBBUEkgYWxzbyBzdXBwb3J0cyBzZXZlcmFsIFN5c3RlbSBwcm9wZXJ0aWVzOwotc2VlIHRoZSB7QGxpbmsgamF2YXgubWFpbC5pbnRlcm5ldH0gcGFja2FnZSBkb2N1bWVudGF0aW9uCi1mb3IgZGV0YWlscy4KLQotPFA+Ci1UaGUgSmF2YU1haWwgcmVmZXJlbmNlCi1pbXBsZW1lbnRhdGlvbiBpbmNsdWRlcyBwcm90b2NvbCBwcm92aWRlcnMgaW4gc3VicGFja2FnZXMgb2YKLTxjb2RlPmNvbS5zdW4ubWFpbDwvY29kZT4uICBOb3RlIHRoYXQgdGhlIEFQSXMgdG8gdGhlc2UgcHJvdG9jb2wKLXByb3ZpZGVycyBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIEphdmFNYWlsIEFQSS4gIFBvcnRhYmxlCi1wcm9ncmFtcyB3aWxsIG5vdCB1c2UgdGhlc2UgQVBJcy4KLTxQPgotTm9ucG9ydGFibGUgcHJvZ3JhbXMgbWF5IHVzZSB0aGUgQVBJcyBvZiB0aGUgcHJvdG9jb2wgcHJvdmlkZXJzCi1ieSAoZm9yIGV4YW1wbGUpIGNhc3RpbmcgYSByZXR1cm5lZCA8Y29kZT5Gb2xkZXI8L2NvZGU+IG9iamVjdCB0byBhCi08Y29kZT5jb20uc3VuLm1haWwuaW1hcC5JTUFQRm9sZGVyPC9jb2RlPiBvYmplY3QuICBTaW1pbGFybHkgZm9yCi08Y29kZT5TdG9yZTwvY29kZT4gYW5kIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGUKLXN0YW5kYXJkIEphdmFNYWlsIEFQSXMuCi08UD4KLVRoZSBwcm90b2NvbCBwcm92aWRlcnMgYWxzbyBzdXBwb3J0IHByb3BlcnRpZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8KLXRob3NlIHByb3ZpZGVycy4gIFRoZSBwYWNrYWdlIGRvY3VtZW50YXRpb24gZm9yIHRoZQote0BsaW5rIGNvbS5zdW4ubWFpbC5pbWFwIElNQVB9LCB7QGxpbmsgY29tLnN1bi5tYWlsLnBvcDMgUE9QM30sCi1hbmQge0BsaW5rIGNvbS5zdW4ubWFpbC5zbXRwIFNNVFB9IHBhY2thZ2VzIHByb3ZpZGUgZGV0YWlscy4KLTxQPgotSW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgZGVidWdnaW5nIG91dHB1dCBhcyBjb250cm9sbGVkIGJ5IHRoZQote0BsaW5rIGphdmF4Lm1haWwuU2Vzc2lvbiBTZXNzaW9ufSBjb25maWd1cmF0aW9uLCB0aGUgY3VycmVudAotaW1wbGVtZW50YXRpb24gb2YgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgbG9nIHRoZSBzYW1lIGluZm9ybWF0aW9uIHVzaW5nCi17QGxpbmsgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyfSBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5Mb2dnZXIgTmFtZTwvVEg+Ci08VEg+TG9nZ2luZyBMZXZlbDwvVEg+Ci08VEg+UHVycG9zZTwvVEg+Ci08L1RSPgotCi08VFI+Ci08VEQ+amF2YXgubWFpbDwvVEQ+Ci08VEQ+Q09ORklHPC9URD4KLTxURD5Db25maWd1cmF0aW9uIG9mIHRoZSBTZXNzaW9uPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5qYXZheC5tYWlsPC9URD4KLTxURD5GSU5FPC9URD4KLTxURD5HZW5lcmFsIGRlYnVnZ2luZyBvdXRwdXQ8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9BZGRyZXNzU3RyaW5nVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FkZHJlc3NTdHJpbmdUZXJtLmphdmEKaW5kZXggOWI2ZDAwZS4uMTMyMzNiZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FkZHJlc3NTdHJpbmdUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FkZHJlc3NTdHJpbmdUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC05NSw2ICs5NSw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIEFkZHJlc3NTdHJpbmdUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FkZHJlc3NUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvQWRkcmVzc1Rlcm0uamF2YQppbmRleCA1NDdhOWY4Li4yMTFmYzVjIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvQWRkcmVzc1Rlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvQWRkcmVzc1Rlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTg1LDYgKzg1LDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgQWRkcmVzc1Rlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CkBAIC05NSw2ICs5Niw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2hDb2RlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCXJldHVybiBhZGRyZXNzLmhhc2hDb2RlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FuZFRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9BbmRUZXJtLmphdmEKaW5kZXggNTRiNDNlYy4uMjdhODg2OCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0FuZFRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvQW5kVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTAzLDYgKzEwMyw3IEBACiAgICAgICoJCQlhbmQgdGhlIEFORCBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIHRoZWlyIHJlc3VsdHMuCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgQU5EIHN1Y2NlZHMsIG90aGVyd2lzZSBmYWxzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKE1lc3NhZ2UgbXNnKSB7CiAJZm9yIChpbnQgaT0wOyBpIDwgdGVybXMubGVuZ3RoOyBpKyspCiAJICAgIGlmICghdGVybXNbaV0ubWF0Y2gobXNnKSkKQEAgLTExMyw2ICsxMTQsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBBbmRUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTI4LDYgKzEzMCw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2hDb2RlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCWludCBoYXNoID0gMDsKIAlmb3IgKGludCBpPTA7IGkgPCB0ZXJtcy5sZW5ndGg7IGkrKykKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9Cb2R5VGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0JvZHlUZXJtLmphdmEKaW5kZXggOTBkY2ZiNC4uMzYzM2ZhYyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0JvZHlUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0JvZHlUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03MSw2ICs3MSw3IEBACiAgICAgICogQHBhcmFtIG1zZwlUaGUgcGF0dGVybiBzZWFyY2ggaXMgYXBwbGllZCBvbiB0aGlzIE1lc3NhZ2UncyBib2R5CiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgcGF0dGVybiBpcyBmb3VuZDsgb3RoZXJ3aXNlIGZhbHNlIAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKE1lc3NhZ2UgbXNnKSB7CiAJcmV0dXJuIG1hdGNoUGFydChtc2cpOwogICAgIH0KQEAgLTExNyw2ICsxMTgsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBCb2R5VGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9Db21wYXJpc29uVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0NvbXBhcmlzb25UZXJtLmphdmEKaW5kZXggZjcxNDhlMS4uN2IxY2QyZSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0NvbXBhcmlzb25UZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0NvbXBhcmlzb25UZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02Nyw2ICs2Nyw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIENvbXBhcmlzb25UZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzcsNiArNzgsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gY29tcGFyaXNvbjsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvRGF0ZVRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9EYXRlVGVybS5qYXZhCmluZGV4IGM1YmRlMzAuLjVkYTE5MzMgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9EYXRlVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9EYXRlVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTE0LDYgKzExNCw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIERhdGVUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTI0LDYgKzEyNSw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2hDb2RlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCXJldHVybiBkYXRlLmhhc2hDb2RlKCkgKyBzdXBlci5oYXNoQ29kZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9GbGFnVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0ZsYWdUZXJtLmphdmEKaW5kZXggODFmMDAwZi4uZDRiZDI2OSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0ZsYWdUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0ZsYWdUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMDQsNiArMTA0LDcgQEAKICAgICAgKiBAcGFyYW0gbXNnCVRoZSBmbGFnIGNvbXBhcmlzb24gaXMgYXBwbGllZCB0byB0aGlzIE1lc3NhZ2UKICAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBjb21wYXJzb24gc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCiAJdHJ5IHsKQEAgLTE0OSw2ICsxNTAsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBGbGFnVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTE1OSw2ICsxNjEsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gc2V0ID8gZmxhZ3MuaGFzaENvZGUoKSA6IH5mbGFncy5oYXNoQ29kZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9Gcm9tU3RyaW5nVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21TdHJpbmdUZXJtLmphdmEKaW5kZXggNDg4Njg3Yy4uMDc5ODFkOCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21TdHJpbmdUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21TdHJpbmdUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03NSw2ICs3NSw3IEBACiAgICAgICoJCSAgICAJYWRkcmVzcy4KICAgICAgKiBAcmV0dXJuICAgICAgICAgIHRydWUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlBZGRyZXNzW10gZnJvbTsKIApAQCAtOTYsNiArOTcsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBGcm9tU3RyaW5nVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9Gcm9tVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21UZXJtLmphdmEKaW5kZXggNTFlYTIyMy4uNWFlMmEzNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21UZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0Zyb21UZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC02Nyw2ICs2Nyw3IEBACiAgICAgICogQHBhcmFtIG1zZwlUaGUgYWRkcmVzcyBjb21wYXJpc29uIGlzIGFwcGxpZWQgdG8gdGhpcyBNZXNzYWdlCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlBZGRyZXNzW10gZnJvbTsKIApAQCAtODgsNiArODksNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBGcm9tVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9IZWFkZXJUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvSGVhZGVyVGVybS5qYXZhCmluZGV4IGYxOTI2Y2MuLjJkNWY4ZDEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9IZWFkZXJUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0hlYWRlclRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTg2LDYgKzg2LDcgQEAKICAgICAgKiBAcGFyYW0gbXNnCVRoZSBtYXRjaCBpcyBhcHBsaWVkIHRvIHRoaXMgTWVzc2FnZSdzIGhlYWRlcgogICAgICAqIEByZXR1cm4JCXRydWUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCVN0cmluZ1tdIGhlYWRlcnM7CiAKQEAgLTEwNyw2ICsxMDgsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBIZWFkZXJUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE4LDYgKzEyMCw3IEBACiAgICAgLyoqCiAgICAgICogQ29tcHV0ZSBhIGhhc2hDb2RlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCS8vIFhYWCAtIGRlcGVuZHMgb24gaGVhZGVyIGNvbXBhcmlzb25zIGJlaW5nIGNhc2UgaW5kZXBlbmRlbnQKIAlyZXR1cm4gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuaGFzaENvZGUoKSArCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvSW50ZWdlckNvbXBhcmlzb25UZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvSW50ZWdlckNvbXBhcmlzb25UZXJtLmphdmEKaW5kZXggZmUwMTg0MS4uY2UyZThlNSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL0ludGVnZXJDb21wYXJpc29uVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9JbnRlZ2VyQ29tcGFyaXNvblRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTEwMSw2ICsxMDEsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBJbnRlZ2VyQ29tcGFyaXNvblRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTEsNiArMTEyLDcgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlIGEgaGFzaENvZGUgZm9yIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJcmV0dXJuIG51bWJlciArIHN1cGVyLmhhc2hDb2RlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL01lc3NhZ2VJRFRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9NZXNzYWdlSURUZXJtLmphdmEKaW5kZXggNTg3ZDNkYS4uY2VlNDMxNyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL01lc3NhZ2VJRFRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvTWVzc2FnZUlEVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzQsNiArNzQsNyBAQAogICAgICAqCQkJTWVzc2FnZS1JRCBoZWFkZXIKICAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBtYXRjaCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlTdHJpbmdbXSBzOwogCkBAIC05NSw2ICs5Niw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VJRFRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvTWVzc2FnZU51bWJlclRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9NZXNzYWdlTnVtYmVyVGVybS5qYXZhCmluZGV4IDFjMWZlOTkuLjU3NjA2MmQgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9NZXNzYWdlTnVtYmVyVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9NZXNzYWdlTnVtYmVyVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNjcsNiArNjcsNyBAQAogICAgICAqIEBwYXJhbSBtc2cJdGhlIE1lc3NhZ2UgbnVtYmVyIGlzIG1hdGNoZWQgd2l0aCB0aGlzIE1lc3NhZ2UKICAgICAgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBtYXRjaCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlpbnQgbXNnbm87CiAKQEAgLTgyLDYgKzgzLDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgTWVzc2FnZU51bWJlclRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvTm90VGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL05vdFRlcm0uamF2YQppbmRleCBiMDRkMzcxLi41ZGI1MmZiIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvTm90VGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9Ob3RUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC03Miw2ICs3Miw3IEBACiAgICAgfQogCiAgICAgLyogVGhlIE5PVCBvcGVyYXRpb24gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCXJldHVybiAhdGVybS5tYXRjaChtc2cpOwogICAgIH0KQEAgLTc5LDYgKzgwLDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgTm90VGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTg5LDYgKzkxLDcgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlIGEgaGFzaENvZGUgZm9yIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJcmV0dXJuIHRlcm0uaGFzaENvZGUoKSA8PCAxOwogICAgIH0KZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9PclRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9PclRlcm0uamF2YQppbmRleCA5ZDRlMGFmLi5hNGE0NmQxIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvT3JUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL09yVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNSBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtMTAzLDYgKzEwMyw3IEBACiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgT1Igc3VjY2Vkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCWZvciAoaW50IGk9MDsgaSA8IHRlcm1zLmxlbmd0aDsgaSsrKQogCSAgICBpZiAodGVybXNbaV0ubWF0Y2gobXNnKSkKQEAgLTExMyw2ICsxMTQsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBPclRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjgsNiArMTMwLDcgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlIGEgaGFzaENvZGUgZm9yIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJaW50IGhhc2ggPSAwOwogCWZvciAoaW50IGk9MDsgaSA8IHRlcm1zLmxlbmd0aDsgaSsrKQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1JlY2VpdmVkRGF0ZVRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9SZWNlaXZlZERhdGVUZXJtLmphdmEKaW5kZXggZGVhNDVmMS4uYzY3NjA5MyAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1JlY2VpdmVkRGF0ZVRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvUmVjZWl2ZWREYXRlVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqCQkJcmVjZWl2ZWQgZGF0ZQogICAgICAqIEByZXR1cm4JCXRydWUgaWYgdGhlIGNvbXBhcmlzb24gc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKE1lc3NhZ2UgbXNnKSB7CiAJRGF0ZSBkOwogCkBAIC04OCw2ICs4OSw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlY2VpdmVkRGF0ZVRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvUmVjaXBpZW50U3RyaW5nVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1JlY2lwaWVudFN0cmluZ1Rlcm0uamF2YQppbmRleCAzZTgyMjBmLi5kNDY0YzAwIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvUmVjaXBpZW50U3RyaW5nVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9SZWNpcGllbnRTdHJpbmdUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC05Myw2ICs5Myw3IEBACiAgICAgICoJCSAgICAJYWRkcmVzcy4KICAgICAgKiBAcmV0dXJuICAgICAgICAgIHRydWUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlBZGRyZXNzW10gcmVjaXBpZW50czsKIApAQCAtMTE0LDYgKzExNSw3IEBACiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgY29tcGFyaXNvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlY2lwaWVudFN0cmluZ1Rlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjQsNiArMTI2LDcgQEAKICAgICAvKioKICAgICAgKiBDb21wdXRlIGEgaGFzaENvZGUgZm9yIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJcmV0dXJuIHR5cGUuaGFzaENvZGUoKSArIHN1cGVyLmhhc2hDb2RlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1JlY2lwaWVudFRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9SZWNpcGllbnRUZXJtLmphdmEKaW5kZXggNmNjMWY0My4uZGU0ZjU5OCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1JlY2lwaWVudFRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvUmVjaXBpZW50VGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtODcsNiArODcsNyBAQAogICAgICAqCQkJYWRkcmVzcwogICAgICAqIEByZXR1cm4JCXRydWUgaWYgdGhlIG1hdGNoIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXNzYWdlIG1zZykgewogCUFkZHJlc3NbXSByZWNpcGllbnRzOwogCkBAIC0xMDgsNiArMTA5LDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVjaXBpZW50VGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTExOCw2ICsxMjAsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gdHlwZS5oYXNoQ29kZSgpICsgc3VwZXIuaGFzaENvZGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2VhcmNoRXhjZXB0aW9uLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2VhcmNoRXhjZXB0aW9uLmphdmEKaW5kZXggNzllOTcwNy4uYzY3ODU2OSAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1NlYXJjaEV4Y2VwdGlvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TZWFyY2hFeGNlcHRpb24uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TZWFyY2hUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2VhcmNoVGVybS5qYXZhCmluZGV4IGY4YjQzNzMuLmU1NjliZDIgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TZWFyY2hUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1NlYXJjaFRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTMgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TZW50RGF0ZVRlcm0uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TZW50RGF0ZVRlcm0uamF2YQppbmRleCBlMjk4ZDA5Li40NzBiZGM1IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2VudERhdGVUZXJtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1NlbnREYXRlVGVybS5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqCQkJc2VudCBkYXRlCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlEYXRlIGQ7CiAKQEAgLTg4LDYgKzg5LDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgU2VudERhdGVUZXJtKSkKIAkgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1NpemVUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2l6ZVRlcm0uamF2YQppbmRleCA5YWFiNDZkLi5jM2FlMjFkIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2l6ZVRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU2l6ZVRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTY4LDYgKzY4LDcgQEAKICAgICAgKiBAcGFyYW0gbXNnCXRoZSBzaXplIGNvbXBhcmF0b3IgaXMgYXBwbGllZCB0byB0aGlzIE1lc3NhZ2UncyBzaXplCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgc2l6ZSBpcyBlcXVhbCwgb3RoZXJ3aXNlIGZhbHNlIAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKE1lc3NhZ2UgbXNnKSB7CiAJaW50IHNpemU7CiAKQEAgLTg2LDYgKzg3LDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgU2l6ZVRlcm0pKQogCSAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU3RyaW5nVGVybS5qYXZhIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1N0cmluZ1Rlcm0uamF2YQppbmRleCBjNDg5Yjc3Li5hYjJmZGY0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU3RyaW5nVGVybS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9TdHJpbmdUZXJtLmphdmEKQEAgLTEsMTkgKzEsMTkgQEAKIC8qCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgogICoKLSAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDEzIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxNyBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VCiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbiBEZXZlbG9wbWVudAogICogYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAqIG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IGNhbgogICogb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICogb3IgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYworICogaHR0cHM6Ly9vc3Mub3JhY2xlLmNvbS9saWNlbnNlcy9DRERMK0dQTC0xLjEKKyAqIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAqIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICogV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4KKyAqIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdCBMSUNFTlNFLnR4dC4KICAqCiAgKiBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKICAqIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiCkBAIC0xMTgsNiArMTE4LDcgQEAKICAgICAvKioKICAgICAgKiBFcXVhbGl0eSBjb21wYXJpc29uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJaWYgKCEob2JqIGluc3RhbmNlb2YgU3RyaW5nVGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKQEAgLTEzMyw2ICsxMzQsNyBAQAogICAgIC8qKgogICAgICAqIENvbXB1dGUgYSBoYXNoQ29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAlyZXR1cm4gaWdub3JlQ2FzZSA/IHBhdHRlcm4uaGFzaENvZGUoKSA6IH5wYXR0ZXJuLmhhc2hDb2RlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvc2VhcmNoL1N1YmplY3RUZXJtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU3ViamVjdFRlcm0uamF2YQppbmRleCAyMzhmNjRjLi5iMjQ3M2Q0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU3ViamVjdFRlcm0uamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvU3ViamVjdFRlcm0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTcxLDYgKzcxLDcgQEAKICAgICAgKgkJCXN1YmplY3QgaGVhZGVyCiAgICAgICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goTWVzc2FnZSBtc2cpIHsKIAlTdHJpbmcgc3ViajsKIApAQCAtODksNiArOTAsNyBAQAogICAgIC8qKgogICAgICAqIEVxdWFsaXR5IGNvbXBhcmlzb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAlpZiAoIShvYmogaW5zdGFuY2VvZiBTdWJqZWN0VGVybSkpCiAJICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9wYWNrYWdlLmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC9zZWFyY2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBlYTI4Li4wMDAwMDAwCi0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKLSAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0KLSAgICBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAgICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICAgIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQotICAgIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLSAgICBNb2RpZmljYXRpb25zOgotICAgIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gICAgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgIENvbnRyaWJ1dG9yKHMpOgotICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgotICAgIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gICAgZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gICAgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQotICAgIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAgICBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAgICBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKLSAgICBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gICAgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAgICBob2xkZXIuCi0KLS0tPgotCi08L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLU1lc3NhZ2Ugc2VhcmNoIHRlcm1zIGZvciB0aGUgSmF2YU1haWwgQVBJLgotVGhpcyBwYWNrYWdlIGRlZmluZXMgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIHNlYXJjaAotZXhwcmVzc2lvbiB0byBzZWFyY2ggYSBmb2xkZXIgZm9yIG1lc3NhZ2VzIG1hdGNoaW5nIHRoZSBleHByZXNzaW9uOwotc2VlIHRoZSB7QGxpbmsgamF2YXgubWFpbC5Gb2xkZXIjc2VhcmNoIHNlYXJjaH0gbWV0aG9kIG9uCi17QGxpbmsgamF2YXgubWFpbC5Gb2xkZXIgamF2YXgubWFpbC5Gb2xkZXJ9LgotU2VlIHtAbGluayBqYXZheC5tYWlsLnNlYXJjaC5TZWFyY2hUZXJtIFNlYXJjaFRlcm19LgotPFA+Ci1Ob3RlIHRoYXQgdGhlIGV4YWN0IHNlYXJjaCBjYXBhYmlsaXRpZXMgZGVwZW5kIG9uIHRoZSBwcm90b2NvbCwKLXByb3ZpZGVyLCBhbmQgc2VydmVyIGluIHVzZS4gIEZvciB0aGUgUE9QMyBwcm90b2NvbCwgYWxsIHNlYXJjaGluZyBpcwotZG9uZSBvbiB0aGUgY2xpZW50IHNpZGUgdXNpbmcgdGhlIEphdmFNYWlsIGNsYXNzZXMuICBGb3IgSU1BUCwgYWxsCi1zZWFyY2hpbmcgaXMgZG9uZSBvbiB0aGUgc2VydmVyIHNpZGUgYW5kIGlzIGxpbWl0ZWQgYnkgdGhlIHNlYXJjaAotY2FwYWJpbGl0aWVzIG9mIHRoZSBJTUFQIHByb3RvY29sIGFuZCB0aGUgSU1BUCBzZXJ2ZXIgYmVpbmcgdXNlZC4KLUZvciBleGFtcGxlLCBJTUFQIGRhdGUgYmFzZWQgc2VhcmNoZXMgaGF2ZSBvbmx5IGRheSBncmFudWxhcml0eS4KLTxQPgotSW4gZ2VuZXJhbCwgYWxsIG9mIHRoZSBzdHJpbmcgcGF0dGVybnMgc3VwcG9ydGVkIGJ5IHNlYXJjaCB0ZXJtcyBhcmUKLWp1c3Qgc2ltcGxlIHN0cmluZ3M7IG5vIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvdXRpbC9CeXRlQXJyYXlEYXRhU291cmNlLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQppbmRleCAwYjI1ZmU4Li4xMzQyNTQwIDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQorKysgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL0J5dGVBcnJheURhdGFTb3VyY2UuamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTEgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE1MSw2ICsxNTEsNyBAQAogICAgICAqIEByZXR1cm4JCXRoZSBJbnB1dFN0cmVhbQogICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JaWYgbm8gZGF0YSBoYXMgYmVlbiBzZXQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWlmIChkYXRhID09IG51bGwpCiAJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibm8gZGF0YSIpOwpAQCAtMTY2LDYgKzE2Nyw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCWFsd2F5cwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNhbm5vdCBkbyB0aGlzIik7CiAgICAgfQpAQCAtMTc1LDYgKzE3Nyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuCXRoZSBNSU1FIHR5cGUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CkBAIC0xODUsNiArMTg4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4JdGhlIG5hbWUgb2YgdGhpcyBkYXRhCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL1NoYXJlZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL1NoYXJlZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmEKaW5kZXggY2EwZjBhNi4uZjZjMDU2ZCAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvdXRpbC9TaGFyZWRCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3V0aWwvU2hhcmVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTAgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTg4LDYgKzg4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gIHRoZSBjdXJyZW50IHBvc2l0aW9uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgZ2V0UG9zaXRpb24oKSB7CiAJcmV0dXJuIHBvcyAtIHN0YXJ0OwogICAgIH0KQEAgLTEwNCw2ICsxMDUsNyBAQAogICAgICAqIEBwYXJhbQllbmQJdGhlIGVuZGluZyBwb3NpdGlvbiArIDEKICAgICAgKiBAcmV0dXJuCQl0aGUgbmV3IHN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdTdHJlYW0obG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKIAlpZiAoc3RhcnQgPCAwKQogCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydCA8IDAiKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3V0aWwvU2hhcmVkRmlsZUlucHV0U3RyZWFtLmphdmEgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvamF2YXgvbWFpbC91dGlsL1NoYXJlZEZpbGVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGZhNzVjNzQuLjkzZWNjODAgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3V0aWwvU2hhcmVkRmlsZUlucHV0U3RyZWFtLmphdmEKKysrIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvdXRpbC9TaGFyZWRGaWxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMSwxOSArMSwxOSBAQAogLyoKICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBIRUFERVIuCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgKiBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUgIkxpY2Vuc2UiKS4gIFlvdQogICogbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgY2FuCiAgKiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMXzFfMS5odG1sCi0gKiBvciBwYWNrYWdlci9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCisgKiBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICogb3IgTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYwogICogbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKiBXaGVuIGRpc3RyaWJ1dGluZyB0aGUgc29mdHdhcmUsIGluY2x1ZGUgdGhpcyBMaWNlbnNlIEhlYWRlciBOb3RpY2UgaW4gZWFjaAotICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LgorICogZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogICoKICAqIEdQTCBDbGFzc3BhdGggRXhjZXB0aW9uOgogICogT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKQEAgLTE0Myw2ICsxNDMsNyBAQAogCSAgICB9CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAkgICAgdHJ5IHsKIAkJaW4uY2xvc2UoKTsKQEAgLTI5Miw2ICsyOTMsNyBAQAogICAgICAqICAgICAgICAgICAgIHN0cmVhbSBpcyByZWFjaGVkLgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBlbnN1cmVPcGVuKCk7CiAJaWYgKHBvcyA+PSBjb3VudCkgewpAQCAtMzQ0LDYgKzM0Niw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgogICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pCiAJdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewpAQCAtMzcyLDYgKzM3NSw3IEBACiAgICAgICogQHJldHVybiAgICAgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZC4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGVuc3VyZU9wZW4oKTsKIAlpZiAobiA8PSAwKSB7CkBAIC00MDYsNiArNDEwLDcgQEAKICAgICAgKiAgICAgICAgICAgICBzdHJlYW0gd2l0aG91dCBibG9ja2luZy4KICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBlbnN1cmVPcGVuKCk7CiAJcmV0dXJuIChjb3VudCAtIHBvcykgKyBpbl9hdmFpbGFibGUoKTsKQEAgLTQyNCw2ICs0MjksNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHBvc2l0aW9uIGJlY29tZXMgaW52YWxpZC4KICAgICAgKiBAc2VlICAgICAjcmVzZXQoKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKIAltYXJrbGltaXQgPSByZWFkbGltaXQ7CiAJbWFya3BvcyA9IHBvczsKQEAgLTQ0Myw2ICs0NDksNyBAQAogICAgICAqICAgICAgICAgICAgICAgaWYgdGhlIG1hcmsgaGFzIGJlZW4gaW52YWxpZGF0ZWQuCiAgICAgICogQHNlZSAgICAgICAgI21hcmsoaW50KQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGVuc3VyZU9wZW4oKTsKIAlpZiAobWFya3BvcyA8IDApCkBAIC00NjEsNiArNDY4LDcgQEAKICAgICAgKiBAc2VlICAgICBqYXZhLmlvLklucHV0U3RyZWFtI21hcmsoaW50KQogICAgICAqIEBzZWUgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CiAJcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNDcxLDYgKzQ3OSw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDkyLDYgKzUwMSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuICB0aGUgY3VycmVudCBwb3NpdGlvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldFBvc2l0aW9uKCkgewogLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFBvc2l0aW9uOiBzdGFydCAiICsgc3RhcnQgKyAiIHBvcyAiICsgcG9zIAogLy8JKyAiIGJ1ZnBvcyAiICsgYnVmcG9zICsgIiA9ICIgKyAoYnVmcG9zICsgcG9zIC0gc3RhcnQpKTsKQEAgLTUxMiw2ICs1MjIsNyBAQAogICAgICAqIEBwYXJhbQllbmQJdGhlIGVuZGluZyBwb3NpdGlvbiArIDEKICAgICAgKiBAcmV0dXJuCQl0aGUgbmV3IHN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSW5wdXRTdHJlYW0gbmV3U3RyZWFtKGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CiAJaWYgKGluID09IG51bGwpCiAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CkBAIC01NDQsNiArNTU1LDcgQEAKICAgICAvKioKICAgICAgKiBGb3JjZSB0aGlzIHN0cmVhbSB0byBjbG9zZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogCXN1cGVyLmZpbmFsaXplKCk7CiAJY2xvc2UoKTsKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vamF2YS9qYXZheC9tYWlsL3V0aWwvcGFja2FnZS5odG1sIGIvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTFhYTEuLjAwMDAwMDAKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL2phdmF4L21haWwvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKLSAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0KLSAgICBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAgICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICAgIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQotICAgIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLSAgICBNb2RpZmljYXRpb25zOgotICAgIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gICAgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgIENvbnRyaWJ1dG9yKHMpOgotICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgotICAgIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gICAgZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gICAgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQotICAgIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAgICBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAgICBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKLSAgICBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gICAgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAgICBob2xkZXIuCi0KLS0tPgotCi08L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLUphdmFNYWlsIEFQSSB1dGlsaXR5IGNsYXNzZXMuCi1UaGlzIHBhY2thZ2Ugc3BlY2lmaWVzIHV0aWxpdHkgY2xhc3NlcyB0aGF0IGFyZSB1c2VmdWwgd2l0aAotb3RoZXIgSmF2YU1haWwgQVBJcy4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9qYXZhL292ZXJ2aWV3Lmh0bWwgYi9jdXJyZW50L3NyYy9tYWluL2phdmEvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2YjQyNS4uMDAwMDAwMAotLS0gYS9jdXJyZW50L3NyYy9tYWluL2phdmEvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPCEtLQotCi0gICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDE1IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQotICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50Ci0gICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKLSAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KLSAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKLSAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCi0KLSAgICBHUEwgQ2xhc3NwYXRoIEV4Y2VwdGlvbjoKLSAgICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgotICAgIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBPcmFjbGUgaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZQotICAgIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0KLSAgICBNb2RpZmljYXRpb25zOgotICAgIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzCi0gICAgZW5jbG9zZWQgYnkgYnJhY2tldHMgW10gcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgIlBvcnRpb25zIENvcHlyaWdodCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgIENvbnRyaWJ1dG9yKHMpOgotICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUgQ0RETCBvcgotICAgIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nICJbQ29udHJpYnV0b3JdCi0gICAgZWxlY3RzIHRvIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMCi0gICAgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdSBkb24ndCBpbmRpY2F0ZSBhIHNpbmdsZSBjaG9pY2Ugb2YgbGljZW5zZSwgYQotICAgIHJlY2lwaWVudCBoYXMgdGhlIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLSAgICBlaXRoZXIgdGhlIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8KLSAgICBpdHMgbGljZW5zZWVzIGFzIHByb3ZpZGVkIGFib3ZlLiAgSG93ZXZlciwgaWYgeW91IGFkZCBHUEwgVmVyc2lvbiAyIGNvZGUKLSAgICBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlIG9wdGlvbiBhcHBsaWVzCi0gICAgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2ggb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQKLSAgICBob2xkZXIuCi0KLS0tPgotCi08L0hFQUQ+Ci08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci0KLVRoZSBKYXZhTWFpbDxzdXA+PGZvbnQgc2l6ZT0iLTIiPlRNPC9mb250Pjwvc3VwPiBBUEkKLXByb3ZpZGVzIGNsYXNzZXMgdGhhdCBtb2RlbCBhIG1haWwgc3lzdGVtLgotVGhlIDxjb2RlPmphdmF4Lm1haWw8L2NvZGU+IHBhY2thZ2UgZGVmaW5lcyBjbGFzc2VzIHRoYXQgYXJlIGNvbW1vbiB0bwotYWxsIG1haWwgc3lzdGVtcy4KLVRoZSA8Y29kZT5qYXZheC5tYWlsLmludGVybmV0PC9jb2RlPiBwYWNrYWdlIGRlZmluZXMgY2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpYwotdG8gbWFpbCBzeXN0ZW1zIGJhc2VkIG9uIGludGVybmV0IHN0YW5kYXJkcyBzdWNoIGFzIE1JTUUsIFNNVFAsIFBPUDMsIGFuZCBJTUFQLgotVGhlIEphdmFNYWlsIEFQSSBpbmNsdWRlcyB0aGUgPGNvZGU+amF2YXgubWFpbDwvY29kZT4gcGFja2FnZSBhbmQgc3VicGFja2FnZXMuCi08UD4KLUZvciBhbiBvdmVydmlldyBvZiB0aGUgSmF2YU1haWwgQVBJLCByZWFkIHRoZQotPEEgSFJFRj0iaHR0cDovL2phdmFtYWlsLmphdmEubmV0L25vbmF2L2RvY3MvSmF2YU1haWwtMS41LnBkZiIgVEFSR0VUPSJfdG9wIj4KLUphdmFNYWlsIHNwZWNpZmljYXRpb248L0E+LgotPFA+Ci1UaGUgY29kZSB0byBzZW5kIGEgcGxhaW4gdGV4dCBtZXNzYWdlIGNhbiBiZSBhcyBzaW1wbGUgYXMgdGhlIGZvbGxvd2luZzoKLTxQUkU+Ci0gICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcHMucHV0KCJtYWlsLnNtdHAuaG9zdCIsICJteS1tYWlsLXNlcnZlciIpOwotICAgIFNlc3Npb24gc2Vzc2lvbiA9IFNlc3Npb24uZ2V0SW5zdGFuY2UocHJvcHMsIG51bGwpOwotCi0gICAgdHJ5IHsKLQlNaW1lTWVzc2FnZSBtc2cgPSBuZXcgTWltZU1lc3NhZ2Uoc2Vzc2lvbik7Ci0JbXNnLnNldEZyb20oIm1lQGV4YW1wbGUuY29tIik7Ci0JbXNnLnNldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlLlRPLAotCQkJICAieW91QGV4YW1wbGUuY29tIik7Ci0JbXNnLnNldFN1YmplY3QoIkphdmFNYWlsIGhlbGxvIHdvcmxkIGV4YW1wbGUiKTsKLQltc2cuc2V0U2VudERhdGUobmV3IERhdGUoKSk7Ci0JbXNnLnNldFRleHQoIkhlbGxvLCB3b3JsZCFcbiIpOwotCVRyYW5zcG9ydC5zZW5kKG1zZywgIm1lQGV4YW1wbGUuY29tIiwgIm15LXBhc3N3b3JkIik7Ci0gICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIG1leCkgewotCVN5c3RlbS5vdXQucHJpbnRsbigic2VuZCBmYWlsZWQsIGV4Y2VwdGlvbjogIiArIG1leCk7Ci0gICAgfQotPC9QUkU+Ci1UaGUgSmF2YU1haWwgZG93bmxvYWQgYnVuZGxlIGNvbnRhaW5zIG1hbnkgbW9yZSBjb21wbGV0ZSBleGFtcGxlcwotaW4gdGhlICJkZW1vIiBkaXJlY3RvcnkuCi08UD4KLURvbid0IGZvcmdldCB0byBzZWUgdGhlCi08QSBIUkVGPSJodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhbWFpbC9mYXEvIiBUQVJHRVQ9Il90b3AiPgotSmF2YU1haWwgQVBJIEZBUTwvQT4KLWZvciBhbnN3ZXJzIHRvIHRoZSBtb3N0IGNvbW1vbiBxdWVzdGlvbnMuCi1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YW1haWwvIiBUQVJHRVQ9Il90b3AiPgotSmF2YU1haWwgd2ViIHNpdGU8L0E+Ci1jb250YWlucyBtYW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzLgotPFA+Ci08QSBOQU1FPSJwcm9wZXJ0aWVzIj4KLTxIND5Qcm9wZXJ0aWVzPC9IND4KLTwvQT4KLVRoZSBKYXZhTWFpbCBBUEkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzdGFuZGFyZCBwcm9wZXJ0aWVzLAotd2hpY2ggbWF5IGJlIHNldCBpbiB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gb2JqZWN0LCBvciBpbiB0aGUKLTxjb2RlPlByb3BlcnRpZXM8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gb2JqZWN0LgotVGhlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBzZXQgYXMgc3RyaW5nczsgdGhlIFR5cGUgY29sdW1uIGRlc2NyaWJlcwotaG93IHRoZSBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuICBGb3IgZXhhbXBsZSwgdXNlCi08UFJFPgotCXByb3BzLnB1dCgibWFpbC5kZWJ1ZyIsICJ0cnVlIik7Ci08L1BSRT4KLXRvIHNldCB0aGUgPGNvZGU+bWFpbC5kZWJ1ZzwvY29kZT4gcHJvcGVydHksIHdoaWNoIGlzIG9mIHR5cGUgYm9vbGVhbi4KLTxQPgotPFRBQkxFIEJPUkRFUj4KLTxUUj4KLTxUSD5OYW1lPC9USD4KLTxUSD5UeXBlPC9USD4KLTxUSD5EZXNjcmlwdGlvbjwvVEg+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLmRlYnVnIj48L0E+Ci08VFIgaWQ9Im1haWwuZGVidWciPgotPFREPm1haWwuZGVidWc8L1REPgotPFREPmJvb2xlYW48L1REPgotPFREPgotVGhlIGluaXRpYWwgZGVidWcgbW9kZS4KLURlZmF1bHQgaXMgZmFsc2UuCi08L1REPgotPC9UUj4KLQotPEEgTkFNRT0ibWFpbC5mcm9tIj48L0E+Ci08VFIgaWQ9Im1haWwuZnJvbSI+Ci08VEQ+bWFpbC5mcm9tPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotVGhlIHJldHVybiBlbWFpbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHVzZXIsIHVzZWQgYnkgdGhlCi08Y29kZT5JbnRlcm5ldEFkZHJlc3M8L2NvZGU+IG1ldGhvZCA8Y29kZT5nZXRMb2NhbEFkZHJlc3M8L2NvZGU+LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwubWltZS5hZGRyZXNzLnN0cmljdCI+PC9BPgotPFRSIGlkPSJtYWlsLm1pbWUuYWRkcmVzcy5zdHJpY3QiPgotPFREPm1haWwubWltZS5hZGRyZXNzLnN0cmljdDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1UaGUgTWltZU1lc3NhZ2UgY2xhc3MgdXNlcyB0aGUgPGNvZGU+SW50ZXJuZXRBZGRyZXNzPC9jb2RlPiBtZXRob2QKLTxjb2RlPnBhcnNlSGVhZGVyPC9jb2RlPiB0byBwYXJzZSBoZWFkZXJzIGluIG1lc3NhZ2VzLiAgVGhpcyBwcm9wZXJ0eQotY29udHJvbHMgdGhlIHN0cmljdCBmbGFnIHBhc3NlZCB0byB0aGUgPGNvZGU+cGFyc2VIZWFkZXI8L2NvZGU+Ci1tZXRob2QuICBUaGUgZGVmYXVsdCBpcyB0cnVlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuaG9zdCI+PC9BPgotPFRSIGlkPSJtYWlsLmhvc3QiPgotPFREPm1haWwuaG9zdDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVRoZSBkZWZhdWx0IGhvc3QgbmFtZSBvZiB0aGUgbWFpbCBzZXJ2ZXIgZm9yIGJvdGggU3RvcmVzIGFuZCBUcmFuc3BvcnRzLgotVXNlZCBpZiB0aGUgPGNvZGU+bWFpbC48aT5wcm90b2NvbDwvaT4uaG9zdDwvY29kZT4gcHJvcGVydHkgaXNuJ3Qgc2V0LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuc3RvcmUucHJvdG9jb2wiPjwvQT4KLTxUUiBpZD0ibWFpbC5zdG9yZS5wcm90b2NvbCI+Ci08VEQ+bWFpbC5zdG9yZS5wcm90b2NvbDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgZGVmYXVsdCBtZXNzYWdlIGFjY2VzcyBwcm90b2NvbC4gIFRoZQotPGNvZGU+U2Vzc2lvbjwvY29kZT4gbWV0aG9kIDxjb2RlPmdldFN0b3JlKCk8L2NvZGU+IHJldHVybnMgYSBTdG9yZQotb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGlzIHByb3RvY29sLiAgQnkgZGVmYXVsdCB0aGUgZmlyc3QgU3RvcmUKLXByb3ZpZGVyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGlzIHJldHVybmVkLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwudHJhbnNwb3J0LnByb3RvY29sIj48L0E+Ci08VFIgaWQ9Im1haWwudHJhbnNwb3J0LnByb3RvY29sIj4KLTxURD5tYWlsLnRyYW5zcG9ydC5wcm90b2NvbDwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVNwZWNpZmllcyB0aGUgZGVmYXVsdCBtZXNzYWdlIHRyYW5zcG9ydCBwcm90b2NvbC4gIFRoZQotPGNvZGU+U2Vzc2lvbjwvY29kZT4gbWV0aG9kIDxjb2RlPmdldFRyYW5zcG9ydCgpPC9jb2RlPiByZXR1cm5zIGEgVHJhbnNwb3J0Ci1vYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wuICBCeSBkZWZhdWx0IHRoZSBmaXJzdCBUcmFuc3BvcnQKLXByb3ZpZGVyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGlzIHJldHVybmVkLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwudXNlciI+PC9BPgotPFRSIGlkPSJtYWlsLnVzZXIiPgotPFREPm1haWwudXNlcjwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLVRoZSBkZWZhdWx0IHVzZXIgbmFtZSB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBtYWlsIHNlcnZlci4KLVVzZWQgaWYgdGhlIDxjb2RlPm1haWwuPGk+cHJvdG9jb2w8L2k+LnVzZXI8L2NvZGU+IHByb3BlcnR5IGlzbid0IHNldC4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnByb3RvY29sLmNsYXNzIj48L0E+Ci08VFIgaWQ9Im1haWwucHJvdG9jb2wuY2xhc3MiPgotPFREPm1haWwuPGk+cHJvdG9jb2w8L2k+LmNsYXNzPC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgcHJvdmlkZXIgZm9yIHRoZQotc3BlY2lmaWVkIHByb3RvY29sLiAgVXNlZCBpbiBjYXNlcyB3aGVyZSBtb3JlIHRoYW4gb25lIHByb3ZpZGVyCi1mb3IgYSBnaXZlbiBwcm90b2NvbCBleGlzdHM7IHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotd2hpY2ggcHJvdmlkZXIgdG8gdXNlIGJ5IGRlZmF1bHQuICBUaGUgcHJvdmlkZXIgbXVzdCBzdGlsbCBiZSBsaXN0ZWQKLWluIGEgY29uZmlndXJhdGlvbiBmaWxlLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucHJvdG9jb2wuaG9zdCI+PC9BPgotPFRSIGlkPSJtYWlsLnByb3RvY29sLmhvc3QiPgotPFREPm1haWwuPGk+cHJvdG9jb2w8L2k+Lmhvc3Q8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgaG9zdCBuYW1lIG9mIHRoZSBtYWlsIHNlcnZlciBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLU92ZXJyaWRlcyB0aGUgPGNvZGU+bWFpbC5ob3N0PC9jb2RlPiBwcm9wZXJ0eS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnByb3RvY29sLnBvcnQiPjwvQT4KLTxUUiBpZD0ibWFpbC5wcm90b2NvbC5wb3J0Ij4KLTxURD5tYWlsLjxpPnByb3RvY29sPC9pPi5wb3J0PC9URD4KLTxURD5pbnQ8L1REPgotPFREPgotVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBtYWlsIHNlcnZlciBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLUlmIG5vdCBzcGVjaWZpZWQgdGhlIHByb3RvY29sJ3MgZGVmYXVsdCBwb3J0IG51bWJlciBpcyB1c2VkLgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwucHJvdG9jb2wudXNlciI+PC9BPgotPFRSIGlkPSJtYWlsLnByb3RvY29sLnVzZXIiPgotPFREPm1haWwuPGk+cHJvdG9jb2w8L2k+LnVzZXI8L1REPgotPFREPlN0cmluZzwvVEQ+Ci08VEQ+Ci1UaGUgdXNlciBuYW1lIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gbWFpbCBzZXJ2ZXJzCi11c2luZyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotT3ZlcnJpZGVzIHRoZSA8Y29kZT5tYWlsLnVzZXI8L2NvZGU+IHByb3BlcnR5LgotPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci0KLTxQPgotVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAoUkkpIG9mCi1KYXZhTWFpbCwgYnV0IGFyZSBub3QgY3VycmVudGx5IGEgcmVxdWlyZWQgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KLVRoZSBuYW1lcywgdHlwZXMsIGRlZmF1bHRzLCBhbmQgc2VtYW50aWNzIG9mIHRoZXNlIHByb3BlcnRpZXMgbWF5Ci1jaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzLgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPk5hbWU8L1RIPgotPFRIPlR5cGU8L1RIPgotPFRIPkRlc2NyaXB0aW9uPC9USD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuZGVidWcuYXV0aCI+PC9BPgotPFRSIGlkPSJtYWlsLmRlYnVnLmF1dGgiPgotPFREPm1haWwuZGVidWcuYXV0aDwvVEQ+Ci08VEQ+Ym9vbGVhbjwvVEQ+Ci08VEQ+Ci1JbmNsdWRlIHByb3RvY29sIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzIChpbmNsdWRpbmcgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMpCi1pbiB0aGUgZGVidWcgb3V0cHV0LgotRGVmYXVsdCBpcyBmYWxzZS4KLTwvVEQ+Ci08L1RSPgotCi08QSBOQU1FPSJtYWlsLnRyYW5zcG9ydC5wcm90b2NvbC5hZGRyZXNzLXR5cGUiPjwvQT4KLTxUUiBpZD0ibWFpbC50cmFuc3BvcnQucHJvdG9jb2wuYWRkcmVzcy10eXBlIj4KLTxURD5tYWlsLnRyYW5zcG9ydC5wcm90b2NvbC48aT5hZGRyZXNzLXR5cGU8L2k+PC9URD4KLTxURD5TdHJpbmc8L1REPgotPFREPgotU3BlY2lmaWVzIHRoZSBkZWZhdWx0IG1lc3NhZ2UgdHJhbnNwb3J0IHByb3RvY29sIGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgdHlwZS4KLVRoZSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBtZXRob2QgPGNvZGU+Z2V0VHJhbnNwb3J0KEFkZHJlc3MpPC9jb2RlPiByZXR1cm5zIGEKLVRyYW5zcG9ydCBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoaXMgcHJvdG9jb2wgd2hlbiB0aGUgYWRkcmVzcyBpcyBvZiB0aGUKLXNwZWNpZmllZCB0eXBlIChlLmcuLCAicmZjODIyIiBmb3Igc3RhbmRhcmQgaW50ZXJuZXQgYWRkcmVzc2VzKS4KLUJ5IGRlZmF1bHQgdGhlIGZpcnN0IFRyYW5zcG9ydCBjb25maWd1cmVkIGZvciB0aGF0IGFkZHJlc3MgdHlwZSBpcyB1c2VkLgotVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgdGhlCi17QGxpbmsgamF2YXgubWFpbC5UcmFuc3BvcnQjc2VuZCBzZW5kfSBtZXRob2Qgb2YgdGhlCi17QGxpbmsgamF2YXgubWFpbC5UcmFuc3BvcnQgVHJhbnNwb3J0fSBjbGFzcyBzbyB0aGF0IChmb3IgZXhhbXBsZSkgdGhlICJzbXRwcyIKLXByb3RvY29sIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgInNtdHAiIHByb3RvY29sIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5Ci08Y29kZT5tYWlsLnRyYW5zcG9ydC5wcm90b2NvbC5yZmM4MjI8L2NvZGU+IHRvIDxjb2RlPiJzbXRwcyI8L2NvZGU+LgotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuZXZlbnQuc2NvcGUiPjwvQT4KLTxUUiBpZD0ibWFpbC5ldmVudC5zY29wZSI+Ci08VEQ+bWFpbC5ldmVudC5zY29wZTwvVEQ+Ci08VEQ+U3RyaW5nPC9URD4KLTxURD4KLUNvbnRyb2xzIHRoZSBzY29wZSBvZiBldmVudHMuICAoU2VlIHRoZSBqYXZheC5tYWlsLmV2ZW50IHBhY2thZ2UuKQotQnkgZGVmYXVsdCwgYSBzZXBhcmF0ZSBldmVudCBxdWV1ZSBhbmQgdGhyZWFkIGlzIHVzZWQgZm9yIGV2ZW50cyBmb3IgZWFjaAotU3RvcmUsIFRyYW5zcG9ydCwgb3IgRm9sZGVyLgotSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gInNlc3Npb24iLCBhbGwgc3VjaCBldmVudHMgYXJlIHB1dCBpbiBhIHNpbmdsZQotZXZlbnQgcXVldWUgcHJvY2Vzc2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvICJhcHBsaWNhdGlvbiIsIGFsbCBzdWNoIGV2ZW50cyBhcmUgcHV0IGluIGEgc2luZ2xlCi1ldmVudCBxdWV1ZSBwcm9jZXNzZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGZvciB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4KLShBcHBsaWNhdGlvbnMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgY29udGV4dCBjbGFzcyBsb2FkZXIuKQotPC9URD4KLTwvVFI+Ci0KLTxBIE5BTUU9Im1haWwuZXZlbnQuZXhlY3V0b3IiPjwvQT4KLTxUUiBpZD0ibWFpbC5ldmVudC5leGVjdXRvciI+Ci08VEQ+bWFpbC5ldmVudC5leGVjdXRvcjwvVEQ+Ci08VEQ+amF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I8L1REPgotPFREPgotQnkgZGVmYXVsdCwgYSBuZXcgVGhyZWFkIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZXZlbnQgcXVldWUuCi1UaGlzIHRocmVhZCBpcyB1c2VkIHRvIGNhbGwgdGhlIGxpc3RlbmVycyBmb3IgdGhlc2UgZXZlbnRzLgotSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYW4gRXhlY3V0b3IsIHRoZQotRXhlY3V0b3IuZXhlY3V0ZSBtZXRob2QgaXMgdXNlZCB0byBydW4gdGhlIGV2ZW50IGRpc3BhdGNoZXIKLWZvciBhbiBldmVudCBxdWV1ZS4gIFRoZSBldmVudCBkaXNwYXRjaGVyIHJ1bnMgdW50aWwgdGhlCi1ldmVudCBxdWV1ZSBpcyBubyBsb25nZXIgaW4gdXNlLgotPC9URD4KLTwvVFI+Ci0KLTwvVEFCTEU+Ci0KLTxQPgotVGhlIEphdmFNYWlsIEFQSSBhbHNvIHN1cHBvcnRzIHNldmVyYWwgU3lzdGVtIHByb3BlcnRpZXM7Ci1zZWUgdGhlIHtAbGluayBqYXZheC5tYWlsLmludGVybmV0fSBwYWNrYWdlIGRvY3VtZW50YXRpb24KLWZvciBkZXRhaWxzLgotCi08UD4KLVRoZSBKYXZhTWFpbCByZWZlcmVuY2UKLWltcGxlbWVudGF0aW9uIGluY2x1ZGVzIHByb3RvY29sIHByb3ZpZGVycyBpbiBzdWJwYWNrYWdlcyBvZgotPGNvZGU+Y29tLnN1bi5tYWlsPC9jb2RlPi4gIE5vdGUgdGhhdCB0aGUgQVBJcyB0byB0aGVzZSBwcm90b2NvbAotcHJvdmlkZXJzIGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgSmF2YU1haWwgQVBJLiAgUG9ydGFibGUKLXByb2dyYW1zIHdpbGwgbm90IHVzZSB0aGVzZSBBUElzLgotPFA+Ci1Ob25wb3J0YWJsZSBwcm9ncmFtcyBtYXkgdXNlIHRoZSBBUElzIG9mIHRoZSBwcm90b2NvbCBwcm92aWRlcnMKLWJ5IChmb3IgZXhhbXBsZSkgY2FzdGluZyBhIHJldHVybmVkIDxjb2RlPkZvbGRlcjwvY29kZT4gb2JqZWN0IHRvIGEKLTxjb2RlPmNvbS5zdW4ubWFpbC5pbWFwLklNQVBGb2xkZXI8L2NvZGU+IG9iamVjdC4gIFNpbWlsYXJseSBmb3IKLTxjb2RlPlN0b3JlPC9jb2RlPiBhbmQgPGNvZGU+TWVzc2FnZTwvY29kZT4gb2JqZWN0cyByZXR1cm5lZCBmcm9tIHRoZQotc3RhbmRhcmQgSmF2YU1haWwgQVBJcy4KLTxQPgotVGhlIHByb3RvY29sIHByb3ZpZGVycyBhbHNvIHN1cHBvcnQgcHJvcGVydGllcyB0aGF0IGFyZSBzcGVjaWZpYyB0bwotdGhvc2UgcHJvdmlkZXJzLiAgVGhlIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCi17QGxpbmsgY29tLnN1bi5tYWlsLmltYXAgSU1BUH0sIHtAbGluayBjb20uc3VuLm1haWwucG9wMyBQT1AzfSwKLWFuZCB7QGxpbmsgY29tLnN1bi5tYWlsLnNtdHAgU01UUH0gcGFja2FnZXMgcHJvdmlkZSBkZXRhaWxzLgotPFA+Ci1JbiBhZGRpdGlvbiB0byBwcmludGluZyBkZWJ1Z2dpbmcgb3V0cHV0IGFzIGNvbnRyb2xsZWQgYnkgdGhlCi17QGxpbmsgamF2YXgubWFpbC5TZXNzaW9uIFNlc3Npb259IGNvbmZpZ3VyYXRpb24sIHRoZSBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbiBvZiBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBsb2cgdGhlIHNhbWUgaW5mb3JtYXRpb24gdXNpbmcKLXtAbGluayBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXJ9IGFzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgotPFA+Ci08VEFCTEUgQk9SREVSPgotPFRSPgotPFRIPkxvZ2dlciBOYW1lPC9USD4KLTxUSD5Mb2dnaW5nIExldmVsPC9USD4KLTxUSD5QdXJwb3NlPC9USD4KLTwvVFI+Ci0KLTxUUj4KLTxURD5qYXZheC5tYWlsPC9URD4KLTxURD5DT05GSUc8L1REPgotPFREPkNvbmZpZ3VyYXRpb24gb2YgdGhlIFNlc3Npb248L1REPgotPC9UUj4KLQotPFRSPgotPFREPmphdmF4Lm1haWw8L1REPgotPFREPkZJTkU8L1REPgotPFREPkdlbmVyYWwgZGVidWdnaW5nIG91dHB1dDwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAppbmRleCA0YWVhNTM3Li41YWQ2MmM0IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dAorKysgYi9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnR4dApAQCAtMSwyNjMgKzEsNzU5IEBACi1DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAorQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjEKIAogMS4gRGVmaW5pdGlvbnMuCiAKLSAgIDEuMS4gQ29udHJpYnV0b3IuIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgorICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvcgorICAgIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgogCi0gICAxLjIuIENvbnRyaWJ1dG9yIFZlcnNpb24uIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCisgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAorICAgIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kCisgICAgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCiAKLSAgIDEuMy4gQ292ZXJlZCBTb2Z0d2FyZS4gbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgorICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKQorICAgIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbAorICAgIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nCisgICAgcG9ydGlvbnMgdGhlcmVvZi4KIAotICAgMS40LiBFeGVjdXRhYmxlLiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgorICAgIDEuNC4gIkV4ZWN1dGFibGUiIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4KKyAgICBTb3VyY2UgQ29kZS4KIAotICAgMS41LiBJbml0aWFsIERldmVsb3Blci4gbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KKyAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QKKyAgICBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgogCi0gICAxLjYuIExhcmdlciBXb3JrLiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKyAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IKKyAgICBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KIAotICAgMS43LiBMaWNlbnNlLiBtZWFucyB0aGlzIGRvY3VtZW50LgorICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCiAKLSAgIDEuOC4gTGljZW5zYWJsZS4gbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCisgICAgMS44LiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0KKyAgICBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3IKKyAgICBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgogCi0gICAxLjkuIE1vZGlmaWNhdGlvbnMuIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mCisgICAgYW55IG9mIHRoZSBmb2xsb3dpbmc6CiAKLSAgICAgICAgQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zOworICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yCisgICAgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZQorICAgIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7CiAKLSAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKKyAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IKKyAgICBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCiAKLSAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlCisgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KIAotICAgMS4xMC4gT3JpZ2luYWwgU29mdHdhcmUuIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KKyAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtCisgICAgb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcworICAgIExpY2Vuc2UuCiAKLSAgIDEuMTEuIFBhdGVudCBDbGFpbXMuIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgorICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IKKyAgICBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywKKyAgICBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCiAKLSAgIDEuMTIuIFNvdXJjZSBDb2RlLiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KKyAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUKKyAgICBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkCisgICAgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KIAotICAgMS4xMy4gWW91LiAob3IgLllvdXIuKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsIC5Zb3UuIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAuY29udHJvbC4gbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eQorICAgIGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwKKyAgICB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaAorICAgIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yCisgICAgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0CisgICAgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwKKyAgICB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcCBvZiBtb3JlIHRoYW4KKyAgICBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbAorICAgIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KIAogMi4gTGljZW5zZSBHcmFudHMuCiAKLSAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgorICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgogCi0gICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QKKyAgICB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIKKyAgICBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgogCi0gICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKKyAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IKKyAgICB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLAorICAgIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwKKyAgICBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLAorICAgIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAogCi0gICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgorICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZyBvciBzZWxsaW5nIG9mCisgICAgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kCisgICAgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUKKyAgICAob3IgcG9ydGlvbnMgdGhlcmVvZikuCiAKLSAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorICAgIChjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uCisgICAgdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZQorICAgIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCisgICAgTGljZW5zZS4KIAotICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMikgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCisgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMKKyAgICBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcgorICAgICgyKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZQorICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUKKyAgICB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCiAKICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgogCi0gICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6CisgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdAorICAgIHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgogCi0gICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvcgorICAgIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LAorICAgIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMKKyAgICBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4KKyAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUKKyAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKIAotICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgorICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZworICAgIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4KKyAgICBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoCisgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vcgorICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yCisgICAgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieQorICAgIHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAorICAgIGNvbWJpbmF0aW9uKS4KIAotICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCisgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUKKyAgICBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlCisgICAgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KIAotICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgorICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzCisgICAgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlCisgICAgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkCisgICAgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbgorICAgIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUKKyAgICAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKQorICAgIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YKKyAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KIAogMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgogCi0gICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLSAgICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55IHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCiAKLSAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KLSAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCisgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUKKyAgICBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0KKyAgICBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMKKyAgICBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5CisgICAgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZQorICAgIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55IHN1Y2gKKyAgICBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2gKKyAgICBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvcgorICAgIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCiAKLSAgICAgIDMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLSAgICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCisgICAgMy4yLiBNb2RpZmljYXRpb25zLgogCi0gICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0gICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzLiByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgorICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUKKyAgICBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91CisgICAgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdQorICAgIGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCiAKLSAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi0gICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudC5zIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KKyAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCiAKLSAgICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgotICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCisgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0CisgICAgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90CisgICAgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQKKyAgICB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkKKyAgICBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlCisgICAgSW5pdGlhbCBEZXZlbG9wZXIuCisKKyAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluCisgICAgU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZgorICAgIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cycgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8KKyAgICBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IKKyAgICBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLgorICAgIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mCisgICAgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdAorICAgIGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yCisgICAgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlCisgICAgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueQorICAgIGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhCisgICAgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KKworICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCisKKyAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlcgorICAgIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyCisgICAgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsCisgICAgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCisgICAgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0bworICAgIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbQorICAgIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZQorICAgIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlCisgICAgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yCisgICAgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQKKyAgICBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbAorICAgIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KKworICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgorCisgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoCisgICAgb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZQorICAgIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZQorICAgIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZS4KIAogNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCiAKLSAgICAgIDQuMS4gTmV3IFZlcnNpb25zLgotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCisgICAgNC4xLiBOZXcgVmVyc2lvbnMuCiAKLSAgICAgIDQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLSAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCisgICAgT3JhY2xlIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IKKyAgICBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZQorICAgIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uCisgICAgNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5CisgICAgdGhpcyBMaWNlbnNlLgogCi0gICAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCisgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgorCisgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZQorICAgIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUKKyAgICBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZgorICAgIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUKKyAgICBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZQorICAgIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kCisgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uCisgICAgb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQKKyAgICBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvcgorICAgIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55CisgICAgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgorCisgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KKworICAgIFdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3CisgICAgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhCisgICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lIHRoZSBsaWNlbnNlIGFuZAorICAgIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8KKyAgICBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlCisgICAgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKKyAgICBMaWNlbnNlLgogCiA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgogCi0gICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAuQVMgSVMuIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgorICAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAorICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUKKyAgICBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgorICAgIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GCisgICAgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRQorICAgIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWQorICAgIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCisgICAgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTgorICAgIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTCisgICAgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KIAogNi4gVEVSTUlOQVRJT04uCiAKLSAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KKyAgICA2LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZQorICAgIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvCisgICAgY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLgorICAgIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUKKyAgICB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KIAotICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgLlBhcnRpY2lwYW50LikgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCisgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nCisgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhCisgICAgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91CisgICAgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikgYWxsZWdpbmcgdGhhdCB0aGUKKyAgICBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUKKyAgICBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUKKyAgICBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKKyAgICBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvcgorICAgIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlCisgICAgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIKKyAgICBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UKKyAgICBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZQorICAgIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwCisgICAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50CisgICAgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlciB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8KKyAgICBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCiAKLSAgICAgIDYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCisgICAgNi4zLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50CisgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgIGluZnJpbmdlcyBhbnkgcGF0ZW50IHdoZXJlIHN1Y2ggY2xhaW0gaXMgcmVzb2x2ZWQgKHN1Y2ggYXMgYnkKKyAgICBsaWNlbnNlIG9yIHNldHRsZW1lbnQpIHByaW9yIHRvIHRoZSBpbml0aWF0aW9uIG9mIHBhdGVudAorICAgIGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcworICAgIGdyYW50ZWQgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEgb3IgMi4yIHNoYWxsIGJlIHRha2VuCisgICAgaW50byBhY2NvdW50IGluIGRldGVybWluaW5nIHRoZSBhbW91bnQgb3IgdmFsdWUgb2YgYW55IHBheW1lbnQgb3IKKyAgICBsaWNlbnNlLgorCisgICAgNi40LiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMiBhYm92ZSwKKyAgICBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkKKyAgICBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcworICAgIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KIAogNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCiAKLSAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZLlMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KKyAgICBVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVAorICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFCisgICAgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GCisgICAgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRQorICAgIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IKKyAgICBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQKKyAgICBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUgorICAgIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUgorICAgIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UCisgICAgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSAorICAgIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNICisgICAgTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SCisgICAgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04KKyAgICBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KIAogOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KIAotICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAuY29tbWVyY2lhbCBpdGVtLC4gYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIC5jb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlLiAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuILogMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgLmNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbi4gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCisgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQKKyAgICBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwgY29tcHV0ZXIKKyAgICBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCnCisgICAgMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiIKKyAgICBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50CisgICAgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQKKyAgICAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlCisgICAgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMKKyAgICBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyCisgICAgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlcgorICAgIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KIAogOS4gTUlTQ0VMTEFORU9VUy4KIAotICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb24ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzLiBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgorICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0CisgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQorICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudAorICAgIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkKKyAgICB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4KKyAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksCisgICAgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3CisgICAgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QKKyAgICB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZAorICAgIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwKKyAgICB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQKKyAgICBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kIGV4cGVuc2VzLgorICAgIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yCisgICAgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IKKyAgICByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUKKyAgICBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UKKyAgICBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkCisgICAgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQgY29udHJvbAorICAgIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlCisgICAgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgogCiAxMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KIAotICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgorICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKKyAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksCisgICAgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8KKyAgICB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2gKKyAgICByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yCisgICAgc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCiAKLSAgIE5PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgVGhlIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUgc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhIENvdW50eSwgQ2FsaWZvcm5pYS4KK05PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OCitMSUNFTlNFIChDRERMKQorCitUaGUgY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKK1N0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueQorbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uCitvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZQorc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhCitDb3VudHksIENhbGlmb3JuaWEuCiAKIAotVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgSnVuZSAxOTkxCiAKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgSnVuZSAxOTkxCiAKLUNvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKK0NvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IKK0Jvc3RvbiwgTUEgMDIxMTAtMTMzNQorVVNBCiAKLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCiAKIFByZWFtYmxlCiAKLVRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0byB1c2luZyBpdC4gKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8geW91ciBwcm9ncmFtcywgdG9vLgorVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzCitpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8KK21ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZAordG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSBjYW4gYXBwbHkgaXQgdG8geW91ciBwcm9ncmFtcywgdG9vLgogCi1XaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCitXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLgorT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUKK2ZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcworc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KIAotVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KK1RvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lCit0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UKK3Jlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCiAKLUZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KK0ZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4KK1lvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4KK0FuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KIAotV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCiAKLUFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluIHRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KIAotRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4gV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbSBwcm9wcmlldGFyeS4gVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KK0ZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCitpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbQorcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0CitiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgogCi1UaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gZm9sbG93LgotCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KIAogVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCiAKLTAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKzAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYQorbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzCit0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucworZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcwordG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlcgordmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4KKyhIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtCisibW9kaWZpY2F0aW9uIi4pIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgogCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuIFRoZSBhY3Qgb2YgcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLiBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuIFRoZSBhY3Qgb2YgcnVubmluZwordGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMKK2NvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0KKyhpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLiBXaGV0aGVyIHRoYXQKK2lzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCiAKLTEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZQorY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseQorYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZQorYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvCit0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyCityZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KIAotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCiAKLTIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKzIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YKK2l0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZQorc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQKK3RoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKIAotICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KIAotICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQKKyAgICB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcworICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCiAKLSAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZQorICAgIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlIGEKKyAgICB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZQorICAgIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuCisgICAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dCBkb2VzIG5vdAorICAgIG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0KKyAgICBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKIAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuIElmIGlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbiB0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLCBhbmQKK2NhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkIG9uCit0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlIGVudGlyZQord2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCiAKLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCB5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgogCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtIHdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEKK3N0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlciB0aGUKK3Njb3BlIG9mIHRoaXMgTGljZW5zZS4KIAotMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CiszLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogCi0gICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEKKyAgICBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCiAKLSAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0CisgICAgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCiAKLSAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0bworICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZAorICAgIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUKKyAgICBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluCisgICAgYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKIAotVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UgY29kZQorbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAorY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gSG93ZXZlciwgYXMgYSBzcGVjaWFsCitleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcyB0aGUKK2V4ZWN1dGFibGUuCiAKLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90IGNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcwordG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5Cit0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UKK2NvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlCithbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KIAotNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCis0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBBbnkgYXR0ZW1wdCBvdGhlcndpc2UKK3RvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsCithdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMKK3dobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbAorbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4KK2Z1bGwgY29tcGxpYW5jZS4KIAotNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90IHNpZ25lZCBpdC4gSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nIHRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kIGFsbAoraXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nIHRoZQorUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KIAotNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0byB0aGlzIExpY2Vuc2UuCis2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMKK29uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdAorcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgogCi03LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50IGluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3Igb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdCBleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuIElmIHlvdSBjYW5ub3QgZGlzdHJpYnV0ZQorc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQKK2FueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdAorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudCBsaWNlbnNlIHdvdWxkCitub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvCityZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UKK2NvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbQorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgogCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KIAotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSBwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueSBzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuIE1hbnkgcGVvcGxlIGhhdmUgbWFkZSBnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0IGNob2ljZS4KK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQKK2J5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzCitjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdAorc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdCBzeXN0ZW07IGl0IGlzIHVwIHRvCit0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0byBkaXN0cmlidXRlCitzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0IGNob2ljZS4KIAotVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlCithIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KIAotOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4gY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCis4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heQorYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UKK2NvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzCitub3QgdGh1cyBleGNsdWRlZC4gSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZQorbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KIAotOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldwordmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5CitkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgogCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uCitudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KIAotMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUKK2F1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2UKK3NvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUKK3R3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUKK3NvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KIAogTk8gV0FSUkFOVFkKIAotMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRQorRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEgKK1lPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwKK05FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgogCi0xMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUgorREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNCisoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRAorSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRgorVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IKK09USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KIAogRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCiAKLQogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCiAKLUlmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QgcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KK0lmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgogCi1UbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCitUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvCithdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleQordGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCiAKLSAgIE9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgorICAgIE9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLgorICAgIENvcHlyaWdodCAoQykgPHllYXI+IDxuYW1lIG9mIGF1dGhvcj4KIAotICAgQ29weXJpZ2h0IChDKQorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSBVU0EKIAogQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCiAKLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CiAKLSAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgotICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLiBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUKKyAgICBgc2hvdyB3Jy4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZQorICAgIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KIAotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZQorYXBwcm9wcmlhdGUgcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzCit5b3UgdXNlIG1heSBiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5Citjb3VsZCBldmVuIGJlIG1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCiAKLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyIHNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4gSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKIAotICAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbSBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKyAgICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICAgIHByb2dyYW0gYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieQorICAgIEphbWVzIEhhY2tlci4KIAotICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQotICAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKyAgICBzaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5CisgICAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKIAotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgorVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMKK3dpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KIAorIwogCi0iQ0xBU1NQQVRIIiBFWENFUFRJT04gVE8gVEhFIEdQTCBWRVJTSU9OIDIKK0NlcnRhaW4gc291cmNlIGZpbGVzIGRpc3RyaWJ1dGVkIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIGFuZC9vciBpdHMKK2FmZmlsaWF0ZXMgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsCitleGNlcHRpb24gdG8gdGhlIEdQTHYyLCBiYXNlZCBvbiB0aGUgR05VIFByb2plY3QgZXhjZXB0aW9uIGZvciBpdHMKK0NsYXNzcGF0aCBsaWJyYXJpZXMsIGtub3duIGFzIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgYnV0IG9ubHkKK3doZXJlIE9yYWNsZSBoYXMgZXhwcmVzc2x5IGluY2x1ZGVkIGluIHRoZSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlJ3MKK2hlYWRlciB0aGUgd29yZHMgIk9yYWNsZSBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8KK3RoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUKK3RoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiIKIAotQ2VydGFpbiBzb3VyY2UgZmlsZXMgZGlzdHJpYnV0ZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgVmVyc2lvbiAyLCBidXQgb25seSB3aGVyZSBTdW4gaGFzIGV4cHJlc3NseSBpbmNsdWRlZCBpbiB0aGUgcGFydGljdWxhciBzb3VyY2UgZmlsZSdzIGhlYWRlciB0aGUgd29yZHMKK1lvdSBzaG91bGQgYWxzbyBub3RlIHRoYXQgT3JhY2xlIGluY2x1ZGVzIG11bHRpcGxlLCBpbmRlcGVuZGVudAorcHJvZ3JhbXMgaW4gdGhpcyBzb2Z0d2FyZSBwYWNrYWdlLiBTb21lIG9mIHRob3NlIHByb2dyYW1zIGFyZSBwcm92aWRlZAordW5kZXIgbGljZW5zZXMgZGVlbWVkIGluY29tcGF0aWJsZSB3aXRoIHRoZSBHUEx2MiBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiBhbmQgb3RoZXJzLiAgRm9yIGV4YW1wbGUsIHRoZSBwYWNrYWdlIGluY2x1ZGVzIHByb2dyYW1zCitsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiAgU3VjaCBwcm9ncmFtcyBhcmUKK2xpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGVpciBvcmlnaW5hbCBsaWNlbnNlcy4KIAotIlN1biBkZXNpZ25hdGVzIHRoaXMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZCBieSBTdW4gaW4gdGhlIExpY2Vuc2UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4iCitPcmFjbGUgZmFjaWxpdGF0ZXMgeW91ciBmdXJ0aGVyIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIHBhY2thZ2UgYnkgYWRkaW5nCit0aGUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiB0byB0aGUgbmVjZXNzYXJ5IHBhcnRzIG9mIGl0cyBHUEx2MiBjb2RlLCB3aGljaAorcGVybWl0cyB5b3UgdG8gdXNlIHRoYXQgY29kZSBpbiBjb21iaW5hdGlvbiB3aXRoIG90aGVyIGluZGVwZW5kZW50Cittb2R1bGVzIG5vdCBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIuICBIb3dldmVyLCBub3RlIHRoYXQgdGhpcyB3b3VsZAorbm90IHBlcm1pdCB5b3UgdG8gY29tbWluZ2xlIGNvZGUgdW5kZXIgYW4gaW5jb21wYXRpYmxlIGxpY2Vuc2Ugd2l0aAorT3JhY2xlJ3MgR1BMdjIgbGljZW5zZWQgY29kZSBieSwgZm9yIGV4YW1wbGUsIGN1dHRpbmcgYW5kIHBhc3Rpbmcgc3VjaAorY29kZSBpbnRvIGEgZmlsZSBhbHNvIGNvbnRhaW5pbmcgT3JhY2xlJ3MgR1BMdjIgbGljZW5zZWQgY29kZSBhbmQgdGhlbgorZGlzdHJpYnV0aW5nIHRoZSByZXN1bHQuICBBZGRpdGlvbmFsbHksIGlmIHlvdSB3ZXJlIHRvIHJlbW92ZSB0aGUKK0NsYXNzcGF0aCBFeGNlcHRpb24gZnJvbSBhbnkgb2YgdGhlIGZpbGVzIHRvIHdoaWNoIGl0IGFwcGxpZXMgYW5kCitkaXN0cmlidXRlIHRoZSByZXN1bHQsIHlvdSB3b3VsZCBsaWtlbHkgYmUgcmVxdWlyZWQgdG8gbGljZW5zZSBzb21lIG9yCithbGwgb2YgdGhlIG90aGVyIGNvZGUgaW4gdGhhdCBkaXN0cmlidXRpb24gdW5kZXIgdGhlIEdQTHYyIGFzIHdlbGwsIGFuZAorc2luY2UgdGhlIEdQTHYyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHNvbWUgaXRlbXMKK2luY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gYnkgT3JhY2xlLCByZW1vdmluZyB0aGUgQ2xhc3NwYXRoCitFeGNlcHRpb24gY291bGQgdGhlcmVmb3JlIGVmZmVjdGl2ZWx5IGNvbXByb21pc2UgeW91ciBhYmlsaXR5IHRvCitmdXJ0aGVyIGRpc3RyaWJ1dGUgdGhlIHBhY2thZ2UuCiAKLUxpbmtpbmcgdGhpcyBsaWJyYXJ5IHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBtb2R1bGVzIGlzIG1ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiBUaHVzLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCitQcm9jZWVkIHdpdGggY2F1dGlvbiBhbmQgd2UgcmVjb21tZW5kIHRoYXQgeW91IG9idGFpbiB0aGUgYWR2aWNlIG9mIGEKK2xhd3llciBza2lsbGVkIGluIG9wZW4gc291cmNlIG1hdHRlcnMgYmVmb3JlIHJlbW92aW5nIHRoZSBDbGFzc3BhdGgKK0V4Y2VwdGlvbiBvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGlzIHBhY2thZ2Ugd2hpY2ggbWF5CitzdWJzZXF1ZW50bHkgYmUgcmVkaXN0cmlidXRlZCBhbmQvb3IgaW52b2x2ZSB0aGUgdXNlIG9mIHRoaXJkIHBhcnR5Citzb2Z0d2FyZS4KIAotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlc2UgaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudCBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4/IEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4/IElmIHlvdSBtb2RpZnkgdGhpcyBsaWJyYXJ5LCB5b3UgbWF5IGV4dGVuZCB0aGlzIGV4Y2VwdGlvbiB0byB5b3VyIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gZG8gc28uPyBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQgZnJvbSB5b3VyIHZlcnNpb24uCitDTEFTU1BBVEggRVhDRVBUSU9OCitMaW5raW5nIHRoaXMgbGlicmFyeSBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcworbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgY292ZXIgdGhlIHdob2xlCitjb21iaW5hdGlvbi4KKworQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgbGlicmFyeSBnaXZlIHlvdQorcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBhbgorZXhlY3V0YWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUgbGljZW5zZSB0ZXJtcyBvZiB0aGVzZSBpbmRlcGVuZGVudAorbW9kdWxlcywgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyCit0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQKK2luZGVwZW5kZW50IG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQKK21vZHVsZS4gIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIG9yCitiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBJZiB5b3UgbW9kaWZ5IHRoaXMgbGlicmFyeSwgeW91IG1heSBleHRlbmQgdGhpcworZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0bworZG8gc28uICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gZG8gc28sIGRlbGV0ZSB0aGlzIGV4Y2VwdGlvbiBzdGF0ZW1lbnQKK2Zyb20geW91ciB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZ2Zwcm9iZS1wcm92aWRlci54bWwgYi9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9nZnByb2JlLXByb3ZpZGVyLnhtbAppbmRleCBiMzA0NTIxLi5iYTE0MjA5IDEwMDY0NAotLS0gYS9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9nZnByb2JlLXByb3ZpZGVyLnhtbAorKysgYi9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9nZnByb2JlLXByb3ZpZGVyLnhtbApAQCAtMywxOSArMywxOSBAQAogCiAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KIAotICAgIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDE3IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uIERldmVsb3BtZW50CiAgICAgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlICJMaWNlbnNlIikuICBZb3UKICAgICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAgICBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTF8xXzEuaHRtbAotICAgIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAgICBodHRwczovL29zcy5vcmFjbGUuY29tL2xpY2Vuc2VzL0NEREwrR1BMLTEuMQorICAgIG9yIExJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKICAgICBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIgTm90aWNlIGluIGVhY2gKLSAgICBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgICAgZmlsZSBhbmQgaW5jbHVkZSB0aGUgTGljZW5zZSBmaWxlIGF0IExJQ0VOU0UudHh0LgogCiAgICAgR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgICAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIKZGlmZiAtLWdpdCBhL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2phdmFtYWlsLmNoYXJzZXQubWFwIGIvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvamF2YW1haWwuY2hhcnNldC5tYXAKaW5kZXggZmNjNjkyZS4uY2M1OGQ0ZiAxMDA2NDQKLS0tIGEvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvamF2YW1haWwuY2hhcnNldC5tYXAKKysrIGIvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvamF2YW1haWwuY2hhcnNldC5tYXAKQEAgLTY1LDMgKzY1LDEzIEBACiAjIGluIEpESyAxLjEuNiB3ZSB3aWxsIG5vIGxvbmdlciBuZWVkIHRoZSAidXMtYXNjaWkiIGNvbnZlcnQKIHVzLWFzY2lpICAgICAgICBJU08tODg1OS0xCiB4LXVzLWFzY2lpICAgICAgSVNPLTg4NTktMQorCisjIENoaW5lc2UgY2hhcnNldHMgYXJlIGEgbWVzcyBhbmQgd2lkZWx5IG1pc3JlcHJlc2VudGVkLgorIyBnYjE4MDMwIGlzIGEgc3VwZXJzZXQgb2YgZ2JrLCB3aGljaCBpcyBhIHN1cHNlcnNldCBvZiBjcDkzNi9tczkzNiwKKyMgd2hpY2ggaXMgYSBzdXBlcnNldCBvZiBnYjIzMTIuCisjIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD00NDY3ODMKKyMgbWFwIGFsbCBvZiB0aGVzZSB0byBnYjE4MDMwLgorZ2IyMzEyCQlHQjE4MDMwCitjcDkzNgkJR0IxODAzMAorbXM5MzYJCUdCMTgwMzAKK2diawkJR0IxODAzMApkaWZmIC0tZ2l0IGEvY3VycmVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgubWFpbC5Qcm92aWRlciBiL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4Lm1haWwuUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4OGU1YQotLS0gL2Rldi9udWxsCisrKyBiL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4Lm1haWwuUHJvdmlkZXIKQEAgLTAsMCArMSw2IEBACitjb20uc3VuLm1haWwuaW1hcC5JTUFQUHJvdmlkZXIKK2NvbS5zdW4ubWFpbC5pbWFwLklNQVBTU0xQcm92aWRlcgorY29tLnN1bi5tYWlsLnNtdHAuU01UUFByb3ZpZGVyCitjb20uc3VuLm1haWwuc210cC5TTVRQU1NMUHJvdmlkZXIKK2NvbS5zdW4ubWFpbC5wb3AzLlBPUDNQcm92aWRlcgorY29tLnN1bi5tYWlsLnBvcDMuUE9QM1NTTFByb3ZpZGVyCmRpZmYgLS1naXQgYS9jdXJyZW50L3NyYy9tYWluL3Jlc291cmNlcy9qYXZheC9tYWlsL1ZlcnNpb24uamF2YSBiL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL2phdmF4L21haWwvVmVyc2lvbi5qYXZhCmluZGV4IDhhYzcwOTkuLjdkYzViMTEgMTAwNjQ0Ci0tLSBhL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL2phdmF4L21haWwvVmVyc2lvbi5qYXZhCisrKyBiL2N1cnJlbnQvc3JjL21haW4vcmVzb3VyY2VzL2phdmF4L21haWwvVmVyc2lvbi5qYXZhCkBAIC0xLDE5ICsxLDE5IEBACiAvKgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMTcgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVQogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIgb25seSAoIkdQTCIpIG9yIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQKICAqIGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSgiQ0RETCIpIChjb2xsZWN0aXZlbHksIHRoZSAiTGljZW5zZSIpLiAgWW91CiAgKiBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBjYW4KICAqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUExfMV8xLmh0bWwKLSAqIG9yIHBhY2thZ2VyL2xlZ2FsL0xJQ0VOU0UudHh0LiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMKKyAqIGh0dHBzOi8vb3NzLm9yYWNsZS5jb20vbGljZW5zZXMvQ0RETCtHUEwtMS4xCisgKiBvciBMSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljCiAgKiBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyIE5vdGljZSBpbiBlYWNoCi0gKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgcGFja2FnZXIvbGVnYWwvTElDRU5TRS50eHQuCisgKiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgTElDRU5TRS50eHQuCiAgKgogICogR1BMIENsYXNzcGF0aCBFeGNlcHRpb246CiAgKiBPcmFjbGUgZGVzaWduYXRlcyB0aGlzIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIgo=